我有一些代码,例如:
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 initialized
语句的 var2 = var1
编译错误。如果我内联该方法,编译就可以了!
throws Exception
吗?may
字样的错误会停止编译?!?例外就应该是例外。它并不假设总是抛出异常。
编译器使用“
may
”一词,因为它无法判断您是否可以访问未初始化的变量。此外,您可以更改该方法的功能而无需重新编译此类,并且它所做的任何假设都是不正确的。
如果你想总是抛出异常,你可以这样做
final int var1;
if ( isSomethingTrue ) {
var1 = 123;
} else {
throw exceptionMethod();
}
int var2 = var1;
// later
public Exception exceptionMethod() {
return new Exception("Complex-Exception-String");
}
编译器不会执行您期望的那种检查。 它无法确定
throwErrorMethod
实际上每次都会抛出异常。 因此,它假设可以进入您的 else
子句,调用 throwErrorMethod
,从该方法返回,然后不初始化 var1
(必须初始化)。
} else {
throw createErrorMethod();
}
其中
createErrorMethod()
被声明返回某种 Throwable。
var1
未初始化。