• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android捕获崩溃异常,Android捕获崩溃

Android捕获崩溃异常,Android捕获崩溃

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android捕获全局异常,android 异常捕获,java捕获异常,捕获异常,抛出异常和捕获异常等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android捕获崩溃异常,Android捕获崩溃


开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。

那么今天主要讲一下如何去捕捉系统出现的Unchecked异常。何为Unchecked异常呢,换句话说就是指非受检异常,它不能用try-catch来显示捕捉。

我们先从Exception讲起。Exception分为两类:一种是CheckedException,一种是UncheckedException。这两种Exception的区别主要是CheckedException需要用try...catch...显示的捕获,而UncheckedException不需要捕获。通常UncheckedException又叫做RuntimeException。《effective java》指出:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException)。我们常见的RuntimeExcepiton有IllegalArgumentException、IllegalStateException、NullPointerException、IndexOutOfBoundsException等等。对于那些CheckedException就不胜枚举了,我们在编写程序过程中try...catch...捕捉的异常都是CheckedException。io包中的IOException及其子类,这些都是CheckedException。

一、使用UncaughtExceptionHandler来捕获unchecked异常

UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告。

直接上代码吧

复制代码
  1 import java.io.File;
  2 import java.io.FileOutputStream;
  3 import java.io.PrintWriter;
  4 import java.io.StringWriter;
  5 import java.io.Writer;
  6 import java.lang.Thread.UncaughtExceptionHandler;
  7 import java.lang.reflect.Field;
  8 import java.text.DateFormat;
  9 import java.text.SimpleDateFormat;
 10 import java.util.Date;
 11 import java.util.HashMap;
 12 import java.util.Locale;
 13 import java.util.Map;
 14 import java.util.Map.Entry;
 15 import java.util.regex.Matcher;
 16 import java.util.regex.Pattern;
 17 
 18 import android.annotation.SuppressLint;
 19 import android.content.Context;
 20 import android.content.pm.PackageInfo;
 21 import android.content.pm.PackageManager;
 22 import android.content.pm.PackageManager.NameNotFoundException;
 23 import android.os.Build;
 24 import android.os.Environment;
 25 import android.os.Looper;
 26 import android.util.Log;
 27 import android.widget.Toast;
 28 
 29 /**
 30  * UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
 31  * 
 32  * @author user
 33  * 
 34  */
 35 @SuppressLint("SdCardPath")
 36 public class CrashHandler implements UncaughtExceptionHandler {
 37 
 38     public static final String TAG = "TEST";
 39 
 40     // CrashHandler 实例
 41     private static CrashHandler INSTANCE = new CrashHandler();
 42 
 43     // 程序的 Context 对象
 44     private Context mContext;
 45 
 46     // 系统默认的 UncaughtException 处理类
 47     private Thread.UncaughtExceptionHandler mDefaultHandler;
 48 
 49     // 用来存储设备信息和异常信息
 50     private Map<String, String> infos = new HashMap<String, String>();
 51 
 52     // 用来显示Toast中的信息
 53     private static String error = "程序错误,额,不对,我应该说,服务器正在维护中,请稍后再试";
 54 
 55     private static final Map<String, String> regexMap = new HashMap<String, String>();
 56 
 57     // 用于格式化日期,作为日志文件名的一部分
 58     private DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss",
 59             Locale.CHINA);
 60 
 61     /** 保证只有一个 CrashHandler 实例 */
 62     private CrashHandler() {
 63         //
 64     }
 65 
 66     /** 获取 CrashHandler 实例 ,单例模式 */
 67     public static CrashHandler getInstance() {
 68         initMap();
 69         return INSTANCE;
 70     }
 71 
 72     /**
 73      * 初始化
 74      * 
 75      * @param context
 76      */
 77     public void init(Context context) {
 78         mContext = context;
 79 
 80         // 获取系统默认的 UncaughtException 处理器
 81         mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
 82 
 83         // 设置该 CrashHandler 为程序的默认处理器
 84         Thread.setDefaultUncaughtExceptionHandler(this);
 85         Log.d("TEST", "Crash:init");
 86     }
 87 
 88     /**
 89      * 当 UncaughtException 发生时会转入该函数来处理
 90      */
 91     @Override
 92     public void uncaughtException(Thread thread, Throwable ex) {
 93         if (!handleException(ex) && mDefaultHandler != null) {
 94             // 如果用户没有处理则让系统默认的异常处理器来处理
 95             mDefaultHandler.uncaughtException(thread, ex);
 96             Log.d("TEST", "defalut");
 97         } else {
 98             try {
 99                 Thread.sleep(3000);
100             } catch (InterruptedException e) {
101                 Log.e(TAG, "error : ", e);
102             }
103             // 退出程序
104             android.os.Process.killProcess(android.os.Process.myPid());
105             // mDefaultHandler.uncaughtException(thread, ex);
106             System.exit(1);
107         }
108     }
109 
110     /**
111      * 自定义错误处理,收集错误信息,发送错误报告等操作均在此完成
112      * 
113      * @param ex
114      * @return true:如果处理了该异常信息;否则返回 false
115      */
116     private boolean handleException(Throwable ex) {
117         if (ex == null) {
118             return false;
119         }
120 
121         // 收集设备参数信息
122         // collectDeviceInfo(mContext);
123         // 保存日志文件
124         saveCrashInfo2File(ex);
125         // 使用 Toast 来显示异常信息
126         new Thread() {
127             @Override
128             public void run() {
129                 Looper.prepare();
130                 Toast.makeText(mContext, error, Toast.LENGTH_LONG).show();
131                 Looper.loop();
132             }
133         }.start();
134         return true;
135     }
136 
137     /**
138      * 收集设备参数信息
139      * 
140      * @param ctx
141      */
142     public void collectDeviceInfo(Context ctx) {
143         try {
144             PackageManager pm = ctx.getPackageManager();
145             PackageInfo pi = pm.getPackageInfo(ctx.getPackageName(),
146                     PackageManager.GET_ACTIVITIES);
147 
148             if (pi != null) {
149                 String versionName = pi.versionName == null ? "null"
150                         : pi.versionName;
151                 String versionCode = pi.versionCode + "";
152                 infos.put("versionName", versionName);
153                 infos.put("versionCode", versionCode);
154             }
155         } catch (NameNotFoundException e) {
156             Log.e(TAG, "an error occured when collect package info", e);
157         }
158 
159         Field[] fields = Build.class.getDeclaredFields();
160         for (Field field : fields) {
161             try {
162                 field.setAccessible(true);
163                 infos.put(field.getName(), field.get(null).toString());
164                 Log.d(TAG, field.getName() + " : " + field.get(null));
165             } catch (Exception e) {
166                 Log.e(TAG, "an error occured when collect crash info", e);
167             }
168         }
169     }
170 
171     /**
172      * 保存错误信息到文件中 *
173      * 
174      * @param ex
175      * @return 返回文件名称,便于将文件传送到服务器
176      */
177     private String saveCrashInfo2File(Throwable ex) {
178         StringBuffer sb = getTraceInfo(ex);
179         Writer writer = new StringWriter();
180         PrintWriter printWriter = new PrintWriter(writer);
181         ex.printStackTrace(printWriter);
182         Throwable cause = ex.getCause();
183         while (cause != null) {
184             cause.printStackTrace(printWriter);
185             cause = cause.getCause();
186         }
187         printWriter.close();
188 
189         Strin



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android捕获崩溃异常,Android捕获崩溃

相关文章

  • 2017-05-26androd 获得wifi列表,androdwifi列表
  • 2017-05-26kvm性能优化
  • 2017-07-22Android 6.0 Phone"通话显示"查询流程
  • 2017-05-26Android入门——Drawable与对应的资源xml的应用
  • 2017-05-26小明学习Linux运维实战演练
  • 2017-05-26linux tcp GSO和TSO实现
  • 2017-05-26匿名社交3--消息评论,匿名社交3--
  • 2017-05-2614条Android Studio常用的的配置
  • 2017-05-26android 动画效果,android动画
  • 2017-05-26android下拉选择框spinner,android下拉spinner

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android Studio 2.0下创建jni应用调用本地C函数
    • Android系统的五种数据存储形式(一),android数据存储
    • 分布式协议Paxos学习笔记
    • Java时间间隔问题在Android中的使用,javaandroid
    • android 5.0后对于apk 跑32 64 的逻辑
    • 填坑实录 Android Studio 利用 ADB WIFI 插件实现真机无线调试,androidadb
    • Android--字符串和Drawable之间互相转化,android--drawable
    • Android新手入门2016(8)--ListView之ArrayAdapter
    • Android中ListView实现图文并列并且自定义分割线(完善仿微信APP),androidlistview
    • Android开发:14个解决实际问题的代码片段

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有