异常概念和处理机制,try-catch-finally,throw和throws,自定义异常

异常处理概念和处理机制

异常概念和处理机制

什么是异常?

所谓异常就是指在程序运行的过程中发生的一些不正常事件。(如除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;
                    }
                }

            }
        });
    }

猜你喜欢

转载自blog.csdn.net/hpp_1225/article/details/85162768