Edw*_*ard 4 java eclipse exception-handling initialization
我发现了Eclipse报告"局部变量可能尚未初始化"错误的方式的奇怪二分法.如果我在try/catch块之外声明一个变量,在try/catch块中初始化它,然后在try/catch块之后使用它,则通常会发生此错误:
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
r.nextInt(); //Error: The local variable r may not have been initialized
Run Code Online (Sandbox Code Playgroud)
这是有道理的.我可以通过null在我声明它时将变量初始化来避免错误,或者通过确保在try/catch块内发生异常时程序的控制流永远不会到达下一个语句.因此,如果变量初始化失败,我真的无法继续执行,我可以这样做:
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
throw new RuntimeException("Initialize secure random number generator failed");
}
r.nextInt(); //No error here
Run Code Online (Sandbox Code Playgroud)
但是,我最近尝试使用System.exit停止程序而不是RuntimeException使程序的控制台输出更清洁.我认为这些是等价的,因为两者都阻止程序继续执行,但我发现Eclipse不同意:
Random r;
try {
r = new AESCounterRNG();
} catch (GeneralSecurityException e) {
System.err.println("Couldn't initialize secure random number generator");
System.exit(1);
}
r.nextInt(); //Error: The local variable r may not have been initialized
Run Code Online (Sandbox Code Playgroud)
为什么Eclipse在r.nextInt()发生异常时执行永远无法达到时仍然给出"未初始化"错误?这是Eclipse中的一个错误,还是有一些方法可以r.nextInt()在调用后继续执行System.exit?
好问题,它也多次困扰我.
问题是,与抛出异常不同,只是调用一个方法(而那System.exit(1);就是)通常不能保证程序流程停止.当然,System.exit()的文档说这个方法永远不会正常返回.但是语义throw本身是由语言本身定义的,语义System.exit()只是在Javadocs中.
我的猜测是他们只是没有费心去实施这个特殊情况.虽然有一个错误报告,其中涉及这个主题(https://bugs.eclipse.org/bugs/show_bug.cgi?id=126551,请参阅注释2),它被标记为"不会修复",因为它似乎是太复杂.
编辑:正如rlegendi指出的那样,它实际上是Java编译器的一个问题,而不仅仅是Eclipse.到目前为止,我的解决方案是使用普通的旧版本throw(而不是一些特殊的throw()方法)(除了非常小的应用程序之外的任何东西)比任何方式都好System.exit().