在Java中抛出自定义异常与内置异常

时间:2012-12-23 08:02:01

标签: java exception

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

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

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

4 个答案:

答案 0 :(得分:4)

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

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

  

已检查的例外情况--->由编译器强制处理或传播

     

未经检查的例外情况--->编译器未检查因此在运行时出现

答案 1 :(得分:3)

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

如果您想要定义未经检查的例外情况,请从RuntimeException Exception {{1}} {{1}}中获取。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

请参阅我对this问题的回答。

作为一般的经验法则,在决定是否创建自定义异常类时,我尝试尽可能多地使用内置异常类,这样做是有意义的,例如: 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.");
    }
}