如何阻止编译器将单元化对象读取为错误



我有eclipse,当我试图查看一个未初始化的对象是否等于null时,它不允许我,它会出现一个"x可能没有初始化"的错误,我知道它应该有效。

我的意思是:

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

它不会编译,它会说"obj可能没有初始化"。我如何在eclipse中更改编译器设置来解决这个问题?

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

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

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

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


如果obj是实例变量而不是局部变量,则默认情况下将其初始化为null,并且不会出现编译错误。但局部变量并不是默认初始化的。

您不需要更改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");
}
}

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

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

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

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

Object obj = null;

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

如果你想理解这一点,JLS716.2.4(Local variable declaration statements)部分是要阅读的,但需要一些时间才能理解,这很迟钝:-)

您可能想从16(Definite Assignment)部分的顶部开始,然后从那里开始。其中的第一部分有两段在这里最相关(我用斜体字强调):

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新