java 异常处理

avatar

一、检查性异常和非检查性异常

  1. 检查性异常: Java中所有不是RuntimeException派生的Exception都是检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。

  2. 非检查性异常: Java中所有RuntimeException的派生类都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。

  3. 主要区别在于其处理异常的方式:检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。

二、异常处理方式

  1. try…catch…(finally)

     public void method(){
         try {
             //可能出现异常的代码
         } catch (异常类型 ex) {
             // 对异常进行处理的代码段
             System.out.println("Got a Exception:" + e.getMessage());
             e.printStackTrace();
             ......
         } catch (.....) {
             ......
         }finally {
             ......
         }
    
         // 代码段
     }
    
    
    • 异常类Exception的getMessage方法用来获取一场的描述信息,printStackTrace方法用来打印异常的堆栈信息,通过堆栈信息能够查明异常发生的原因和位置,在调试的时候常用
    • 若没有发现异常 avatar
    • 异常类型没有匹配,相当于并没有处理异常 avatar
    • finally是可有可无,但一旦有finally,在这一块(try)结束前,一定会先执行finally里的语句,除非在return前exit(),finally不执行 avatar
    • 存在return的try-catch-finally块 avatar
    • 可存在多重catch块,发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句,因此要注意异常范围的大小关系
  2. throw
    • 有些问题需要程序员自行抛出异常,当异常为非检查性异常时可直接抛掷异常。 avatar
  3. throws avatar
    • 上图一般情况是系统自动抛出异常,也可手动抛掷异常,当异常为检查性异常时,必须按上述方法抛掷异常