Java:如果内部方法抛出错误,外部方法是否也应该抛出错误?

时间:2019-02-07 22:23:53

标签: java exception

public String testing() {
    caller.call();
}

Class Caller {
    public void call() throws Exception1 {

    }
}

也就是说,call()可以抛出Exception1,我是否也必须在testing()方法定义中添加相同的抛出?还是不需要?当我不抛出testing()方法定义时,在Intellij IDE中没有出现任何编译时错误。我应该不会出现编译时错误?

2 个答案:

答案 0 :(得分:1)

这意味着Exception1是他们称为未经检查的异常,这意味着其源自的方法不需要声明可以抛出该异常。许多常见的运行时错误都是未经检查的(例如,NullPointerException。)如果Exception1是它们称为已检查的异常,则将出现编译器错误-已检查的异常意味着必须在其中捕获任何一个该方法将其抛出,或者必须具有封闭的方法声明将其抛出。同时,没有什么可以阻止您声明某个方法抛出未经检查的异常,这是call()的编写者选择执行的操作。

所有异常的根是Throwable,未经检查。 Throwable有两个主要子类:Error,未经检查,及其所有后代;和Exception(已选中)。 Exception的所有后代均被检查为RuntimeException的异常。 Here is a good article illustrating what I've described.

在Java演变的岁月中,一直存在关于检查异常是好的安全功能还是令人讨厌的争论。一些程序员使许多异常不受检查,从而消除了异常处理的混乱,并在代码中的关键瓶颈处捕获了所有异常。其他程序员认为这很危险且不清楚,他们认为检查异常是一种自我记录的形式。您可以得出一个您感到满意的结论。这是an SO post about this debatehere is a good article on it

答案 1 :(得分:-1)

否,除非您希望将异常传递给外部函数的调用者,否则无需向外部函数添加throws关键字