java – 为什么InterruptedException是一个经过检查的异常?

Java中处理线程时,处理InterruptedException似乎是我身边的一个特殊刺.我很欣赏当我的线程被终止时它被抛出的事实,因此我有机会进行清理.对我来说似乎很奇怪的是,这不是一个未经检查的例外.

这会产生以下问题:
a)如果我想在我的线程应用程序中使用现有框架,我不得不将其转换为框架接口接受的异常.因此,框架通常会误解它,而不是按照它应该清理或传播它.

b)除非为堆栈中的每个调用严格声明InterruptedException(并且通常不是因为a),否则很难干净地关闭.

如果取消选中InterruptedException,那么它似乎会有更高的可能性,并且通常会导致线程和应用程序的干净关闭.为什么不呢?

解决方法

中断应该是合作的.我认为设计人员希望避免一种情况,即你可以通过中断它来消除线程,而线程没有代码来处理这种可能性.目的似乎是让Runnable代码明确决定如何处理中断.很多框架或语言代码似乎都是关于决定谁应该做出什么样的责任,并试图使正确的用法显而易见,以便最大限度地减少用户被烧毁的程度.这是判断之一.

在检查InterruptedException时,最糟糕的情况是异常被捕获,但是以一种非常有用的方式. (实际上绝对最坏的情况是中断标志没有恢复,线​​程中的任何后续代码都没有意识到发生了中断.)如果未选中InterruptedException(或者如果你将它包装在RuntimeException中,如在链接文章中所示)注释),异常可能无法处理并继续终止线程,如果线程不在停止位置,这可能非常糟糕.

使用未经检查的InterruptedExceptions可以更好地使用玩具示例和简单代码;没有人会费心去捕捉异常并且它会起作用.然而,在实际代码中做大量工作,这可能被认为是有害的.

检查异常是为了确保开发人员知道可以抛出异常,以便开发人员可以避免在线程正在进行的工作中抛出异常的情况,从而可能使工作部分地完成.糟糕的状态.

相关文章

应用场景 C端用户提交工单、工单创建完成之后、会发布一条工...
线程类,设置有一个公共资源 package cn.org.chris.concurre...
Java中的数字(带有0前缀和字符串)
在Java 9中使用JLink的目的是什么?
Java Stream API Filter(过滤器)
在Java中找到正数和负数数组元素的数量