try {
if (check) {
while (true) ;
} else {
System.exit(1);
}
} finally {
clear();
}
问:有clear()
没有永远不会被执行的情况?我个人觉得没有不执行 clear() 的情况。
try {
if (check) {
while (true) ;
} else {
System.exit(1);
}
} finally {
clear();
}
问:有clear()
没有永远不会被执行的情况?我个人觉得没有不执行 clear() 的情况。
如果System.exit
成功,clear()
则不会执行。但是,System.exit(1)
可能会抛出SecurityException
异常,在这种情况下clear()
将被执行。
如果check
为真,那么您将陷入无限循环,在这种情况下,从技术上讲,您永远无法到达 finally 块。
否则如果check
为假,则System.exit(1);
执行然后您的程序终止;在这种情况下,它永远不会到达要finally
执行的块clear()
。
在这个例子中,实际上是无法达到的clear()
clear 只会在 try 块完成时执行。
如果check
为真,那么 while(true) 将永远坐在那里,所以永远不要离开 try 块
如果check
为假,System.exit(0)
则将退出程序,因此 finally 块也不会运行。但是System.exit(int)
可以抛出一个SecurityException
这会导致 finally 被调用。
所以总而言之,我认为如果System.exit
抛出一个SecurityException
有没有 clear() 永远不会被执行的情况?
您给出的两个示例都是这种情况,您可以通过运行代码来确认。
当你有一个无限循环时,它之后什么都不会执行。
当 System.exit() 成功时,它会立即停止线程。
System.exit(1) 阻止 finally 子句运行。
基本上,无论 try 或 catch 是正常返回还是异常返回,都会在 try/catch 之后执行 finally 块。
然而,System.exit 阻止了块返回。
而(真);显然会无限期地阻塞。只是假设 while (true) ; 是更有意义的东西的存根:)