以下处理中断异常的方法之间有什么区别?最好的方法是什么
试试看{
//...
}捕获(中断异常e){
Thread.currentThread().interrupt();
}
或
试试看{
//...
}捕捉(中断异常e){
抛出新的运行时异常(e);
}
编辑:我还想知道这两种方法在哪些场景中使用
以下处理InterruptedException的方法之间有什么区别?最好的方法是什么
您可能会问这个问题,因为您调用了一个抛出InterruptedException的方法
首先,您应该看到抛出InterruptedException,了解它是什么:方法签名的一部分以及调用所调用方法的可能结果。因此,首先要接受这样一个事实:InterruptedException是方法调用的一个完全有效的结果
现在,如果您调用的方法抛出这样的异常,您的方法应该做什么?您可以通过思考以下内容来找出答案:
您要实现的方法抛出一个InterruptedException有意义吗?换句话说,InterruptedException调用您的方法时是否是一个合理的结果
-
如果yes,则
抛出InterruptedException应该是方法签名的一部分,并且应该让异常传播(即根本不捕获它)示例:您的方法等待来自网络的值完成计算并返回结果。如果阻塞网络调用抛出
中断异常,则您的方法无法以正常方式完成计算。您让中断异常传播int computeSum(服务器)抛出InterruptedException{ //下面抛出的任何中断异常都会传播 int a=server.getValueA(); int b=server.getValueB(); 返回a+b; } -
如果no,则不应使用
声明方法抛出InterruptedException,并且应(必须!)捕获异常。在这种情况下,需要记住两件事:-
有人打断了你的思路。可能有人急于取消操作,优雅地终止程序,或者其他什么。你应该对那个人有礼貌,不用再麻烦就从你的方法中返回
-
即使您的方法能够在发生
中断异常时生成合理的返回值线程已中断的事实仍然很重要。特别是,调用方法的代码可能对方法执行期间是否发生中断感兴趣。因此,您应该通过设置中断标志来记录中断发生的事实:Thread.currentThread().interrupt()
示例:用户要求打印两个值的总和。如果无法计算总和,则可以打印“
计算总和失败”(这比让程序因中断异常导致堆栈跟踪崩溃要好得多)。换句话说,用抛出InterruptedException声明此方法是没有意义的void printSum(服务器){ 试一试{ int sum=computeSum(服务器); System.out.println(“总和:+Sum”); }捕捉(中断异常e){ Thread.currentThread().interrupt();//设置中断标志 System.out.println(“计算总和失败”); } } -
现在应该很清楚,仅仅做抛出新的RuntimeException(e)是个坏主意。对打电话的人不太礼貌。您可以发明一个新的运行时异常,但根本原因(有人希望线程停止执行)可能会丢失
其他示例:
实现
Runnable:您可能已经发现,Runnable.run的签名不允许重新触发中断异常。嗯,您注册了实现可运行,这意味着您注册了以处理可能的中断异常。或者选择其他接口,例如可调用,或遵循上述第二种方法
调用
Thread.sleep:您正在尝试读取一个文件,规范要求您应该在间隔1秒的时间内尝试10次。您可以调用Thread.sleep(1000)。因此,您需要处理中断异常。对于像tryToReadFile这样的方法,最好说,“如果我被中断,我就无法完成尝试读取文件的操作”。换句话说,方法抛出InterruptedExceptions非常有意义字符串tryToReadFile(文件f)引发中断异常{ 对于(int i=0;i<;10;i++){ 如果(f.exists()) 返回readFile(f); 睡眠(1000); } 返回null; }
这篇文章已被改写为一篇文章http://programming.guide/java/handling-interrupted-exceptions.html“rel=”noreferrer“>此处