【问题标题】:int datatype initialization : Array vs Regularint 数据类型初始化:数组与常规
【发布时间】:2013-09-03 22:21:21
【问题描述】:
class returntest
{
    public static void main(String...args)
    {
        int a;
        System.out.println(a); //Line 1

        int b[] = new int[10];
        System.out.println(b[1]); //Line 2
    }
}

我在第 1 行收到一个编译器错误(很明显),指出该变量可能尚未初始化。

我知道默认情况下所有 int 数组元素都初始化为 0(因此第 2 行编译成功)但我的问题是为什么编译器不能将相同的逻辑(将所有 int 设置为 0)应用于常规(非数组)int变量。

是否有任何限制禁止编译器这样做?

【问题讨论】:

标签: java arrays


【解决方案1】:

当变量作用域是局部时,你必须初始化局部变量。

当您声明任何 本地/块变量 时,它们没有获得默认值。他们必须在访问之前分配一些值,否则编译器会抛出错误。

正如您在代码中看到的那样

int a; //Gives error because not assigned any value

当您为局部变量分配资源时,Java 不会将值写入内存。你得到一个错误的原因是因为 Java 确保你在使用它之前给它一个值。 Sun 意识到这在 C 代码中可能是一个难以诊断的问题,因为您无法从编译器那里获得帮助,因此他们决定在编译时进行检查。

参考这个link

【讨论】:

    【解决方案2】:

    来自here:-

    局部变量略有不同;编译器从不分配 未初始化的局部变量的默认值。如果你不能 在声明它的地方初始化你的局部变量,确保 在您尝试使用它之前为其分配一个值。访问一个 未初始化的局部变量将导致编译时错误。

    【讨论】:

      【解决方案3】:

      在语句块中定义的局部变量在使用前总是必须初始化。

      但是成员变量,那些直接在类的主体中定义的变量,在创建对象时会自动初始化为 0。

      有用的线程here

      【讨论】:

        【解决方案4】:

        这是一个语言设计决定。

        对局部变量进行默认初始化可能会隐藏错误。局部变量的使用意味着您要先设置它。忘记设置,或者只设置在if中的简单情况都被捕获。

        【讨论】:

          猜你喜欢
          • 2012-11-10
          • 2015-02-08
          • 1970-01-01
          • 2012-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-01
          • 2012-09-07
          相关资源
          最近更新 更多