为什么 InterruptedException 是检查异常?

Why Is InterruptedException a Checked Exception?

在 Java 中处理线程时,处理 InterruptedException 似乎是我的一个特别棘手的问题。我很欣赏它在我的线程终止时抛出的事实,从而为我提供了清理的机会。我觉得奇怪的是它不是 unchecked 异常。

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

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

如果 InterruptedException 未被选中,它似乎更有可能被正确使用并导致线程和应用程序的干净关闭。为什么不是?

中断应该是合作的。我认为设计人员希望避免这样一种情况,即您可以通过中断线程来破坏它,而线程没有代码来处理这种可能性。其意图似乎是让 Runnable 代码明确决定如何处理中断。许多框架或语言代码似乎是关于决定某件事应该由谁负责,并试图使正确的用法显而易见,以尽量减少用户被烧毁的严重程度。这是其中一个判断电话。

在检查 InterruptedException 的情况下,最坏的情况是异常被捕获,但以一种不是非常有用的方式。 (实际上绝对最坏的情况是中断标志没有恢复,线​​程中的任何后续代码都不知道中断发生了。)评论),异常可能会未经处理并继续终止线程,如果线程不在停止位置,这可能非常糟糕。

玩具示例和简单代码在未经检查的 InterruptedExceptions 下效果会更好;没有人会费心去捕捉异常,它就会起作用。但是,在实际代码中做大量工作时,这可能被认为是有害的。

检查异常是为了确保开发人员知道可以抛出异常,这样开发人员就可以避免在线程正在执行的工作中抛出异常,从而可能离开工作的情况在糟糕的状态下部分完成。