Java 杂谈刻意练习:每天一张思维导图(IT类)Java

《Java编程的逻辑》笔记25--异常(下)/异常处理

2019-06-25  本文已影响10人  天一方蓝
异常(下).png

异常处理

try{
    //可能触发异常的代码
}catch(NumberFormatException e){
    System.out.println("not valid number");
}catch(RuntimeException e){
    System.out.println("runtime exception "+e.getMessage());
}catch(Exception e){
    e.printStackTrace();
}

catch可以有多条
异常处理机制将根据抛出的异常类型找第一个匹配的catch块,找到后, 执行catch块内的代码,其他catch块就不执行了,如果没有找到,会继续到上层方法中查找。需要注意的是,抛出的异常类型是catch中声明异常的子类也算匹配,所以需要将最具体的子类放在前面,如果基类Exception放在前面,则其他更具体的catch代码将得不到执行

try{
    //可能触发异常的代码
}catch(NumberFormatException e){
    System.out.println("not valid number");
    throw new AppException("输入格式不正确", e);
}catch(Exception e){
    e.printStackTrace();
    throw e;
}

为什么要重新抛出呢?
因为当前代码不能够完全处理该异常,需要调用者进一步处理
为什么要抛出一个新的异常呢?
当然是当前异常不太合适,不合适可能是信息不够,需要补充一些新信息,还可能是过于细节, 不便于调用者理解和使用,如果调用者对细节感兴趣,还可以继续通过getCause()获取到原始异常。

try{
    //可能抛出异常
}catch(Exception e){
    //捕获异常
}finally{
    //不管有无异常都执行
}

catch不是必需的
不管有无异常发生,都会执行
(1)如果没有异常发生,在try内的代码执行结束后执行。
(2)如果有异常发生且被catch捕获,在catch内的代码执行结束后执行
(3)如果有异常发生但没被捕获,则在异常被抛给上层之前执行。
一般用于释放资源,如数据库连接、文件流等

public void test() throws AppException, SQLException, NumberFormatException {
    //....
}

对于RuntimeException(unchecked exception),是不要求使用throws进行声明的,但对于checked exception,则必须进行声明,换句话说,如果没有声明,则不能抛出

一种普遍的说法是,RuntimeException(unchecked)表示编程的逻辑错误, 编程时应该检查以避免这些错误,比如说像空指针异常,如果真的出现了这些异常,程序退出也是正常的,程序员应该检查程序代码的bug而不是想办法处理这种异常。Checked exception表示程序本身没问题,但由于I/O、网络、数据库等其他不可预测的错误导致的异常,调用者应该进行适当处理。

无论是checked还是unchecked异常,无论是否出现在throws声明中,我们都应该在合适的地方以适当的方式进行处理
其实观点本身并不太重要,更重要的是项目中的一致性

如何使用异常

上一篇 下一篇

猜你喜欢

热点阅读