4
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 变量。

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

4

4 回答 4

4

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

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

有用的线程在这里

于 2013-08-31T07:15:41.840 回答
2

这里开始:-

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

于 2013-08-31T07:15:11.363 回答
0

这是一个语言设计决定。

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

于 2013-08-31T07:20:30.263 回答
0

当变量范围是本地时,您必须初始化局部变量。

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

正如您在代码中看到的

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

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

参考这个链接

于 2013-08-31T07:13:32.517 回答