java不同线程中的try...catch

有些人为了图方便,直接在代码引用的最外层放上一个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
 */

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/106429744