java 异常处理
一、检查性异常和非检查性异常
-
检查性异常: Java中所有
不是
RuntimeException派生的Exception都是
检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含throws语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明throws语句。 -
非检查性异常: Java中所有RuntimeException的
派生类
都是非检查型异常,与检查型异常相对抛出非检查型异常可以不在函数声明中添加throws语句,调用函数上也不需要强制处理。 -
主要区别在于其处理异常的方式:检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。
二、异常处理方式
- java异常处理主要通过5个关键字控制:try、catch、finally、throw、throws
-
try…catch…(finally)
public void method(){ try { //可能出现异常的代码 } catch (异常类型 ex) { // 对异常进行处理的代码段 System.out.println("Got a Exception:" + e.getMessage()); e.printStackTrace(); ...... } catch (.....) { ...... }finally { ...... } // 代码段 }
- 异常类Exception的getMessage方法用来获取一场的描述信息,printStackTrace方法用来打印异常的堆栈信息,通过堆栈信息能够查明异常发生的原因和位置,在调试的时候常用
- 若没有发现异常
- 异常类型没有匹配,相当于并没有处理异常
- finally是可有可无,但一旦有finally,在这一块(try)结束前,一定会先执行finally里的语句,除非在return前exit(),finally不执行
- 存在return的try-catch-finally块
- 可存在多重catch块,发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句,因此要注意异常范围的大小关系
- throw
- 有些问题需要程序员自行抛出异常,当异常为
非检查性异常
时可直接抛掷异常。
- 有些问题需要程序员自行抛出异常,当异常为
- throws
- 上图一般情况是系统自动抛出异常,也可手动抛掷异常,当异常为
检查性异常
时,必须按上述方法抛掷异常
- 上图一般情况是系统自动抛出异常,也可手动抛掷异常,当异常为