Java “空白的最终字段可能尚未初始化” 方法异常中引发异常

我有一些代码,比如:

final int var1;    

if ( isSomethingTrue ) {

   var1 = 123;

} else {
   throwErrorMethod();
}

int var2 = var1;

throwErrorMethod的定义如下:

private void throwErrorMethod() throws Exception{

   throw new Exception();

}

我得到一个语句的编译错误。如果我内联该方法,编译就可以了!blank final field may not have been initializedvar2 = var1

  1. 编译器是否看不到调用的方法?throws Exception
  2. 为什么一个包含单词的错误会停止编译?!?may

答案 1
  1. 否,编译器不会确定 永远不会正常完成。规范中没有任何内容表明它应该这样做。不幸的是,没有办法表明一个方法永远不会正常返回。throwErrorMethod

  2. 它只是“可能”,因为有一个潜在的执行路径不会初始化变量。此类执行路径的存在被定义为错误。

您可能会找到这对博客文章(第1部分;第2部分)作者:Eric Lippert 有趣。这是关于C#而不是Java,但它是相同的原则。


答案 2

例外情况应该是例外的。它不假定总是引发异常。

编译器使用这个词,因为它无法判断你是否可以访问一个未初始化的变量。此外,您可以在不重新编译此类的情况下更改方法执行的操作,并且它所做的任何假设都是不正确的。may

如果要始终抛出异常,可以执行

final int var1;    

if ( isSomethingTrue ) {

   var1 = 123;

} else {
   throw exceptionMethod();
}

int var2 = var1;

// later
public Exception exceptionMethod() {
    return new Exception("Complex-Exception-String");
}

推荐