饥人谷java体系课

try/catch/finally

如果没有try,异常将击穿所有的栈帧
catch可以将⼀个异常抓住
finally执⾏清理⼯作

JDK7+:try-with-resources

一些资源可以自动的被关闭清理,不需要finally

throw/throws

throw

throw new Exception
抛出一个异常,中断当前方法的执行,丢出去的异常会击穿所有栈帧直到能碰到一个可以catch这个异常的方法
如果所有的方法都没有catch住这个异常,异常会把当前线程杀掉

throws

声明会丢出一个异常

  1. //声明异常
  2. public static void c() throws Exception{
  3. if(true){
  4. //抛出异常
  5. throw new Exception;
  6. }
  7. }

可能会丢出异常但没有丢出
当方法声明了可能会丢出异常,调用这个方法的方法必须声明会丢出异常或者抓住处理这个异常

Throwable - 可以被抛出的东⻄(有毒)

所有异常和错误的父类,只有这个类或者其子类的对象才可以被抛出

栈轨迹 Stacktrace

排查问题的最重要的信息
e.printStackTrace
打印出异常信息
image.png

异常链(Caused by)

抓住异常后又丢出新的异常

Exception - checked execption(受检异常,有毒)

只要调用了声明异常的这个方法,就必须声明异常或捕获处理异常
代表⼀种预料之中的异常,IOException

RuntimeException (运⾏时异常,⽆毒,代表⼀种预料 之外的异常,因此不需要声明)

可以直接抛,不受检查

Error (错误,⽆毒)

catch的级联与合并

父类异常要写在子类异常之下
否则会直接根据父类异常捕捉
处理方法完全一样的异常可以写到一个catch里

异常抛出的原则

  1. 能⽤if/else处理的,不要使⽤异常

原因:

  • 无法保证catch到的异常就一定是你想要抓住的,你可能错误的catch到了更深处的异常。
  • 相比正常的if判断,异常的创建是非常昂贵的操作
  1. 尽早抛出异常
  2. 异常要准确、带有详细信息
  3. 抛出异常也⽐悄悄地执⾏错误的逻辑强的多
  4. 本⽅法是否有责任处理这个异常? 不要处理不归⾃⼰管的异常
  5. 本⽅法是否有能⼒处理这个异常? 如果⾃⼰⽆法处理,就抛出
  6. 如⾮万分必要,不要忽略异常

    jdk内置异常

    NullPointerException
    ClassNotFoundException/NoClassDefFoundError
    IllegalStateException
    IllegalArgumentException
    IllegalAccessException
    ClassCastException