以下处理方式有什么区别InterruptedException
?最好的方法是什么?
try{
//...
} catch(InterruptedException e) {
Thread.currentThread().interrupt();
}
要么
try{
//...
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
编辑:我也想知道这两种情况在哪些情况下使用。
以下处理InterruptedException
的方式之间有什么区别?最好的方法是什么?
你可能会问这个问题,因为你已经调用了throw
方法InterruptedException
。
首先,你应该throws InterruptedException
了解它的含义:方法签名的一部分以及调用你正在调用的方法的可能结果。因此,首先要包含一个事实,即an 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;
}
如果为no,则不应使用声明你的方法,throws InterruptedException
并且(必须!)应捕获异常。现在,在这种情况下要牢记两件事:
Thread.currentThread().interrupt()
示例:用户要求打印两个值的总和。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");
}
}
到现在为止应该很清楚,只是做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;
}
问题内容: 如何用Java 处理? 问题答案: 我不确定“句柄”是什么意思。 您当然可以捕获该错误: 但这很可能是个坏主意,除非您确切地知道自己在做什么。
问题内容: 我在JavaScript中使用Ajax,并且在响应中设置了以下类的对象数组: 使用: 现在,我想将模板数组中的所有元素及其详细信息读入我的JavaScript中。 有人可以帮我吗? 问题答案: 您是否考虑过使用Google Web Toolkit ?使用GWT,您可以在客户端和服务器之间发送对象的选择有很多,包括GWT RPC ,RequestFactory和JSON。
本文向大家介绍如何在Java中处理Selenium中的代理?,包括了如何在Java中处理Selenium中的代理?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助PROXY类在Java中使用Selenium处理代理。
这是如何使用公共类frome的一个后续步骤。其他处理选项卡中的java文件?;使用来自的Usage类中的示例。java文件-有完整的文档吗?-处理2。x和3。x论坛,我有这个: /tmp/Sketch/Foo.java 这个例子运行得很好,但是如果我取消注释import peasy。组织 行,则编译失败: 当然,我确实在下安装了PeasyCam,如果我导入peasy.*它工作得很好 来自草图。 我
本文向大家介绍如何在Java中处理ArithmeticException(未选中)?,包括了如何在Java中处理ArithmeticException(未选中)?的使用技巧和注意事项,需要的朋友参考一下 该java.lang.ArithmeticException是一个未经检查的异常在Java中。通常,会遇到java.lang.ArithmeticException:/零,这是在尝试将两个数字相除
问题内容: 是否可以在Java虚拟机中处理POSIX信号? 至少SIGINT和SIGKILL应该完全独立于平台。 问题答案: JVM自行响应信号。有些会导致JVM正常关闭,其中包括运行关闭挂钩。其他信号将导致JVM在不运行关闭钩子的情况下中止。 关闭挂钩是使用Runtime.addShutdownHook(Thread)添加的。 我认为JDK没有提供处理Java应用程序中信号的正式方法。但是,我确