奇怪的Java编译器警告:错误的"潜在的空访问警告"

Ale*_*rov 2 java nullpointerexception compiler-warnings

(JDK 1.6.0_23,Eclipse 3.7.0,"潜在空指针访问"警告级别为"警告")请考虑以下示例代码:

Object obj = null;
for (;;) {
    obj = getObject();
    if (obj != null) break;
    Thread.sleep(25);
}
obj.toString();
Run Code Online (Sandbox Code Playgroud)

我在最后一行收到以下警告:Potential null pointer access: The variable obj may be null at this location.有没有真正的方法obj可以实际成为null或为什么编译器这么认为?

Tho*_*ung 8

我会说编译器将其视为:

Object obj = null;
[Too dumb to interpret this loop]
obj.toString();
Run Code Online (Sandbox Code Playgroud)

因此,如果你不能解释循环的作用,那么obj.toString()可以为null.

例如,您可以通过替换来欺骗编译器:

void x(int x){
    return;  
    x++;  //error unreachable code
}
Run Code Online (Sandbox Code Playgroud)

void x(int x){
    if(true) return;
    x++;  //compiles
}
Run Code Online (Sandbox Code Playgroud)