越是简单,越容易忽略。编码一切应该从简单开始,简单点,编码的方式简单点,正确点,对待异常的方式正确点。
Java异常类结构: Java异常类结构如下图。基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,NullPointerException继承RuntimeException,可以说,在Java中,除了Error之外,所有的异常类都直接或间接地继承自Exception。 Java异常分类:
① ,非运行时/编译时异常。在Java中,凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常,又称为编译时异常。
② ,运行时异常。Error和所有直接或间接地继承自RuntimeException的异常都是运行时异常,常见的有NullPointerException,IllegalArgumentException,IndexOutOfBoundsException等
Exception含义NullPointerException指针IllegalArgumentException非法参数IllegalStateException非法状态IndexOutOfBoundsException索引出界UnsupportedOperationException不支持的操作SQLException操作数据库异常ClassCastException数据类型转换异常NumberFormatException字符串转换数字异常ArithmeticException除数为0的异常BufferOverflowException缓冲区上溢异常BufferUnderflowException缓冲区下溢异常EmptyStackException空栈异常1, Java异常
在Java中出现未捕获异常,导致程序异常终止退出。即上面说到的Java Exception中的RuntimeException。
2, ANR(Application Not Responding)
应用与用户进行交互时,在一定时间(如主线程输入事件中为5秒)内没有响应用户的操作,则会引发ANR错误,并弹出一个系统提示框,让用户选择继续等待或立即关闭程序。同时会在/data/anr目录下生成一个traces.txt文件,记录系统产生ANR异常的堆栈和线程信息。
3, Native异常
Native异常/崩溃指在Native代码(C/C++)中,因访问非法地址,地址对齐等问题,或程序主动abort所产生相应的Signal导致程序异常退出。Linux中定义了很多Signal,当然并不是所有的Signal都会引发崩溃,一般会引发异常退出的Signal有SIGSEGV,SIGABRT,SIGILL,SIGBUS,SIGFPE等。Native异常具有与Java异常不同的特点:
程序会直接闪退到系统桌面。出错时不会弹出提示框提醒程序崩溃(Android5.0以下) 。1, 编译时异常
在编译阶段被处理的异常,编译器会强制程序处理所有的编译时异常,也就是用try…catch显式地捕获并处理。Java认为这类异常都是可以被处理/修复的,同时在Java API文档的方法说明中,都会添加是否throw某个exception,这个exception就是编译时异常。
2, 运行时异常
在运行时没有相应的try…catch处理该异常对象,所以Java运行环境将会终止,程序将推出。针对这类异常处理方法:
认为加try…catch。这是一种非常low,非常不可取的方法,因为如果所有代码都加try…catch,那么对代码真正问题所在,无法处理和解决该问题。当然这样做并不是不可取。个性化退出。我们可以在程序退出前,弹出一个个性化的对话框或者重启应用来代替Android系统默认强制退出应用程序。实现方式可以查阅资料,这里不做过多介绍。另外对于一些异常我们是可以做拦截操作的,比如空指针这类问题,如果出现了不让程序崩溃,但是这些方式本人建议尽量不要去做。因为程序中的异常本身可以看成是帮助我们查找问题,和提升程序的稳定性的,去掉或者中和掉得不偿失。