异常及异常的处理

一.异常
    1.典型的错误Error:出现error的是代码有比较大的问题,比如:
        方法递归调用,会发生栈内存溢出错误StackOverflowError
        OutOfMemoryError:不断的向堆内存中创建对象的时候
    2.Exception异常
        可以捕捉住,然后让程序继续运行下去
    Error和Exception有共同的父类Throwable
二.处理异常
    1.积极处理
        使用 try{
            可能出现异常的代码
        }catch(异常的类型){ 
            出现异常后需要执行的代码
        }
        注意:(1catch捕捉到的异常,他的类型要么是他本身的异常类型,要么是
        他父类的类型,不能是子类的类型
            (2)可以同时catch多个异常的类型,并且当catch多个异常类型的时候
        子类必须在父类的前面(范围广的在范围窄的后边)
            (3)一个catch语句中可以有多个平级的异常,可以用&&(并且)
        和||(或者)符号连接
    2.消极处理
            在出现异常的代码块的方法中用throws关键字抛出异常,注意:抛出的异常
        只能是他本身的异常,或者是他父类的异常,不能是子类的异常。
            如果要调用有异常的方法,调用者必须处理他所调用的方法中的异常,如果不处理,最终会传给jvm,之后程序的运行就结束了。
三.异常的行为分类
    ![分类图](https://img-blog.csdn.net/20180812142400615?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dvc2hpamluZmVpeGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    1.未检查异常
        RuntimeException或它的子类
        Error和它的子类
    2.检查异常
        Throwable
        Exception以及他们的子类
    注意:检查异常需要强制地配合try-catch或throws一起使用
四.主动抛出异常
    new throw 异常对象();
    注意:主动抛出的异常对象只能是Exception或是Error的子类对象
五.异常对象常见的方法
    getMessage():获取异常的信息
    printStackTrace()打印异常的跟踪信息
六.异常的传播
    以方法调用的反方向进行传播
七.自定义异常
        class MyException extends Exception{ // 检查异常
  }
      class MyException extends RuntimeException { // 未检查异常
  }
八.异常使用时要注意的一些问题
    1.不要吞掉异常:也就是,你在用try{可能产生的异常代码}catch(异常类型){出现异常时要执行的代码}语句块时,在出现异常时要执行的代码不能什么都不写。
    2.与有返回值的方法连用时:
        每一个catch语句块的代码区到要返回一个结果,我们可以返回一个自定义的值,用来提醒我们,比如:return -1; 或者用throw继续抛出这个异常
        public class Exception5 {
    public static int test(){
        try {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int r = 1/n;
            return r;
        } catch (Exception e ) {
            System.out.println(e.getMessage());
            return -1; 方法一
            throw e; 方法二
        }
    }

    public static void main(String[] args) {
        int r = test();
        System.out.println(r);
    }
}
    3.重写方法与异常声明
        当这个异常为检查异常时:a.子类的重写方法,不能抛出比父类更多的异常(子类的异常类型与父类的相等,或者是父类异常类型的子类,不能是父类异常类型的父类) 
        b.子类的重写方法也可以不抛出异常
        当这个异常为未检查异常的时候不用遵守以上的规定
    4.建议将检查异常包装成未检查异常重新抛出
九.finally
    1.语法格式
   try {
      ...
   } catch(Exception e) {

   } finally {

   }
    注意:finally语句块中的代码,无论是否发生异常,总是会执行
    如果try catch 以及finally都出现了return语句, 以finally中的return为准
如果tryreturn, 但finally中对返回的变量做了修改, 不会影响return的结果

猜你喜欢

转载自blog.csdn.net/woshijinfeixi/article/details/81606444