饥人谷java体系课
try/catch/finally
如果没有try,异常将击穿所有的栈帧
catch可以将⼀个异常抓住
finally执⾏清理⼯作
JDK7+:try-with-resources
throw/throws
throw
throw new Exception
抛出一个异常,中断当前方法的执行,丢出去的异常会击穿所有栈帧直到能碰到一个可以catch这个异常的方法
如果所有的方法都没有catch住这个异常,异常会把当前线程杀掉
throws
声明会丢出一个异常
//声明异常
public static void c() throws Exception{
if(true){
//抛出异常
throw new Exception;
}
}
可能会丢出异常但没有丢出
当方法声明了可能会丢出异常,调用这个方法的方法必须声明会丢出异常或者抓住处理这个异常
Throwable - 可以被抛出的东⻄(有毒)
所有异常和错误的父类,只有这个类或者其子类的对象才可以被抛出
栈轨迹 Stacktrace
排查问题的最重要的信息
e.printStackTrace
打印出异常信息
异常链(Caused by)
Exception - checked execption(受检异常,有毒)
只要调用了声明异常的这个方法,就必须声明异常或捕获处理异常
代表⼀种预料之中的异常,IOException
RuntimeException (运⾏时异常,⽆毒,代表⼀种预料 之外的异常,因此不需要声明)
Error (错误,⽆毒)
catch的级联与合并
父类异常要写在子类异常之下
否则会直接根据父类异常捕捉
处理方法完全一样的异常可以写到一个catch里
异常抛出的原则
- 能⽤if/else处理的,不要使⽤异常
原因:
- 无法保证catch到的异常就一定是你想要抓住的,你可能错误的catch到了更深处的异常。
- 相比正常的if判断,异常的创建是非常昂贵的操作