-
运行时异常。是
RuntimeException类及其子类的异常,是非受检异常,比如系统异常或者是程序逻辑异常,我们常遇到的有NullPointerException、IndexOutOfBoundsException等。遇到这种异常,Java Runtime会停止线程,打印异常,并且会停止程序运行,也就是我们常说的程序崩溃。 -
非运行时异常。是属于
Exception类及其子类,是受检异常,RuntimeException以外的异常。这类异常在程序中必须进行处理,如果不处理程序都无法正常编译,比如NoSuchFieldException,IllegalAccessException这种。
异常分类
-
运行时异常。是
RuntimeException类及其子类的异常,是非受检异常,比如系统异常或者是程序逻辑异常,我们常遇到的有NullPointerException、IndexOutOfBoundsException等。Java Runtime会停止线程,打印异常,并且会停止程序运行,程序崩溃。 -
非运行时异常。是属于
Exception类及其子类,是受检异常,RuntimeException以外的异常。这类异常在程序中必须进行处理,如果不处理程序都无法正常编译,比如NoSuchFieldException 编译期会排查
原理
线程下zygote进程在出初始化的时候会设置一个UncaughtHandler().这个方法会在子线程和主线程发生异常的时候捕获异常,从而处理异常逻辑。KillApplicationHandler()系统默认的异常处理器,这里处理的是子线程,主线程也会崩溃
子线程原理图
主线程原理handle机制,也是主线程不断轮训的逻辑,当主线程异常是后。用try catch捕获主线程,
activity声明周期方法中抛出了异常,则生 命周期就会不完整,会有其他异常
//定义 CrashHandler 处理子线程carsh
class CrashHandler : Thread.UncaughtExceptionHandler {
private var context: Context? = null
fun init(context: Context?) {
this.context = context
Thread.setDefaultUncaughtExceptionHandler(this)
}
override fun uncaughtException(t: Thread, e: Throwable) {}
companion object {
val instance: CrashHandler by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
CrashHandler() }
}
}
//application 的onCreate()方法初始化
CrashHandler.instance.init(this)
//主线程carsh 处理
Handler(Looper.getMainLooper()).post {
while (true) {
try {
Looper.loop()
} catch (e: Throwable) {
}
}
}
//在activity中点击按钮,主线程和子线程手写异常 不会崩溃。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(
view -> {
new Thread(new Runnable() {
@Override
public void run() {
int a=1/0;
}
}).start();
}
);
}