在下面的代码我期望它应该不会需要初始化变量a,并b在最后else块,但是编译器不喜欢它.
import java.util.Random;
public class Foo {
private void foo () {
double a,b;
boolean c;
double r = (new Random()).nextDouble();
if(r < 0.25) {
a = 1;
b = 2;
c = true;
} else if(r >= 0.25 && r < 0.75) {
a = 3;
b = 3;
c = true;
} else {
// why is it necessary to init a and b here?
// given that c is set to false
c = false;
}
if(c) {
double k = a + b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,编译器会抱怨.
bash-3.2$ javac Foo.java
Foo.java:25: variable a might not have been initialized
double k = a + b;
^
Foo.java:25: variable b might not have been initialized
double k = a + b;
^
2 errors
Run Code Online (Sandbox Code Playgroud)
我原以为编译器可以进行静态分析,以确定k如果c设置为false 则不会被评估.所以我的问题是为什么编译器要求我初始化a和b?
编译器不够智能,无法理解通过else块将设置c为false,并且if因此不会执行下一个块.静态分析比你期望的更有限,这也使得编译速度更快/
而且它可能是一件好事,因为改变else块的代码会突然使下一个if块不可编译,这将是烦人的.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |