Javaの三項演算子の詳細の説明
@author:Jingdai
@date:2020.09.24
タイトルを見て、三項演算子について何か言いたいことがあると思わなければなりませんが、それは非常に単純ではありません。以前も同じように考えていましたが、今日までLeetCodeで少し問題があり、まだわからないことがあるのでまとめてみます。
短絡の問題
まず、Java
&&
で誰もが知っていることであり||
、短絡演算が効果です。論理演算子の最初の部分が演算の結果を決定できる場合、論理演算子の2番目の部分(次のような)の計算には進みません。次のコードではi
、後続の計算が短絡され、計算がないため、出力は1のままです。int i = 1; if (true || (i++) > 5) { System.out.println("test"); } System.out.println(i); // 1
三項演算子に戻りますが、三項演算子にも短絡効果がありますか?以下のコードを見てください。
int i = 5; int j = true ? 1 : ++i; System.out.println(i); // 5
5結果出力は三オペレータが直接、短絡の問題同様の論理演算子を有して記載されている
true
とfalse
コードが結果として書かれても、出力結果は5であるように、他の部分を占めることなく、結果テイク場所に対応します、順序による変更ではありません。int i = 5; int j = false ? ++i : 1; System.out.println(i); // 5
操作の順序
まず、次のコードを見てください。
int[] array = new int[5]; int i = 4; boolean flag = i++ > 4 ? true : false; System.out.println(flag); // false i = 4; int b = i++ > 3 ? array[i] : array[i];
i++
それが割り当て以来の最初の増加であることがわかっているので、flag
結果はfalse
よく理解されていますが、次のb
数の結果ですか?操作の結果を直接見てください。false Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at A.main(A.java:16)
結果は、配列境界例外がスローされることです。結果は、最後を比較すると
i
、値が追加されていることを示しています。この時点i = 5
で、配列の値を取得する時間は、配列境界例外をスローするため、次のように考えないでください。i
全体の値式が終了すると増加します。
パッケージングの問題
三項演算子を使用してパッケージングクラスを処理する場合は、NPEの問題に注意してください。以下のコードを参照してください。
int a = 5; Integer b = null; int c = true ? a : b; System.out.println(c); // 5
この例では、5が出力されますが、問題はありませんが、コードが少し変更されています。以下のコードを参照してください。
int a = 5; Integer b = null; int c = true ? b : a; System.out.println(c);
交換されたポジションが実行を報告する唯一で
a
あり、これが理由です。また、フロントが基本データ型であるため、いつが選択されるかはよく理解されています。したがって、パッケージが自動的に解凍されると、のようなコードになり、例外がスローされます。b
NullPointerException
true
b
c
b
null
NullPointerException
int a = 5; Integer b = null; int c = true ? b.intValue() : a; System.out.println(c);
ただし、コードは次のようになり、通常は問題にはなりません。
c
そのタイプのパッケージは受信できますがnull
、実行時NullPointerException
例外が発生するためです。実際、三項演算子の第2オペランドと第3オペランドが基本タイプのパッケージングと基本データ型であり、パッケージングタイプが選択されている場合、パッケージングタイプは自動的に開封操作を実行します。つまり、コードはまだ解凍操作であり、NullPointerException
異常に発生し、間違いを犯しやすいのです。int a = 5; Integer b = null; Integer c = true ? b : a; // 还是会变成Integer c = true ? b.intValue() : a; System.out.println(c);