2

我有 Eclipse,当我尝试查看未初始化的对象是否等于 null 时,它不会让我这样做,它会出现“x 可能尚未初始化”错误,我知道它应该可以工作。

我的意思的例子:

      Object obj;
      System.out.println(obj==null ? "no value":"has a value");

它不会编译,它会说'obj可能没有被初始化'我怎样才能在eclipse中更改我的编译器设置来解决这个问题?

4

5 回答 5

3

如何在 eclipse 中更改我的编译器设置来解决这个问题?

你不能。Java 语言规范要求任何符合标准的 Java 编译器将此视为编译错误。

没有 Eclipse 编译器设置会导致它违反此规则。

即使(假设地)有这样的设置,我认为当 JVM 尝试加载字节码文件时,它也会验证失败。(如果你能以某种方式欺骗 JVM 使用未初始化的局部变量的值,那将破坏运行时类型的安全性,导致 JVM 崩溃……甚至更糟。)


如果obj是实例变量而不是局部变量,它将默认初始化null并且您不会收到编译错误。但是局部变量没有默认初始化。

于 2012-12-15T04:47:58.147 回答
2

您无需更改 eclipse 中的编译器设置来解决此问题:您只需初始化变量obj.

      Object obj = null;
      System.out.println(obj==null ? "no value":"has a value");

来自Java 规范 4.12.5 - 变量的初始值

局部变量(第 14.4 节、第 14.14 节)必须在使用之前通过初始化(第 14.4 节)或赋值(第 15.26 节)显式赋予一个值,其方式可以使用明确赋值规则(第16)。

如果你真的不想初始化obj,你需要让它成为一个类的成员而不是一个局部变量。然后它将有一个默认初始值:(再次,请参阅Java 规范 4.12.5 - 变量的初始值

public class Example {

    private static Object obj;

    public static void main(String[] argv) throws Exception {
        System.out.println(obj==null ? "no value":"has a value");
    }

}

...但在引擎盖下它仍在初始化。

于 2012-12-15T04:43:55.670 回答
1

这是一个局部变量,您需要使用以下方法对其进行初始化:

Object obj = null;

虽然类和对象以及数组的某些字段可能被隐式初始化为有用的默认值,但局部变量并非如此。

如果您想理解这一点,则第16.2.4( Local variable declaration statements) 部分JLS7是要阅读的部分,但需要一些时间才能理解,它非常迟钝:-)

您可能希望从16( Definite Assignment) 部分的顶部开始,然后从那里完成。第一部分有两段在这里最相关(我用斜体表示强调):

对于局部变量或空白final字段的每次访问X,都X 必须在访问前明确赋值,否则会发生编译时错误。

当且仅当变量的简单名称(或者,对于字段,其简单名称由 限定this)出现在赋值运算符的左侧时,才会定义这样的赋值。

于 2012-12-15T04:44:38.603 回答
1

编译器显示错误,因为规则是所有局部变量必须在首次读取之前进行初始化。所以先声明局部变量不初始化,稍后初始化,再使用:

Object obj = null;

 System.out.println(obj==null ? "no value":"has a value");
于 2012-12-15T04:47:08.997 回答
0

如何在 eclipse 中更改我的编译器设置来解决这个问题?

解决方案是修复您的代码。此错误的目的是检测和防止错误。采取措施允许编译损坏的代码通常是一个非常糟糕的主意。

于 2012-12-15T09:04:19.543 回答