我有eclipse,当我试图看一个未初始化的对象是否等于null时,它不会让我,它会出现“x可能没有初始化”的错误,我知道它应该工作。
我的意思是:
Object obj;
System.out.println(obj==null ? "no value":"has a value");
它不会编译,它会说'obj可能没有被初始化'如何在eclipse中更改我的编译器设置来修复它?
答案 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
部分是您要了解的部分,但需要一些时间来理解,这是非常迟钝的: - )
您可能希望从JLS7
(16
)部分的顶部开始,然后从那里开始工作。其中第一部分有两段最相关的段落(我强调的斜体):
对于本地变量或空白
Definite Assignment
字段final
的每次访问,X
必须在访问之前明确分配,或编译时错误发生。这样的赋值被定义为当且仅当的简单名称 变量(或者,对于字段,其简单名称由
X
限定)出现在左侧 任务操作员的一面。
答案 3 :(得分:1)
编译器显示错误,因为规则是所有局部变量必须在首次读取之前初始化。因此,首先声明局部变量而不初始化它,稍后对其进行初始化,然后使用它:
Object obj = null;
System.out.println(obj==null ? "no value":"has a value");
答案 4 :(得分:0)
如何更改eclipse中的编译器设置以解决此问题?
解决方案是修复您的代码。此错误的目的是检测和防止错误。采取措施允许破解代码编译通常是一个非常糟糕的主意。