有些人为了图方便,直接在代码引用的最外层放上一个try catch,以为可以捕获一切异常,降低崩溃率。 事实上,如果try的是新开启的一个线程,那么这个线程里面出现的异常是catch不到。也就是说在A线程中new B线程,B线程中出现的crash跟A线程无关,A也catch不到。
public class TheadExceptionTest {
public static void main(String[] args) {
try {
new Thread(new Runnable() {
@Override
public void run() {
int i = 1 / 0;
}
}).start();
} catch (Exception e) {
}
}
}
这样的try是不不到异常的。需要在Thread里面加上try catch。
public class TheadExceptionTest {
public static void main(String[] args) {
try {
new Thread(new Runnable() {
@Override
public void run() {
try {
int i = 1 / 0;
} catch (Exception e) {
System.out.println("cannot / by zero!!!");
}
}
}).start();
} catch (Exception e) {
}
}
}
在单独主线程中:
try {
Log.e("buder", "111");
int a = 10 / 0;
Log.e("buder", "222");
} catch (Exception e) {
Log.e("buder", "333");
} finally {
Log.e("buder", "444");
}
输出:
/**
* 05-29 17:02:41.319 8626-8626/com.example.test E/buder: 111
* 05-29 17:02:41.319 8626-8626/com.example.test E/buder: 333
* 05-29 17:02:41.319 8626-8626/com.example.test E/buder: 444
*/
在新建的线程中,和上面也是一样的输出:
new Thread(
new Runnable() {
@Override
public void run() {
try {
Log.e("buder", "111");
int a = 10 / 0;
Log.e("buder", "222");
} catch (Exception e) {
Log.e("buder", "333");
} finally {
Log.e("buder", "444");
}
}
}
).start();
/**
* 2020-05-29 14:49:41.495 14845-14887/com.example.test E/buder: 111
* 2020-05-29 14:49:41.495 14845-14887/com.example.test E/buder: 333
* 2020-05-29 14:49:41.495 14845-14887/com.example.test E/buder: 444
*/
在主线程中抛出异常,在子线程中是无法捕捉到的:
final Handler handler = new Handler(Looper.getMainLooper());
new Thread(
new Runnable() {
@Override
public void run() {
try {
Log.e("buder", "111");
handler.postDelayed(new Runnable() {
@Override
public void run() {
int a = 10 / 0;
}
}, 50);
Log.e("buder", "222");
} catch (Exception e) {
Log.e("buder", "333");
} finally {
Log.e("buder", "444");
}
}
}
).start();
/**
* 2020-05-29 14:56:57.619 15585-15609/com.example.test E/buder: 111
* 2020-05-29 14:56:57.619 15585-15609/com.example.test E/buder: 222
* 2020-05-29 14:56:57.619 15585-15609/com.example.test E/buder: 444
*/
只有在各个线程中自己try...catch才能完整捕捉到异常信息:
final Handler handler = new Handler(Looper.getMainLooper());
new Thread(
new Runnable() {
@Override
public void run() {
try {
Log.e("buder", "111");
handler.postDelayed(new Runnable() {
@Override
public void run() {
try {
Log.e("buder", "0.111");
int a = 10 / 0;
Log.e("buder", "0.222");
} catch (Exception e) {
Log.e("buder", "0.333");
} finally {
Log.e("buder", "0.444");
}
}
}, 50);
Log.e("buder", "222");
} catch (Exception e) {
Log.e("buder", "333");
} finally {
Log.e("buder", "444");
}
}
}
).start();
/**
* 2020-05-29 15:03:16.291 16114-16139/? E/buder: 111
* 2020-05-29 15:03:16.291 16114-16139/? E/buder: 222
* 2020-05-29 15:03:16.291 16114-16139/? E/buder: 444
* 2020-05-29 15:03:16.361 16114-16114/? E/buder: 0.111
* 2020-05-29 15:03:16.362 16114-16114/? E/buder: 0.333
* 2020-05-29 15:03:16.362 16114-16114/? E/buder: 0.444
*/