-1

ブール値のオペランドの順序は、評価の順序に影響しますか?例として、私は頼ることができますか

String s = ...;
if (s != null && s.length() > 10) ...

Java言語では評価の順序が定義されておらず、のnull値がsNPEを引き起こす可能性があることを覚えているようです。これは、(a)原則として、(b)一般的なJava実装で実際に当てはまりますか?

更新:正確な重複が見つかりませんでした。答えの意見の違いを見て、それに反対票を投じるのは興味深いことです-ああ、そうですね!

4

4 に答える 4

5

はい、それは重要であり、

...Java言語は評価の順序を定義しません

真実ではない。引数は左から右に評価されるため、のような式が。s != null && s.length() > 10をスローすることはありませんNullPointerException

15.7式-Java言語仕様の評価順序を参照してください。

于 2012-05-08T14:16:24.407 に答える
2

いいえ、それは真実ではありません。これは、nullポインタの例外を回避する正しい方法です。式の値がまだ明確でない場合にのみ、オペランドが評価され、次のオペランドが評価されます。

この意味は:

  • and演算子(&&)があり、最初のオペランドがfalseと評価された場合、2番目のオペランドは評価されません。
  • or演算子(||)があり、最初のオペランドがtrueと評価された場合、2番目のオペランドは評価されません。
于 2012-05-08T14:15:18.930 に答える
2

Javaおよび他の多くの言語は、ブール式の短絡評価をサポートしています。

&&||

Javaでは、&&および||は短絡ブール演算子です。これらを使用する場合、2番目の引数は、ステートメントの真理値を確認するために必要な場合にのみ評価されます。

&|

Javaでは、ビット演算子&|は非短絡ブール演算子でもあります。それらが使用される場合、両方の引数が常に評価されます。

于 2012-05-08T14:19:15.787 に答える
0

これは、短絡論理積と呼ばれます。つまり、前の部分が戻った場合、後の部分&&は評価されませんfalse

論理和または演算を短絡することさえあります。これは||、前の部分が戻った場合、後の部分を評価しませんtrue

このようなオペランドは通常、null投稿した例のようにチェックで使用されます。

である状態で以下(通常および演算子)を実行するとsnull結果は壊滅的なものになります。

if (s != null & s.length() > 10)

これは、を返してs.length()も評価が継続され、 onにつながるためです。ただし、短絡バージョンでは、2番目の部分は完全にスキップされます。s != nullfalseNullPointerExceptions.length()

于 2012-05-08T14:17:32.977 に答える