我是Java新手并试图了解Java中的异常。
class MyException extends Exception {
void someMethod () {
doStuff();
}
void doStuff() throws MyException {
try {
throw new MyException();
}
catch(MyException me) {
throw me;
}
}
}
本程序给出错误:
java:3:未报告的异常MyException;必须被抓住或宣布被抛出
doStuff(); ^
try和catch块是在doStuff()
方法中编写的。此外doStuff()
方法“抛出”MyException
,那么为什么还需要在MyException
中抛出someMethod()
?
答案 0 :(得分:7)
你确实捕获了MyException,但你重新抛出它,所以需要捕获一个新的活动异常。
这称为已检查的异常。无论何时调用doStuff()方法,都需要将它包装在myException的try / catch中,或者你可以声明你的方法也会抛出MyException。
这保证了在编码过程中至少会考虑已知的异常。
答案 1 :(得分:3)
你需要从someMethod“重新抛出”异常,因为MyException是“ Checked Exception ”(不会扩展RuntimeException - 这是一个“未选中异常“)和编译器强制您处理Checked Exceptions,如下所示:
class MyException extends Exception {
/**
* @throws MyException because it is a checked Exception (doesn't extend RuntimeException) and the compiler
* forces you to handle Checked Exceptions.
*/
void someMethod() throws MyException {
doStuff();
}
void doStuff() throws MyException {
try {
throw new MyException();
} catch (MyException me) {
throw me;
}
}
}
或者您需要在某些方法中处理MyException,因此编译器很高兴,如下所示:
class MyException extends Exception {
void someMethod() {
try {
doStuff();
} catch (MyException ex) {
//Do Something useful with the Exception...
Logger.getLogger(MyException.class.getName()).severe("A Severe Exception Message");
}
}
void doStuff() throws MyException {
try {
throw new MyException();
} catch (MyException me) {
throw me;
}
}
}
答案 2 :(得分:2)
你在doStuff()方法体中的含义并不重要 - 因为你已声明它“抛出MyException”,那么调用方法 - 在本例中是someMethod() - 必须要么处理异常(通过try / catch块)或声明为自己抛出相同的异常。在后一种情况下,doStuff()抛出的异常将自动传播到someMethod()的调用者。
换句话说:你在doStuff()中捕获异常的事实并不重要,因为doStuff()被声明为抛出异常。你甚至可以删除doStuff()的方法体(使它什么都不做),你仍然需要在someMethod()中处理异常。
答案 3 :(得分:2)
因为doStuff()再次抛出异常。你将不得不再次尝试将其包裹起来。
void someMethod () {
try
{
doStuff();
}
catch ( MyException e )
{
e.printStackTrace();
}
}
或者另一种选择是不再抛出异常。每次抛出异常都必须抓住它。