我有点困惑,因为我希望能够在Java中抛出自定义异常。要在函数内执行此操作,我必须将throws MyException
添加到函数的标题中。
然后任何调用该函数的东西必须添加throws MyException
或者有一个try-catch块。但为什么会这样呢?
例如,在java中创建一个Stack并调用pop函数时,我不必使用try-catch,但Java中的pop方法会抛出NoSuchElementException
(或者它是w / e )如果堆栈中没有元素。
答案 0 :(得分:4)
NoSuchElementException
是RuntimeException
(未经检查的异常),我们不需要处理或声明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.");
}
}