如何阻止编译器将未初始化的对象读取为错误

时间:2012-12-15 04:41:51

标签: java object null

我有eclipse,当我试图看一个未初始化的对象是否等于null时,它不会让我,它会出现“x可能没有初始化”的错误,我知道它应该工作。

我的意思是:

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

它不会编译,它会说'obj可能没有被初始化'如何在eclipse中更改我的编译器设置来修复它?

5 个答案:

答案 0 :(得分:3)

  

如何更改eclipse中的编译器设置以解决此问题?

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

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

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


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

答案 1 :(得分:2)

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

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

来自Java Specification 4.12.5 - Initial Values of Variables

  

局部变量(§14.4,§14.14)必须在使用前通过初始化(§14.4)或赋值(§15.26)显式赋予值,其方式可以使用明确规则进行验证任务(§16)。

如果您真的不想初始化obj,则需要将其设为类的成员而不是局部变量。然后它将具有默认初始值:(再次,请参阅Java Specification 4.12.5 - Initial Values of Variables

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");
    }

}

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

答案 2 :(得分:1)

这是一个局部变量,你需要用它来初始化它:

Object obj = null;

虽然类和对象以及数组的某些字段可以隐式初始化为有用的默认值,但局部变量不是这种情况。

16.2.4的{​​{1}} Local variable declaration statements部分是您要了解的部分,但需要一些时间来理解,这是非常迟钝的: - )

您可能希望从JLS716)部分的顶部开始,然后从那里开始工作。其中第一部分有两段最相关的段落(我强调的斜体):

  

对于本地变量或空白Definite Assignment字段final的每次访问,X 必须在访问之前明确分配,或编译时错误发生。

     

这样的赋值被定义为当且仅当的简单名称   变量(或者,对于字段,其简单名称由X限定)出现在左侧   任务操作员的一面。

答案 3 :(得分:1)

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

Object obj = null;

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

答案 4 :(得分:0)

  

如何更改eclipse中的编译器设置以解决此问题?

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