陷阱 - 忽略或挤压异常
这个例子是故意忽略或挤压异常。或者更确切地说,它是关于如何以忽略它的方式捕获和处理异常。但是,在我们描述如何执行此操作之前,我们应该首先指出压缩异常通常不是处理它们的正确方法。
通常会抛出异常(通过某些东西)来通知程序的其他部分发生了一些重要(即异常)事件。通常(尽管不总是)异常意味着出了问题。如果你编写程序来压缩异常,那么问题很可能会以另一种形式重新出现。更糟糕的是,当你压缩异常时,你将丢弃异常对象及其关联堆栈跟踪中的信息。这可能会让人更难弄清楚问题的原始来源是什么。
实际上,当你使用 IDE 的自动更正功能来修复由未处理的异常引起的编译错误时,经常发生异常压缩。例如,你可能会看到如下代码:
try {
inputStream = new FileInputStream("someFile");
} catch (IOException e) {
/* add exception handling code here */
}
很明显,程序员已接受 IDE 的建议,使编译错误消失,但建议不合适。 (如果文件打开失败,程序应该很可能对它做一些事情。通过上面的更正,程序可能会在以后失败;例如,使用 NullPointerException
因为 inputStream
现在是 null
。)
话虽如此,这里有一个故意压缩异常的例子。 (出于争论的目的,假设我们已经确定在显示自拍时的中断是无害的。)评论告诉读者我们故意压制异常,以及为什么我们这样做。
try {
selfie.show();
} catch (InterruptedException e) {
// It doesn't matter if showing the selfie is interrupted.
}
另一种常规方法是强调我们故意压缩异常而不说明为什么用异常变量的名称来表示这一点,如下所示:
try {
selfie.show();
} catch (InterruptedException ignored) { }
如果变量名称设置为 ignored
,某些 IDE(如 IntelliJ IDEA)将不会显示有关空 catch 块的警告。