Java中的异常

Java异常的体系结构

image
根类Throwable,其子类Error和Excepion

Excepion分为运行时异常RuntimeException(也叫非检查型异常),和编译时Exception异常(也叫检查型异常)。编译时异常必须处理,而运行时异常可以不处理。
运行时异常可以不处理,但是程序运行时发生此异常就会报错
编译时异常必须处理,比如说语法错误,不处理就不能编译
处理异常的方式,try-catch-finally或者throws
throw和throws的区别
还有如何自定义异常

  • 当try catch finally中都有return语句时,finally中的return语句会覆盖前面的,也就是前面的return失效
  • 当try catch 中都有return语句时,看程序执行完try;还是说try块中发现了异常,执行到catch代码块中的return,然后存储该代码块中return语句中的值,等finally代码块执行完毕后再将return语句中的返回值进行返回。
  • 子类重写父类方法,方法抛出的异常类型不能大于父类被重写的方法,理由如下

class Fu{
    public void run() throws IOException {

    }
}

class Zi extends Fu{
    @Override
    public void run() throws Exception{//这里写法错的,只是演示

    }
}

class TestWhyCantBig{
    /**
     * 该类的构造方法传入的参数是Fu这个类
     * 然后在 testMethod 方法中调用了fu的run()方法,并且捕获这个方法抛出的异常
     * 如果传入的是Fu子类的对象,且该子类重写父类方法时,抛出的异常类型大于父类方法的类型。那么下面这个方法就不能捕获到子类方法的异常了
     * 逻辑有问题,所以不允许这样
     */
    private Fu fu;

    public TestWhyCantBig(Fu fu) {
        this.fu = fu;
    }

    public void testMethod(){
        try {
            fu.run();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
  • 子类重写父类的方法,方法的权限修饰符应该不小于父类被重写的方法
class Fu{
    void run() throws IOException {

    }
}

private class Zi extends Fu{ //这里private写法错的,只是演示
    @Override
    private void run() throws IOException{

    }
}
/**
如果说子类方法权限修饰符比父类小
根据多态,父类的引用指向子类的对象,那么此时下面的例子则无法调用z的run方法
**/

class TestWhyCantBig{

    public static void main(String[] args) {
        Fu z = new Zi();
        try {
            z.run();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    
}

@SneakyThrows

这个注解可以用在方法上面,它会将方法中要处理的异常自动转换成运行时异常,也可以理解成它会把代码块用 try-catch 包起来。

posted @ 2022-09-26 13:47  pzistart  阅读(206)  评论(0编辑  收藏  举报