数据类型初始化:数组 vs 常规

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)。

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


请查看https://dev59.com/SmYr5IYBdhLWcg3wpLv9。 - Prabhaker A
2
将来请在提问时适当地格式化您的代码-请参阅http://tinyurl.com/so-list。即使是虚拟代码,使用传统名称(而不是`returntest`)也会有所帮助-这样就不会分散注意力。 - Jon Skeet
4个回答

4

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

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

这里有一个有用的线程链接


2

来源在这里:

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


0
当变量的作用域为局部时,必须初始化局部变量。
当您声明任何 局部/块变量 时,它们不会获得默认值。在访问它之前必须分配一些值,否则编译器会抛出错误。
正如您在代码中所看到的。
int a; //Gives error because not assigned any value

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

0

这是一项语言设计决策。

为局部变量提供默认初始化值可能会隐藏错误。使用局部变量意味着您想要先设置它。忘记设置或仅在if中设置的简单情况都将被捕获。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接