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异常处理机制
    
      - JVM会在当前出现异常的方法中,查找异常表,是否有合适的处理者来处理
- 如果当前方法异常表不为空,并且异常符合处理者的from和to节点,并且type也匹配,则JVM调用位于target的调用者来处理。
- 如果上一条未找到合理的处理者,则继续查找异常表中的剩余条目
- 如果当前方法的异常表无法处理,则向上查找(弹栈处理)刚刚调用该方法的调用处,并重复上面的操作。
- 如果所有的栈帧被弹出,仍然没有处理,则抛给当前的Thread,Thread则会终止。
- 如果当前Thread为最后一个非守护线程,且未处理异常,则会导致JVM终止运行。
 
- try,- catch,- finally- 
      - 如果try代码块中发生异常, 则调用catch的代码块(如果是UnCheckedException, 则调用catch和finally代码块)
- 如果catch代码块中执行出现异常则执行finally代码块
- 如果try代码块正常执行, 则执行完后, 会调用finally代码块, 即使try中已执行return
 
- Android处理流程: RuntimeInit#commonInit在system_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 参考