在正常的JVM进程中,子线程上的未处理异常不会导致主线程终止。例如,以下Java代码:
public class Main{
public static void main(String[] args){
Thread t = new Thread(new Runnable(){
@Override
public void run(){
try{
Thread.sleep(1000);
}catch(InterruptedException e){
}
throw new RuntimeException("BANG!");
}
});
t.start();
while(true){
System.out.println("Hello World");
try{
Thread.sleep(500);
}catch(InterruptedException e){
}
}
}
}
将打印如下内容:
Hello World
Hello World
Exception in thread "Thread-0" Hello World
java.lang.RuntimeException: BANG!
at Main$1.run(Main.java:11)
at java.lang.Thread.run(Thread.java:748)
Hello World
Hello World
Hello World
等
但是,在Android应用程序中,操作系统似乎在子线程上抛出未处理的异常时终止应用程序。例如,在以下代码中:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
throw new RuntimeException("BANG!");
}
});
thread.start();
}
}
操作系统将显示一个对话框,通知用户应用程序已停止,应用程序将关闭。
但是我发现这并不总是发生。有时会显示对话框,但应用程序未关闭。有谁知道在什么情况下子线程中未处理的异常将导致应用程序被杀死。