//How an exception can be lost.
class VeryImportantException extends Exception {
private static final long serialVersionUID = 1L;
public String toString() {
return "A very important exception!";
}
}
class HoHumException extends Exception {
private static final long serialVersionUID = 1L;
public String toString() {
return "A trivial exception";
}
}
public class LostMessage {
void f() throws VeryImportantException {
throw new VeryImportantException();
}
void dispose() throws HoHumException {
throw new HoHumException();
}
public static void main(String[] args) {
try {
LostMessage lm = new LostMessage();
try {
lm.f();
} finally {
lm.dispose();
}
} catch (Exception e) {
System.out.println(e);
}
}
} /* Output:
A trivial exception
*///:~
上述代码运行后可以发现VeryImportantException被第二个异常覆盖掉了,这是一个致命的缺陷:关键信息丢失了
除了上面这种还有另一个更简单的隐藏异常的方法:finally中return
public class ExceptionSilencer {
public static void main(String[] args) {
try {
throw new RuntimeException();
} finally {
// Using ‘return’ inside the finally block
// will silence any thrown exception.
return;
}
}
} ///:~
本文探讨了Java中异常处理的两个常见陷阱:在finally块中抛出异常导致关键信息丢失,以及使用return语句沉默异常。通过具体代码示例,揭示了这些问题的严重性和解决思路。
365

被折叠的 条评论
为什么被折叠?



