异常概念和处理机制
什么是异常?
所谓异常就是指在程序运行的过程中发生的一些不正常事件。(如除0溢出,数组下标越界,所要读取的文件不存在);
异常导致的后果?
Java程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,其将被提交给Java运行时系统,这个过程称为抛出异常,不处理的话会导致程序直接中断;
如何防止程序中断?
设计良好的程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果;
异常分类
异常类型 | 包括 | 来源 | 处理 |
受查异常 checkedException | Exception及其子类(不包括 RuntimeException 及其子类) | 由代码控制能力之外的因素导致额运行时错误 | 必须要处理,否则通不过编译 |
非受查异常 uncheckedException | Error和 RuntimeException 及其子类 | RuntimeException 一般代表编译错误 | 可以不用处理 |
Java的异常通过两种机制来处理
捕获:try-catch-finally
抛出:throw,throws
try-catch-finally
try{}语句块中放的是要检测的java代码,可能有会抛出异常,也可能会正常执行;
catch(异常类型){}块是当Java运行时系统接收到try块中所抛出的异常对象时,会寻找能处理这一异常的catch块来进行处理(可以有多个catch块);
finally{}块不管系统有没有抛出异常都会去执行,一般用来释放资源。除了在之前执行了System.exit(0);
throw和throws
throw用于手动抛出异常。作为程序员可以再任意位置手动抛出异常;
throws用于在方法上标识要暴露的异常。抛出的异常交由调用者处理;
两者区别:
- throw用在方法内,后面跟上要抛出的异常类对象;
- throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上要抛出的异常类名;
自定义异常
常见异常:
非受查异常RuntimeException
受查异常IOException,SQLException,ClassNotFoundException
自定义异常:Java提供的异常体系不可能预见所有希望加以报告的错误;
自定义异常类必须从已有的异常类继承:用的最多的是Exception;
建立新的异常类型最简单的方法就是让编译器产生默认构造方法;
对异常来说,最重要的部分就是它的类名;
//自定义异常
14 class AgeLessThanEighteenException extends Exception{
15 private String message;//描述异常信息
16 public AgeLessThanEighteenException(String message){
17 this.message=message;
18 }
19 //重写getMessage()方法
20 public String getMessage(){
21 return message;
22 }
23 }
记录一个防止APP因为异常而崩溃的方法:
在自定义的application类的oncreate方法里面添加这个方法,while(true)打开APP后只会进入一次,looper.loop()是一个死循环,能接收到主线程抛出的所有异常。
private void avoidCrash() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//主线程异常拦截
while (true) {
try {
//主线程异常从这里抛出
Looper.loop();
} catch (Throwable throwable) {
ToastUtil.toast(throwable.getMessage());
CrashLogUtil.saveLog(throwable.getMessage());
// throw throwable;
}
}
}
});
}