注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载)Android Thread.UncaughtExceptionHandler捕获  

2015-08-19 21:11:24|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这篇博客写得非常好,虽然博主说未经允许不可转载,但还是冒昧了,见猎心喜。

Android Thread.UncaughtExceptionHandler捕获

分类: Android Java 2012-11-08 12:03 7115人阅读 评论(10) 收藏 举报

http://blog.csdn.net/wangbole/article/details/8161524

Java 的异常处理机制中:

如果抛出的是Exception异常的话,必须有try..catch..进行处理,属于checked exception

如果抛出的是RuntimeException异常的话,则不是必须进行try..catch..异常处理,发生异常之后将由JVM进行处理,属于unchecked exception

注意:为了保证程序的健壮性,建议抛出RunntimeException异常,也使用try..catch..进行处理。

 

这两者最本质的区别在于设计者认为使用者是否能够并且应该处理这个异常。

 

Java 异常的分类:

基类为:Throwable

Error Exception 继承于Throwable

RuntimeExceptionIOException等继承Exception

其中,ErrorRuntimeException及其子类属于unchecked exception, 而其他异常为checked exception

 

 

Error类描述了Java运行系统中的内部错误以及资源耗尽的情形,应用程序不应该抛出这种类型的对象(一般是由Java虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在我们在程序设计时,应该更关注Exception体系。

 

RuntimeExcption体系,包括错误的类型转换,数组越界访问和试图访问空指针等等。如果出现RuntimeException,那么一定是你自己的错误。

 

其他非RuntimeExcetpionIOException等等),这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。

 

Android开发中,常常会出现uncheched Exception 导致程序的crash,为了提供良好的用户体验,并对出错的信息进行收集,以便对程序进行改进,提高程序的健壮性。因此,常使用Thread.UncaughtExceptionHandler来进行处理。

 

首先需要继承Thread.UncaughtExceptionHandler

[java] view plaincopyprint?

public class CrashHandler implements Thread.UncaughtExceptionHandler { 

    public static final String TAG = CrashHandler.class.getSimpleName(); 

    private static CrashHandler INSTANCE = new CrashHandler(); 

    private Context mContext; 

    private Thread.UncaughtExceptionHandler mDefaultHandler; 

 

 

    private CrashHandler() { 

    } 

 

 

    public static CrashHandler getInstance() { 

        return INSTANCE; 

    } 

 

 

    public void init(Context ctx) { 

        mContext = ctx; 

        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); 

        Thread.setDefaultUncaughtExceptionHandler(this); 

    } 

 

 

    @Override 

    public void uncaughtException(Thread thread, Throwable ex) { 

        // if (!handleException(ex) && mDefaultHandler != null) { 

        // mDefaultHandler.uncaughtException(thread, ex); 

        // } else { 

        // android.os.Process.killProcess(android.os.Process.myPid()); 

        // System.exit(10); 

        // } 

        System.out.println("uncaughtException"); 

 

 

        new Thread() { 

            @Override 

            public void run() {  

                Looper.prepare(); 

                new AlertDialog.Builder(mContext).setTitle("提示").setCancelable(false) 

                        .setMessage("程序崩溃了...").setNeutralButton("我知道了", new OnClickListener() { 

                            @Override 

                            public void onClick(DialogInterface dialog, int which) { 

                                System.exit(0); 

                            } 

                        }) 

                        .create().show(); 

                Looper.loop(); 

            } 

        }.start(); 

    } 

 

 

    /**

     * 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 开发者可以根据自己的情况来自定义异常处理逻辑

     * 

     * @param ex

     * @return true:如果处理了该异常信息;否则返回false

     */ 

    private boolean handleException(Throwable ex) { 

        if (ex == null) { 

            return true; 

        } 

        // new Handler(Looper.getMainLooper()).post(new Runnable() { 

        // @Override 

        // public void run() { 

        // new AlertDialog.Builder(mContext).setTitle("提示") 

        // .setMessage("程序崩溃了...").setNeutralButton("我知道了", null) 

        // .create().show(); 

        // } 

        // }); 

 

 

        return true; 

    } 

 

然后在Application类中进行注册

[java] view plaincopyprint?

public class MyApplication extends Application{ 

 

 

    @Override 

    public void onCreate(){ 

    super.onCreate(); 

        initErrorHandler(); 

    } 

 

 

   private void initErrorHandler(){ 

    CrashHandler handler = CrashHandler.getInstance(); 

    handler.init(this); 

   } 

}  

  评论这张
 
阅读(306)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017