2

在语言规范中它说:

局部变量在使用前肯定是设置好的。虽然所有其他变量都会自动初始化为默认值,但 Java 编程语言不会自动初始化局部变量以避免掩盖编程错误。

Java中究竟是什么掩盖了编程错误?

一个解释这个的例子,会很好。

谢谢

4

2 回答 2

6

要理解这一点,您需要与 C/C++ 所做的比较。在 C/C++ 中,局部变量在声明时包含垃圾值。因此,如果您忘记分配值,编译器不会抱怨,并且对此类局部变量的所有引用都将使用垃圾值,从而导致意外行为。

在 Java 中,这种未初始化的局部变量会导致编译时错误,从而使开发人员在使用它之前将其显式初始化为有意义的默认值。

C/C++

int do_something(int value) {
    int i;
    if (value > 10) {
        i = value;
    }

    return i;
}

上面的代码片段在 C++ 中有效,但在 java 中无效。

int doSomething(int value) {
    int i;
    if (value > 10) {
        i = value;
    }

    //
    // This line will throw a compile-time error that 
    // `i` may not have been initialized.
    //
    return i; 
}
于 2012-12-03T16:34:16.137 回答
-1

“屏蔽编程错误”不是一种特殊的错误。这意味着它不想在您的编程中“掩盖”(隐藏、混淆、使其难以检测)错误。例如,以下代码有一个严重错误。我从未将 String 变量设置为任何值。

String theString;
System.out.println(theString);

此代码将编译但不会运行。你会得到一个空引用异常等。原因是该变量theString从未设置为值。另一方面,如果 Java 将变量设置theString为一个值(例如,一个空字符串,“”),程序将运行但不会打印任何内容。您可能会花费很长时间试图弄清楚这一点,因为 Java 会通过设置默认值来“掩盖”错误。

编译器试图在这里提供帮助,因为局部变量可能是很多问题的根源。Java 可以做的任何事情来暴露这些问题(与掩盖它们相反)都是有帮助的。

于 2012-12-03T16:35:36.230 回答