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]可能性がありnullx使用前に初期化されないということです。それが、コンパイラがあなたに文句を言っている理由です。

于 2013-08-08T06:57:56.300 に答える
2

引数を渡さない場合、String[] 配列には何もなく、初期化されていません。したがって、この場合、if 条件は true にならず、スレッド "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によると、ローカル変数は使用前に初期化する必要があります。
あなたのケースでは、条件で初期化しようとしています.Conditionsは実行することが保証されておらず(実行時に条件に基づいて実行される場合と実行されない場合があります)、y変数に割り当てようとしています。
したがって、コンパイラはそれについて警告します。

于 2013-08-08T07:01:03.003 に答える
0

とりわけパフォーマンスの問題のため、Java は自動的にローカル変数を初期化しません。だからここに:

 int x;

x にはまだ未定義の値があります。x次の行で参照しているため、コンパイラはコードのコンパイルを許可しません。

int y = x;

x他の場所で参照される前に初期化しているため、2 番目のケースで機能します。

確かにx、ステートメント内で初期化していますifが、明らかにif評価が になる可能性があるfalseため、コンパイラはそれを考慮します。

于 2013-08-08T06:58:18.770 に答える
0

int y = x; // コンパイラはここでチョークします

ブロックが実行されない場合if(arg[0] ==null の場合)、x は初期化されないためです。Java コンパイラでは、変数を使用する前に初期化する必要があります。

于 2013-08-08T06:58:34.947 に答える