5
try {
    if (check) {
        while (true) ;
    } else {
        System.exit(1);
    }
} finally {
    clear();
}

问:有clear()没有永远不会被执行的情况?我个人觉得没有不执行 clear() 的情况。

4

5 回答 5

4

如果System.exit成功,clear()则不会执行。但是,System.exit(1) 可能会抛出SecurityException异常,在这种情况下clear()将被执行。

于 2012-10-31T15:53:46.993 回答
1

如果check为真,那么您将陷入无限循环,在这种情况下,从技术上讲,您永远无法到达 finally 块。

否则如果check为假,则System.exit(1);执行然后您的程序终止;在这种情况下,它永远不会到达要finally执行的块clear()

在这个例子中,实际上是无法达到的clear()

于 2012-10-31T15:52:53.827 回答
0

clear 只会在 try 块完成时执行。

如果check为真,那么 while(true) 将永远坐在那里,所以永远不要离开 try 块

如果check为假,System.exit(0)则将退出程序,因此 finally 块也不会运行。但是System.exit(int)可以抛出一个SecurityException这会导致 finally 被调用。

所以总而言之,我认为如果System.exit抛出一个SecurityException

于 2012-10-31T15:54:24.740 回答
0

有没有 clear() 永远不会被执行的情况?

您给出的两个示例都是这种情况,您可以通过运行代码来确认。

当你有一个无限循环时,它之后什么都不会执行。

当 System.exit() 成功时,它会立即停止线程。

于 2012-10-31T15:56:31.103 回答
-1

System.exit(1) 阻止 finally 子句运行。

基本上,无论 try 或 catch 是正常返回还是异常返回,都会在 try/catch 之后执行 finally 块。

然而,System.exit 阻止了块返回。

而(真);显然会无限期地阻塞。只是假设 while (true) ; 是更有意义的东西的存根:)

于 2012-10-31T15:56:39.213 回答