以下处理InterruptedException的方式之间有什么区别?最好的方法是什么?
您可能会问这个问题,因为您已经调用了throw方法InterruptedException
。
首先,您应该throws InterruptedException
了解它的含义:方法签名的一部分,以及调用所调用方法的可能结果。因此,首先要考虑一个事实,即an InterruptedException
是方法调用的完全有效结果。
现在,如果您正在调用的方法抛出此类异常,那么您的方法应该怎么做?您可以通过考虑以下因素找出答案:
您要实现的方法抛出一个有意义InterruptedException
吗?换句话说,InterruptedException
调用您的方法是否明智?
到现在为止,应该很清楚,只是做throw new RuntimeException(e)
一个坏主意。呼叫者不太礼貌。您可以发明一个新的运行时异常,但根本原因(有人希望线程停止执行)可能会丢失。
其他例子:
实现Runnable
:您可能已经发现,的签名Runnable.run
不允许重新抛出InterruptedExceptions
。好了,您已经签署了实施计划Runnable
,这意味着您已经注册了对“可能”的处理InterruptedExceptions
。选择其他界面(例如)Callable
,或按照上面的第二种方法。
呼叫Thread.sleep
:您正在尝试读取文件,而规范说您应该尝试10次,中间间隔1秒。你打电话Thread.sleep(1000)
。因此,您需要处理InterruptedException
。对于这样的方法tryToReadFile
,说“如果我被打断了,我将无法完成尝试读取文件的动作”是很有意义的。换句话说,该方法抛出异常是有意义的InterruptedExceptions
。
String tryToReadFile(File f) throws InterruptedException {
for (int i = 0; i < 10; i++) {
if (f.exists())
return readFile(f);
Thread.sleep(1000);
}
return null;
}
这篇文章在这里已被重写为文章。