java裏有不少異常如:空指針異常,越界異常,數值轉換異常,除0異常,數據庫異常等等。若是本身沒有try / catch 那麼線程就崩潰。java
並不能對全部代碼都try/catch,若是代碼產生了未捕獲的異常,又不想讓程序崩潰,或者在崩潰以前要作一些收尾工做。怎麼辦?android
Thread.UncaughtExceptionHandler 類能夠解決這個問題,當有未捕獲異常時,它的 public void uncaughtException(Thread t, Throwable e) 方法會被調用,參數包含了崩潰的線程及相應的異常信息。數據庫
Thread類中的 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) 方法指定接收未捕獲異常處理類。一般在 Application 裏指定一個生命週期很長的未捕獲異常處理類。app
1 package com.example.uncrash; 2 3 import android.util.Log; 4 5 public class CrashHandler implements Thread.UncaughtExceptionHandler { 6 final String TAG = "CrashHandler"; 7 8 @Override 9 public void uncaughtException(Thread t, Throwable e) { 10 e.printStackTrace(); 11 Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId()); 12 if (t.getId() == 1){ 13 //... 14 } 15 //異常信息收集 16 17 //應用程序信息收集 18 19 //保存錯誤報告文件到文件。 20 } 21 }
1 public class UnCrashApplication extends Application { 2 3 CrashHandler handler; 4 5 @Override 6 public void onCreate() { 7 super.onCreate(); 8 9 handler = new CrashHandler(); 10 11 Thread.setDefaultUncaughtExceptionHandler(handler); 12 13 } 14 }
1 private void init(){ 2 3 new Thread(){ 4 @Override 5 public void run() { 6 setUncaughtExceptionHandler(crashHandler); 7 int num = 100 / 0; 8 } 9 }.start(); 10 } 11 public CrashHandler crashHandler = new CrashHandler(); 12 public class CrashHandler implements Thread.UncaughtExceptionHandler { 13 final String TAG = "CrashHandler"; 14 15 @Override 16 public void uncaughtException(Thread t, Throwable e) { 17 e.printStackTrace(); 18 Log.e(TAG, "uncaughtException: " + e.getMessage() + " thread = " + t.getId()); 19 if (t.getId() == 1){ 20 //... 21 } 22 //異常信息收集 23 //應用程序信息收集 24 //保存錯誤報告文件到文件。 25 } 26 }