Java 为什么在类元素中放置变量时不会发生编译器错误
感谢阅读,以下是代码:Java 为什么在类元素中放置变量时不会发生编译器错误,java,Java,感谢阅读,以下是代码: public class ClassA{ } class ClassB{ public String getValue() { ClassC classC; ^^^^^^^^^^^^^ return classC.getValue(); } } class ClassC{ String value; public String getValue() { va
public class ClassA{
}
class ClassB{
public String getValue()
{
ClassC classC;
^^^^^^^^^^^^^
return classC.getValue();
}
}
class ClassC{
String value;
public String getValue()
{
value="test";
return value;
}
}
这将导致IDE在编译时响应“classC可能未初始化”。
但当我将这一行:“ClassC ClassC;”移到classB中getVlalue()函数的外部时,IDE变得安静,转而抛出运行时错误
有人能解释一下原因吗?
非常感谢 这是因为当
Classc
被移动到getValue()
函数的外部,它成为它所在的任何类的字段。Java将自动初始化所有未设置的字段。在这种情况下,由于它是一个对象,它将被初始化为null
。我假设您得到的运行时错误是NullPointerException
当在方法中声明它时,它不会自动初始化,您必须显式地将它设置为某个值。因为您在使用它之前没有这样做,编译器抱怨。因为当
ClassC
只在类内部移动,而不是函数内部的变量,它将成为实例变量,默认情况下,当类的实例(read-object)实例化时,所有实例变量都将初始化(按null
如果未提供值,则原语类型将按其自身的不同值,如int by0
等)
此外,classC
变量的值可以通过同一类(包括构造函数)中的其他方法设置,如果它是公共的,也可以从类外设置它的值
因此,根据编译器的说法,
classC
可以在访问之前进行初始化,因此它不会抱怨。所以这是实例和函数变量之间的差异造成的…非常感谢。是的,函数变量不会自动初始化为null
,但实例变量会自动初始化为null创建对象时为y。感谢帮助..正确的是NullPointerException:)