2.9 Java异常

less than 1 minute read

2.9.1 异常捕获

  • Thread#setDefaultUncaughtExceptionHandler(), 类方法
  • Thread#setUncaughtExceptionHandler, 实例方法
  • 备注: 未try, catch的异常, 即uncaught的情况下, UncaughtExceptionHandler#uncaughtException()才能收到回调

2.9.2 异常处理流程

  • 异常表
    • 异常表包含一个或多个异常处理者(Exception Handler)的信息; 其中信息表包含: 1). from 可能发生异常的起始点; 2). to 可能发生异常的结束点; 3). target 上述from和to之前发生异常后的异常处理者的位置; 4). type 异常处理者处理的异常类信息
  • JVM异常处理机制
    1. JVM会在当前出现异常的方法中,查找异常表,是否有合适的处理者来处理
    2. 如果当前方法异常表不为空,并且异常符合处理者的from和to节点,并且type也匹配,则JVM调用位于target的调用者来处理。
    3. 如果上一条未找到合理的处理者,则继续查找异常表中的剩余条目
    4. 如果当前方法的异常表无法处理,则向上查找(弹栈处理)刚刚调用该方法的调用处,并重复上面的操作。
    5. 如果所有的栈帧被弹出,仍然没有处理,则抛给当前的Thread,Thread则会终止。
    6. 如果当前Thread为最后一个非守护线程,且未处理异常,则会导致JVM终止运行。
  • try, catch, finally
    • 如果try代码块中发生异常, 则调用catch的代码块(如果是UnCheckedException, 则调用catchfinally代码块)
    • 如果catch代码块中执行出现异常则执行finally代码块
    • 如果try代码块正常执行, 则执行完后, 会调用finally代码块, 即使try中已执行return
  • Android处理流程: RuntimeInit#commonInitsystem_server启动设置UncaughtHandler处理未捕获的异常
    • Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler()) -> UncaughtHandler#UncaughtHandler()
      • ActivityManagerNative#handleApplication(), 启动crash对话框, 等待处理完成
      • Process#killProcess()
      • System#exit(0)

2.9.3 异常类型

  • Checked Exception, 编译时异常, 这种异常需要调用处显式处理,要么使用try catch捕获,要么再次抛出去
  • UnChecked Exception, 所有RuntimeException及子类实例即UnChecked异常

2.9.4 异常堆栈获取

  • Thread#getStackTrace(), 通过Thread实例方法获得线程堆栈
  • Thread#getAllStackTrace(), 获得所有线程的堆栈, 返回Map<Thread, StackTraceElement[]>

2.9.5 参考