我觉得异常是编写的一个程序(流程)给jvm(运行平台)这个过程中产生问题的解决机制。这这个过程包括:1.错误产生来源,2.预先错误处理机制;3运行异常处理机制;4程序运行的本质;5.异常处理的成本;6.异常处理的应对等等方面;7我觉得异常处理就是程序运行出错了以后我们要给jvm一个处理方式,下一步程序要运行的点。
1.编译异常:语法异常
2.运行程序的Java虚拟机异常:内存溢出内存泄漏,
3.运行时异常:io异常,thread异常,运算异常,加载不到资源,数组越界,访问异常。
4.对于一些类型Java编译器在编写代码时就会帮我们进行自动检测,比如一些(文件,数据库,资源,网络等io 会有可能发生异常)因此在编码时就要求写上异常处理。
5.java 异常处理的性能消耗,通常Java代码编译时会根据性能优化,但是try-catch一段代码了以后就不能对这段代码进行优化了,因此try-catch时包括的块尽量小。throws一个exception通常会将一个调用栈内的内容进行回溯得到异常的发生点和调用栈信息因此开销也比较大。
7.异常类的继承结构如下图所示:
Throwable 类是 Java 异常类的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,它才是一个异常对象,才可以被抛出(throw)或者捕获(catch),才能被异常处理机制识别和处理。除了 JDK 中内建的常用异常类,还允许我们自定义异常。Throwable继承自object类。
1.throw异常抛出
2.try…catch…finally处理
3.程序内部没有捕获或者说jvm虚拟机不知道出异常后怎样处理,jvm虚拟机结束程序运行退出程序。
Thread.setDefaultUncaughtExceptionHandler()这个方法相当于所有线程的全局的错误异常捕获处理方法。这个方法为应用程序中所用运行的线程对象创建了一个通用的异常处理器。
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
ex.printStackTrace();
}
});
1.设计是全局的异常处理,Android中全局注册工具类一般在application中注册因此需要在application中初始化和注册这个异常捕获工具。
2.异常捕获工具采用单例方式实例化一个对象在内存中。通过在application中注册上下文context到static修饰的工具类中不会产生内存泄漏问题。
3.application传进去的上下文还可以注册 Application.ActivityLifecycleCallbacks()获取当前异常的activity。
4.通过上下文(Context)可以获取到SharedPreference或者sqlite等或者file等本地存储接口实现异常本地存储。
5.通过上下文(Context)可以获取到异常所发生的app的一些基本信息和手机的基本信息
6.通过上下文(Context)可以在发生异常后跳转到一个默认的异常显示页面,由于传经来的是application的context因此需要在intent中加一个Flag FLAG_ACTIVITY_NEW_TASK 这个flag不能返回结果。是非activity启动activity时必须加上的。
7.采用build配置的方式降需要设置的参数传进来,结构简单清晰。设置的参数有默认的错误后显示的界面上的返回按钮的返回activity,是否开启本地存储,设置错误提示和图标,后期可以加上什么方式上传错误日志等等。
1.设计的入口类CrashConfig (参数,build ,)
2.设计的错误捕获类CrashHandle (异常捕获类的注册,异常信息格式化,异常信息保存,开启defaultactivity)
3.设计的错误后默认显示类CrashDefaultActivity (异常显示,跳转按钮等等)