-3

私はこのような非常に単純なJavaコードを持っています(これは単なる抜粋です):

for(;;)
{
  AnObject object = null;
  for(AnObject elem : list) // where the list is of the type List<AnObject>
  {
    if(<some dynamic condition goes here>)
    {
      object = elem;
    }
  }

  Log.v(TAG, object.property); // was initially omitted, added for the answer

  // more code skipped for simplicity

  if(object == null)
  {                  //
    break;           //
  }                  // this all is marked as dead code
}

Eclipseでは、コメント付きのフラグメントはデッドコードとしてマークされます。なんで?final条件に要素はありません。object変数は、サイクルの最初の部分を除いて、定数nullのどこにも割り当てられません。ただし、その後は通常はオーバーライドされますが、常に発生するとは限りません。はobject、nullでも非nullでもかまいません。

私は何かが足りないのですか?

答え

さて、私は答えを見つけました、そしてそれを示すために私は私の例に1行のコードを追加しなければなりません、それはコードの抜粋を単純化しようとしたときに誤って省略しました、しかしそれは重要です。行は次のとおりです。

Log.v(TAG, object.property);

したがって、オブジェクトはnull以外である必要があります。そうでない場合、例外によってコードに到達できません。この行はデバッグ目的で一時的に追加されたため、私の考慮​​から外れました。

4

3 に答える 3

1

私は日食でその警告を再現できません。

元の質問のコードの一部を誤って忘れてしまい、背後にあるコードが実行されない状況につながる可能性があります。ifステートメント全体をその本体だけでなくデッドコードとしてマークしたので、これは事実のようです。その欠落している行は、実際に使用するものである可能性があります(おそらく、のプロパティのobject1 つにアクセスしようとするログ ステートメントと同じくらい単純です)。object

状態が死亡とマークされていなくてもif、その体はまだ死亡している可能性があります。objectではないnull(if本体は実行されない) か、または が null の場合はobjectNullPointerException欠落している行に a がスローされ、そこで実行が停止します。

于 2012-07-11T16:28:38.113 に答える
0

以下のプログラムでは再現できません。

import java.util.Date;
import java.util.LinkedList;
import java.util.List;


public class Test {

    public static void main(String[] args) {
        for(;;)
        {
            List<Object> list = new LinkedList<Object>();
          Object object = null;
          for(Object elem : list) 
          {
            if(new Date().getSeconds() % 3 == 0)
            {
              object = elem;
            }
          }
          if(object == null) 
          {                  
            break;           
          }                  
        }

    }

}

これは Java SE 1.7 を搭載した Eclipse 3.7.2 です。

于 2012-07-11T14:35:46.940 に答える
-1

list が null の場合 (コードに list の init がない場合)、Object を初期化することはありません。 私のトラッシュトーク、悪い。

内部の 'if' が常に false になる場合、その内部でデッド コードがマークされる可能性があります。要素が null の場合、最終的な比較は引き続き適用されます。デッド コード ブロックの前に戻ると、到達不能コード エラーが発生します。

他の人が言うように、それを複製することはできませんでした。

于 2012-07-11T14:36:37.133 に答える