25

次の Java セグメントでは、for-each ループに渡される変数リストが null であるため、NullPointException が発生します。

List<> arr = null;
for (Object o : arr) {
    System.out.println("ln "+o);
}

for (Object o : arr){ }と同等だと思います

for (int i = 0; i < arr.length; i++) { }

および/または

for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){ 
   type var = iter.next(); 
}

いずれの場合も、arr が null の場合、arr.length が発生するか、arr.iterator() が NullPointException をスローします。

for (Object o : arr){ }が翻訳されない理由が知りたい

if (arr!=null){
  for (int i = 0; i < arr.length; i++) { 
  }
}
and
if (arr!=null){
    for (Iterator<type> iter = arr.iterator(); iter.hasNext(); ){ 
       type var = iter.next(); 
    }
}

arr!=null 式を含めると、コードのネストを減らすことができます。

4

8 に答える 8

21

以下の理由が考えられますが、これについて誰かが考えたのか、いつ実装されたのか、実際の理由が何であったのかはわかりません。

  1. for(:) ループの現在の動作を示したように、非常に理解しやすいものです。他の動作はそうではありません

  2. このように動作するのは、Java ユニバースで唯一のものです。

  3. 単純な for ループと同等ではないため、2 つの間の移行は実際には同等ではありません。

  4. とにかく null を使用するのは悪い習慣であるため、NPE は開発者に、提案された動作で問題が隠されていることを伝える良い方法です。

  5. ループの前または後に配列で何か他のことをしたい場合はどうすればよいでしょうか... コード内で null チェックを 2 回行うことになります。

于 2013-04-28T04:07:37.320 に答える
1

null チェックを挿入しない理由は、定義されていないためです。foreach ループの規則は、Java 言語仕様のセクション 14.14.2 にあります。

なぜこのように設計されているのかというと、より大きな問題は、なぜそうしないのかということです。

  • それは自然なことです。foreach ループは、魔法のような動作のない同等の for ループのように動作します。

  • 希望です。通常、エラーが発生したときにコードが黙って失敗することは望ましくありません。

Alvin Wong によって提案されたパフォーマンスの問題は、せいぜいマイナーな考慮事項である可能性があります。JVM は通常、変数が常に非 null である場合に null チェックを最適化するため、パフォーマンスへの影響はごくわずかです。

于 2013-04-28T04:06:55.670 に答える
0

多くの場合、ガードを使用して null ポインター例外を回避することはお勧めできif(o != null)ません。null であってもまったく意味がないo場合があります。その場合は、例外が発生した場合に例外をスローしてログに記録する必要があります。

于 2013-04-28T04:05:29.623 に答える
0

「 for (Object o : arr){ } はと同等だと思います

for (int i = 0; i < arr.length; i++) { }"

どうしてそんなことを考えるのか?arrがnullの場合、arr.lengthが例外をスローしないようにするにはどうすればよいですか? null に長さを指定することはできません。

例外がスローされない場合for(Object o :arr)は、for(:) ループが arr が null かどうかを確認するのに十分なほどスマートであり、そこからアイテムを取り出そうとしないことを意味する必要があります。明らかに、for(;;) ループはスマートではありません。

于 2013-04-28T03:58:44.963 に答える
0

You have already answered your question, if arr is null arr.lenght throws NullPointerException. Therefore for (Object o : arr){ } is a equivalent to

for (int i = 0; i < arr.length; i++) { } 
于 2013-04-28T04:13:32.007 に答える