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 }