Java异常知识点总结

1. 异常处理机制主要回答了三个问题: What,Where,Why

  • What:异常类型回答了什么被抛出

  • Where:异常堆栈跟踪回答了在哪抛出

  • Why:异常信息回答了为什么被抛出

2. Java异常体系

  • RuntimeException(运行时异常) : 不可预知的,程序应当自行避免;
  • (非RuntimeException)编译时异常 : 可预知的且编译器会做检查;

3. 从概念角度解析Java的异常处理机制

  • Error : 程序无法处理的系统错误,编译器不做检查;
  • Exception : 程序可以处理的异常,捕获后可能会被修复;
  • 总结 : 前者是程序无法处理的错误,后者是可以处理的异常;

4.从责任角度来看

  • Error属于JVM需要负担的责任

  • RuntimeException是程序应该负担的责任;

  • Checkd Exception可检查异常是Java编译器应该负担的责任

5. 常见Error以及Exception

  • RuntimeException(运行时异常)

    1. NullPointerException-空指针引用异常
    2. ClassCastException-类型强制转换异常
    3. IllegalArgumentException-传递非法参数异常
    4. IndexOutOfBoundsException-下标越界异常
    5. NumberFormatException-数字格式异常
  • 非RuntimeException(编译时异常)

    1. ClassNotFoundException-找不到指定class的异常
    2. IOException-IO操作异常
  • Error

    1. NoClassDefFoundError-找不到class定义的异常
    2. StackOverfloweError-深递归导致被耗尽而抛出的异常
    3. OutOfMemoryError-内存溢出异常

6. Java的异常处理机制

  • 抛出异常:创建异常对象,交由运行时系统处理
  • 捕获异常:寻找合适的异常处理器异常,否则终止运行

7. Java异常的处理原则

  • 具体明确:抛出的异常应能通过异常类名和message准确说明异常的类型和产生异常的原因;
  • 提早抛出:应尽可能早的发现并抛出异常,便于精确定位问题;
  • 延迟捕获:异常的捕获和处理应尽可能延迟,让掌握更多信息的作用域来处理异常。

8. 高效主流的异常处理框架

在用户看来,应用系统发生的所有异常都是应用系统内部的异常

  • 设计一个通用的继承自RuntimeException的异常来统一处理

  • 其余异常都统一转译为上诉异常AppException

  • 在Catch之后,抛出上述异常的子类,并提供足以定位的信息

  • 由前端接受AppException做统一处理

9. try-catch的性能

  1. try-catch代码块会影响JVM的优化;
  2. 异常对象实例需要保存栈快照信息,开销比较大;