【发布时间】:2009-08-08 05:57:55
【问题描述】:
当我遇到一段有趣的代码时,我试图为我正在帮助的替代开源 JVM (Avian) 提出晦涩难懂的测试用例,但我很惊讶它没有编译:
public class Test {
public static int test1() {
int a;
try {
a = 1;
return a; // this is fine
} finally {
return a; // uninitialized value error here
}
}
public static void main(String[] args) {
int a = test1();
}
}
最明显的代码路径(我看到的唯一一个)是执行a = 1,“尝试”返回a(第一次),然后执行finally,实际上返回一种。然而,javac 抱怨“a”可能没有被初始化:
Test.java:8:变量 a 可能尚未初始化 返回一个; ^我能想到的唯一可能导致/允许不同代码路径的事情是,如果在尝试开始之后但在将值 1 分配给 a 之前发生模糊的运行时异常 - 类似于 OutOfMemoryError 或StackOverflowException,但我想不出在代码中的这个地方可能会发生这些情况。
任何更熟悉 Java 标准细节的人能对此有所了解吗?这只是编译器保守的一种情况——因此拒绝编译原本有效的代码——还是这里发生了一些奇怪的事情?
【问题讨论】:
标签: java variables finally initialization