Tho*_*ens 74 java try-catch-finally system.exit
我知道涉及在try/catch/finally块中返回的令人头痛的问题 - finally中的返回始终是方法的返回,即使try或catch块中的返回应该是执行的返回.
但是,同样适用于System.exit()?例如,如果我有一个try块:
try {
//Code
System.exit(0)
}
catch (Exception ex) {
//Log the exception
}
finally {
System.exit(1)
}
Run Code Online (Sandbox Code Playgroud)
如果没有异常,将调用哪个System.exit()?如果exit是return语句,则System.exit(1)行将始终(?)被调用.但是,我不确定退出的行为是否与返回不同.
代码处于极端情况下,即使不是不可能,也很难重现,因此我无法编写单元测试.我今天晚些时候会尝试进行一项实验,如果我得到一些免费的分钟,但我很好奇,也许有人知道答案,可以提供它,或者我无法运行实验.
eri*_*son 81
否.System.exit(0)不返回,并且不执行finally块.
System.exit(int)可以扔一个SecurityException.如果发生这种情况,将执行finally块.并且由于相同的主体从相同的代码库调用相同的方法,SecurityException因此可能从第二个调用中抛出另一个.
以下是第二种情况的示例:
import java.security.Permission;
public class Main
{
public static void main(String... argv)
throws Exception
{
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm)
{
/* Allow everything else. */
}
@Override
public void checkExit(int status)
{
/* Don't allow exit with any status code. */
throw new SecurityException();
}
});
System.err.println("I'm dying!");
try {
System.exit(0);
} finally {
System.err.println("I'm not dead yet!");
System.exit(1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他答案涵盖了如果在不抛出的情况下退出JVM时catchand finally块如何不运行,但是它们没有显示出资源的“ try-with-resources”块会发生什么:它们是否关闭了?System.exitSecurityException
转换的结果是将资源规范“放在” try语句内。这允许扩展的try-with-resources语句的catch子句捕获由于自动初始化或关闭任何资源而导致的异常。
此外,与finally关键字的意图保持一致,所有资源将在执行finally块时关闭(或尝试关闭)。
也就是说,资源将close在a catch或finallyblock运行之前被d 占用。如果他们都close以某种方式ð即使catch和finally不跑?
这是一些代码,用于证明“ try-with-resources”语句中的资源也未关闭。
我使用一个简单的子类BufferedReader在调用之前打印一条语句super.close。
class TestBufferedReader extends BufferedReader {
public TestBufferedReader(Reader r) {
super(r);
}
@Override
public void close() throws IOException {
System.out.println("close!");
super.close();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我建立了System.exit在try-with-resources语句中调用的测试用例。
public static void main(String[] args)
{
try (BufferedReader reader = new TestBufferedReader(new InputStreamReader(System.in)))
{
System.out.println("In try");
System.exit(0);
}
catch (Exception e)
{
System.out.println("Exception of type " + e.getClass().getName() + " caught: " + e.getMessage());
}
finally
{
System.out.println("finally!");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
尝试中
因此,不仅成功,catch而且finally块不运行,close如果System.exit成功,“尝试使用资源”语句也不会获得其资源的机会。
| 归档时间: |
|
| 查看次数: |
86503 次 |
| 最近记录: |