class TestMe{
public static void main (String args[]){
String s3;
System.out.print(s3);
}
}
为什么编译器给出错误,引用对象的默认值为null,为什么它不是输出...??
error: variable s3 might not have been initialized
class TestMe{
public static void main (String args[]){
String s3;
System.out.print(s3);
}
}
为什么编译器给出错误,引用对象的默认值为null,为什么它不是输出...??
error: variable s3 might not have been initialized
这是一个错误,因为 JLS 在§14.4.2 中如此说明。局部变量声明的执行:
如果声明符没有初始化表达式,那么对变量的每个引用都必须在执行对变量的赋值之前执行,否则根据 §16的规则会发生编译时错误。
局部变量在使用它们之前应该被初始化,局部变量在java中没有得到默认值,因此你string s3
没有得到默认值 null 因为它是一个局部变量,因此编译器错误。
来自JLS :
如果声明符没有初始化表达式,那么每次对变量的引用都必须在执行对变量的赋值之前执行,否则根据第 16 节的规则会发生编译时错误。
默认值null
仅适用于类的非final
字段。
所有其他情况都需要在首次使用前进行初始化
是的,这是必要的。
String s3;
s3 = "Something....";
System.out.print(s3); // prints "Something..."
在使用局部变量之前,您必须对其进行初始化。
我对局部变量的了解是:
声明局部变量主要是为了做一些计算。所以程序员决定给变量赋值,它不应该采用默认值。如果程序员错误地没有初始化一个局部变量,那么它采用默认值,那么输出就会出错。所以局部变量会要求程序员在使用变量之前进行初始化以避免出错。
使用默认值的独特场景是相关变量是对象的字段或数组的组件甚至是本地的情况。实际上,数组总是用适当的默认值初始化它们的单元格。
因此,在您的情况下,您的变量不是来自一个字段(因为该方法是本地的)并且没有参与数组初始化。所以编译器逻辑上抱怨..