慕的地6264312
以下处理InterruptedException的方法有什么不同?做这件事最好的方法是什么?你可能是来问这个问题的,因为你调用了一种方法InterruptedException.首先,你应该看到throws InterruptedException它是:方法签名的一部分,以及调用正在调用的方法的可能结果。所以首先要接受这样一个事实InterruptedException是方法调用的一个完全有效的结果。现在,如果您调用的方法抛出了这样的异常,那么应该如何你的方法可以吗?您可以通过考虑以下几点来找出答案:这对这个方法有意义吗?你,你们正在实现抛出InterruptedException?换句话说,是InterruptedException打电话时的合理结果你的方法?如果是,然后throws InterruptedException应该是你的方法签名,您应该让异常传播(即根本不捕获它)。例:您的方法等待来自网络的值来完成计算并返回结果。如果阻塞网络调用引发InterruptedException您的方法无法正常完成计算。你让InterruptedException传播。int computeSum(Server server) throws InterruptedException {
// Any InterruptedException thrown below is propagated
int a = server.getValueA();
int b = server.getValueB();
return a + b;}如果不,则不应将方法声明为throws InterruptedException你应该(必须!)抓住例外。在这种情况下,有两件事是很重要的:例用户要求打印两个值的和。印刷“Failed to compute sum“如果无法计算和,则可以接受(并且比由于InterruptedException)。换句话说,它确实是不将此方法声明为throws InterruptedException.void printSum(Server server) {
try {
int sum = computeSum(server);
System.out.println("Sum: " + sum);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // set interrupt flag
System.out.println("Failed to compute sum");
}}有人打断了你的思路。可能有人急于取消操作,优雅地终止程序,或者其他什么。你应该对那个人彬彬有礼,从你的方法回来,不要再费心了。即使你的方法的情况下,可以设法生成一个合理的返回值。InterruptedException线程被中断的事实可能仍然很重要。特别是,调用您的方法的代码可能感兴趣的是在执行您的方法时是否发生了中断。因此,您应该通过设置中断标志来记录中断发生的事实:Thread.currentThread().interrupt()现在应该清楚的是throw new RuntimeException(e)是个坏主意。对打电话的人不太礼貌。您可以发明一个新的运行时异常,但是根本原因(有人希望线程停止执行)可能会丢失。其他例子:实施Runnable*正如你可能已经发现的,签名Runnable.run不允许重新抛出InterruptedExceptions..井,你,你们签约执行Runnable,这意味着你,你们签约处理可能的事情InterruptedExceptions..要么选择另一个接口,如Callable,或者遵循上面的第二种方法。 呼叫Thread.sleep:您正在尝试读取一个文件,规范说您应该在1秒内尝试10次。你打电话Thread.sleep(1000)..所以,你需要处理InterruptedException..的方法,例如tryToReadFile这么说是很有道理的,如果我被打断了,我无法完成我试着读文件的动作..换句话说,这个方法是非常有意义的。InterruptedExceptions.String tryToReadFile(File f) throws InterruptedException {
for (int i = 0; i
if (f.exists())
return readFile(f);
Thread.sleep(1000);
}
return null;}这篇文章被改写为一篇文章这里.