0

所有代码都在 Java 中。

public class TestLocal 
{
    public static void main(String [] args) 
    {
        int x;
         if (args[0] != null) 
         { // assume you know this will
           // always be true
             x = 7;  // statement will run
         }
     int y = x; // the compiler will choke here
    }
}

所以,我的问题是为什么编译器会在这里窒息?它是否绕过 if 语句(这看起来很可怕......)如果我在 if 语句块之外初始化 x 则编译器不会抱怨,如以下代码所示:

public class TestLocal 
{
    public static void main(String [] args) 
    {
        int x;
        x = 7; // compiler is happy now..:)
        if (args[0] != null) 
        { // assume you know this will
         // always be true
         // statement will run
        }
        int y = x; // the compiler not complain here now.
    }
}

为什么编译器会出现如此可怕的行为?

4

7 回答 7

5

Java 要求您初始化局部变量作为安全措施。它可以防止您意外读取奇数值。如果编译器没有抱怨并且您要读取 x 的值,那么它可能是任何东西。

于 2013-08-08T06:58:11.820 回答
2

好吧,事情args[0]可能是null,然后x在使用前不会被初始化。这就是编译器向您抱怨的原因。

于 2013-08-08T06:57:56.300 回答
2

当您不传递参数时,String[] 数组没有任何内容并且未初始化。所以在这种情况下 if 条件不会为真,甚至它会在线程“main” java.lang.ArrayIndexOutOfBoundsException: 0中抛出异常。现在假设您已在代码中的某个位置将 args[0] 设置为 null 值,那么 if(args[0]) != null) 将评估为 false 。在这种情况下,您分配int y= x; 其中 x 未初始化。而且我认为您应该知道编译器会考虑这些事情在java中,在初始化之前不能使用局部变量。

这就是为什么智能 Java 编译器会为您提供编译时错误并正确告诉您代码的原因。

:-)。希望你明白了。

于 2013-08-08T07:34:43.817 回答
1

根据 java 局部变量必须在使用前进行初始化。
在您的情况下,您尝试在条件中对其进行初始化。条件永远不会保证执行(在运行时它可能会根据条件执行或不执行)并尝试分配给y变量。
所以编译器会警告它。

于 2013-08-08T07:01:03.003 回答
0

由于性能问题等原因,Java 不会自动初始化局部变量。所以在这里:

 int x;

x 仍然有一个未定义的值。编译器不允许您编译代码,因为您x在此行中引用:

int y = x;

它适用于第二种情况,因为您在将x其引用到其他地方之前进行了初始化。

当然,您正在语句x内部进行初始化if,但显然您的if评估结果可能是false,因此编译器会考虑到这一点。

于 2013-08-08T06:58:18.770 回答
0

整数 y = x; // 编译器会在这里阻塞

因为如果您的if块不执行(当 arg[0] ==null 时),那么 x 将不会被初始化。Java 编译器要求在使用变量之前对其进行初始化。

于 2013-08-08T06:58:34.947 回答
-1

您将x 声明为保存 integer 的空间,但由于您没有给它任何 integer 来保存,它仍然是 null

编译器会查看 if 语句的真假路径。如果 arg[0] 包含一些东西,那么你很好。否则,当您尝试设置 y = x 时,x 没有任何东西可以提供给 y,您会得到一个错误。

于 2013-08-08T07:09:55.277 回答