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