5

Eclipseは、最後のelseifとelseはデッドコードだと言い続けていますが、私にはわかりません。

if (img0 != null && img1 != null) {
    code;

} else if (img0 != null) {
    code;
} else if (img1 != null) {
    code;
} else {
    code;
}

私は次のように推論します。

  1. bote img0 および img1 が null でない場合、if は true と評価されます
  2. false と評価された場合
    • img0 が null または
    • img1 が null または
    • img0 と img1 の両方が null です。
  3. 最初の elseif は、img0 が null でない場合は true と評価され、false と評価される場合は img1 が null でない可能性がある、または img0 と img1 の両方が null である可能性がある

「死」はどこにあるのですか?

前もって感謝します。

4

5 に答える 5

4

次の 2 つの方法でコードの使用を確認してください。

方法 1: -

public static void main(String[] args)
{
    String img0 = null;
    String img1 = "Asdf";

    /** Currently there is no code here, that can modify the value of 
        `img0` and `img1` and Compiler is sure about that. 
    **/

    /** So, it's sure that the below conditions will always execute in a
        certain execution order. And hence it will show `Dead Code` warning in 
        either of the blocks depending upon the values.
    **/

    if (img0 != null && img1 != null) {
       // code;

    } else if (img0 != null) {
        //code;

    } else if (img1 != null) {
        //code;
    } else {
       // code;
    }
}

この場合、dead codeブロックの直前に値を設定しているため、いずれかのブロックで確実に警告が表示されます。コンパイラは、これらのブロックの初期化と実行の間で値が変更されないことを確認しています。

方法 2: -

public static void main(String[] args)
{
    String img0 = null;
    String img1 = "Asdf";

    show(img0, img1);
}

public static void show(String img0, String img1) {

    /** Now here, compiler cannot decide on the execution order, 
        as `img0` and `img1` can have any values depending upon where 
        this method was called from. And hence it cannot give dead code warning.
    **/

    if (img0 != null && img1 != null) {
       // code;

    } else if (img0 != null) {
        //code;

    } else if (img1 != null) {
        //code;
    } else {
       // code;
    }
}

この場合、dead codeCompiler はshowメソッドがどこから呼び出されるかわからないため、警告は表示されません。img0およびの値はimg1、メソッド内の任意の値にすることができます。

  • 両方とも の場合null、最後elseが実行されます。
  • の場合one of them is null、いずれかelse ifが実行されます。
  • そして、それらのいずれもでない場合null、あなたのif意志は実行されます。

ノート : -

必要に応じて、- 、などwarningsの特定のケースでは表示されないように Eclipse を構成できます。Unneccessary elseUnused Imports

Windows -> Preferences -> Java (左側のパネル) -> Compiler -> Errors/Warnings に移動します。

于 2012-11-26T10:36:44.647 に答える
1

Eclipse は、U が評価ポイントに到達する前に、これらの変数がどの状態にあるかを把握できます。したがって、その状態を認識し、これにより他の条件を「デッド」に設定します。

String img0 = "";
String img1 = null;
if(img0 != null && img1 != null)
{
    int i = 0;
}
else if(img0 != null)
{
    int i = 10;
}
else if(img1 != null)
{
    int i = 100;
}
else
{
    int i = 1000;
}

2 番目の条件のみが死んでいません。

于 2012-11-26T10:51:57.713 に答える
0

Eclipseは、変数が設定されているかどうかを判断できます。このコードは、未使用のコードに関する警告を表示しません。両方の変数がnullではありません:

public void test() {
    Bitmap img1 = Bitmap.createBitmap(48, 48, null);
    Bitmap img0 = Bitmap.createBitmap(48, 48, null);
    if (img0 != null && img1 != null) {
        test();
    } else if (img0 != null) {
        test();
    } else if (img1 != null) {
        test();
    } else {
        test();
    }
}

ただし、このコードは警告を発します。これimg0null、Eclipseが次のように判断できるためです。したがって、ifと最初のelseifがヒットすることはありません。

public void test() {
    Bitmap img1 = Bitmap.createBitmap(48, 48, null);
    Bitmap img0 = null;
    if (img0 != null && img1 != null) {
        test();
    } else if (img0 != null) {
        test();
    } else if (img1 != null) {
        test();
    } else {
        test();
    }
}
于 2012-11-26T10:59:39.950 に答える
0

コンパイラーがインスタンスを既に作成していることを認識し、オブジェクトの1つが決してnullにならない場合に時々発生します...例

Image img1 = new Image(); 

この後、上記のように if else を書いています。

if (img0 != null && img1 != null) {
    code;

} else if (img0 != null) {
    code;
} else if (img1 != null) {
    code;
} else {
    code;
}

この場合、img1 が null になることはあり得ないため、else 条件に到達することはありません...

于 2012-11-26T10:56:27.100 に答える
0

これは問題なくコンパイルされます。あなたのエラーは別の場所にあるはずです!

public static void main(String[] args) {
    String img0 = nullOrString();
    String img1 = nullOrString();
    if (img0 != null && img1 != null) {
       // code;
    } else if (img0 != null) {
       // code;
    } else if (img1 != null) {
       // code;
    } else {
       // code;
    }
}
public static String nullOrString() {
    return Math.random() > 0.5 ? null : "abc";
}

変数がどこで初期化され、どこで変更される可能性があるかなど、もう少しコンテキストを示してもらえますか?

例を次のように変更すると

    String img0 = null;
    String img1 = null;

以外のすべてに対してデッド コードの警告が表示されますがelse、これは完全に理にかなっています (コードを分析すると、 のみelseが実行されることが示されるため)。

于 2012-11-26T10:50:55.527 に答える