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 by
0
等)

此外,
classC
变量的值可以通过同一类(包括构造函数)中的其他方法设置,如果它是公共的,也可以从类外设置它的值


因此,根据编译器的说法,
classC
可以在访问之前进行初始化,因此它不会抱怨。

所以这是实例和函数变量之间的差异造成的…非常感谢。是的,函数变量不会自动初始化为
null
,但实例变量会自动初始化为null创建对象时为y。感谢帮助..正确的是NullPointerException:)