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 参考