【问题标题】:Is initalization of string in java necessary...?是否需要在 java 中初始化字符串...?
【发布时间】:2013-01-20 08:58:43
【问题描述】:
class TestMe{   
    public static void main (String args[]){
        String s3;  
        System.out.print(s3);
    }
}

为什么编译器会报错,引用对象的默认值为null,为什么它不是输出...??

error: variable s3 might not have been initialized

【问题讨论】:

标签: java


【解决方案1】:

这是一个错误,因为 JLS 在 §14.4.2. Execution of Local Variable Declarations: 中这么说

如果声明器没有初始化表达式,那么每次对变量的引用都必须在执行对变量的赋值之前执行,否则根据§16的规则会发生编译时错误强>。

【讨论】:

    【解决方案2】:

    局部变量在使用之前应该初始化,局部变量在java中没有默认值,因此你的string s3没有得到默认值null,因为它是一个局部变量,因此编译器错误。

    发件人JLS:

    如果声明符没有初始化表达式,那么每个 对变量的引用必须在执行之前 分配给变量,或发生编译时错误 §16 的规则。

    【讨论】:

      【解决方案3】:

      null 的默认值仅适用于类的非final字段

      所有其他情况都需要在首次使用前进行初始化

      【讨论】:

      • 或者数组的单元格的值也初始化为默认值,即使数组是本地的。
      • 数组单元格不是字段。一个未初始化的数组是例如Object[] foo;,如果你用new Object[50]分配数组,new的属性是它根据类型将所有内容设置为0null
      • 是的,每个单元格都使用数组的类型默认值进行初始化。我不仅讨论了字段或未初始化的数组,还讨论了应用默认值的情况。例如,一个布尔数组会将其所有单元格初始化为false
      • 问题是关于字段的,我的回答也是如此;-)
      【解决方案4】:

      是的,这是必要的。

      String s3;
      s3 = "Something....";
      System.out.print(s3); // prints "Something..."
      

      在使用局部变量之前,必须对其进行初始化。

      【讨论】:

        【解决方案5】:

        我对局部变量的了解是:
        局部变量的声明主要是为了进行一些计算。因此,给变量赋值是程序员的决定,它不应该取默认值。如果程序员错误地没有初始化一个局部变量,那么它采用默认值,那么输出就会出错。所以局部变量会要求程序员在使用变量之前进行初始化以避免出错。

        【讨论】:

          【解决方案6】:

          使用默认值的独特场景是相关变量是对象的字段或数组的组件,甚至是本地的。实际上,数组总是用适当的默认值初始化它们的单元格。

          因此,在您的情况下,您的变量不是来自一个字段(因为该方法是本地的)并且没有参与数组初始化。所以编译器逻辑上抱怨..

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-20
            • 1970-01-01
            • 2014-02-08
            • 1970-01-01
            • 1970-01-01
            • 2018-08-23
            • 1970-01-01
            相关资源
            最近更新 更多