2

我有点困惑,因为我希望能够在 Java 中引发自定义异常。要在函数中执行此操作,我必须添加throws MyException到函数的标题中。

然后任何依次调用该函数的东西都必须添加throws MyException或有一个 try-catch 块。但这是为什么呢?

例如,当在 java 中创建一个 Stack 并调用 pop 函数时,我不必有一个 try-catch,但NoSuchElementException如果没有元素,Java 中的 pop 方法会抛出一个(或 w/e 它是)在堆栈上。

4

4 回答 4

4

NoSuchElementException是一个RuntimeException(未经检查的异常),我们不需要处理或声明RuntimeExceptionS,因此编译器不会抱怨,而是在运行时抛出它。

在检查异常的情况下,即所有不是 的子类型的异常,RuntimeException编译器将检查一个合适的catch子句,使程序能够在执行catch; 中的操作后继续其执行过程。为此,您需要使用try/catch块来处理它们或使用子句声明它们throws- 将处理异常的责任委托给调用链更高层。如果您的自定义异常不是已RuntimeException检查异常的规则,则也适用于您的自定义异常。

已检查的异常 ---> 由编译器强制处理或传播

未经检查的异常 ---> 编译器未检查因此出现在运行时

于 2012-12-23T08:04:18.943 回答
3

Java 有所谓的已检查异常和未检查异常。已检查的异常必须在方法签名中声明,未检查的异常不需要声明。

如果你想定义一个未经检查的异常,你自己从RuntimeExceptioninsted派生它Exception

于 2012-12-23T08:05:07.043 回答
0

您应该抛出或尝试捕获所有已检查的 Exceptions ,它不是必需的,RunTimeException并且您正在谈论的异常是 RuntimeException

于 2012-12-23T08:04:39.130 回答
0

请参阅我对这个问题的回答。

作为一般经验法则,在决定是否创建自定义异常类时,我会尝试尽可能多地使用内置异常类,如果这样做是有意义的,例如IllegalArgumentException,等等。

这是一个如何创建自定义的示例RuntimeException,正​​如您所发现的,它不需要try/catch/finally块或throws子句。

public class MyRuntimeException extends RuntimeException {
    public MyRuntimeException() {
        super();
    }

    public MyRuntimeException(String message) {
        super(message);
    }
}

public class MyClass {
    public void go(int val) {
        if(val <= 0) throw new MyRuntimeException("Val must be greater than 0.");
    }
}
于 2012-12-23T09:01:33.813 回答