java异常

异常类结构

异常体系

Throwable是异常体系的根,它继承自Object。

Throwable有两个体系:Error和Exception

  • Error表示严重的错误,程序对此一般无能为力
  • Exception则是运行时的错误,它可以被捕获并处理

Exception又分为两大类:

  • RuntimeException以及它的子类;
  • 非RuntimeException(包括IOException、ReflectiveOperationException等等)

Java规定:

必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,这种类型的异常称为Checked Exception。

不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。

捕获异常

1.捕获异常使用try...catch语句,把可能发生异常的代码放到try {...}中,然后使用catch捕获对应的Exception及其子类

2.在方法定义的时候,使用throws Xxx表示该方法可能抛出的异常类型。调用方在调用的时候,必须强制捕获这些异常,否则编译器会报错。

3.只要是方法声明的Checked Exception(必须捕获的异常),不在调用层捕获,也必须在更高的调用层捕获。所有未捕获的异常,最终也必须在main()方法中捕获,不会出现漏写try的情况。这是由编译器保证的。main()方法也是最后捕获Exception的机会。

PS:try...catch不会使程序中断,throw会中断程序

多catch语句

try...catch...catch...catch可以使用多个catch语句,每个catch分别捕获对应的Exception及其子类。JVM在捕获到异常后,会从上到下匹配catch语句,匹配到某个catch后,执行catch代码块,然后不再继续匹配。

简单地说就是:多个catch语句只有一个能被执行

存在多个catch的时候,catch的顺序非常重要:子类必须写在前面

finally语句

无论是否有异常发生,如果我们都希望执行一些语句

try...catch...finally....

异常的传播

当某个方法抛出了异常时,如果当前方法没有捕获异常,异常就会被抛到上层调用方法,直到遇到某个try ... catch被捕获为止

抛出异常

当发生错误时,例如,用户输入了非法的字符,我们就可以抛出异常。

如何抛出异常?参考Integer.parseInt()方法,抛出异常分两步:

  1. 创建某个Exception的实例;
  2. 用throw语句抛出。

自定义新的异常类型

在一个大型项目中,可以自定义新的异常类型,但是,保持一个合理的异常继承体系是非常重要的。

一个常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生:

public class BaseException extends RuntimeException { }

其他业务类型的异常就可以从BaseException派生:

public class UserNotFoundException extends BaseException { } 
public class LoginFailedException extends BaseException { } ...

自定义的BaseException应该提供多个构造方法:

public class BaseException extends RuntimeException { 
        public BaseException() { 
            super(); 
         } 
        public BaseException(String message, Throwable cause) { 
            super(message, cause);
         } 
        public BaseException(String message) {
            super(message);
         } 
        public BaseException(Throwable cause) { 
            super(cause); 
        }
 }

上述构造方法实际上都是原样照抄RuntimeException。这样,抛出异常的时候,就可以选择合适的构造方法。通过IDE可以根据父类快速生成子类的构造方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值