public static void main(String[] args) { String a=null; if("aa".equals(a))//这种情形,不出现空指针异常 //if(a.equals("aa"))//出现空指针异常 { System.out.println(true); } else { System.out.println(false); } }
上記の 2 つの異なる比較ステートメントをテストすると、最初のステートメントではヌル ポインター例外が発生しませんが、2 番目のステートメントでは発生します。
したがって、変数と定数を比較するときは、通常、定数が最初に置かれます。 null ポインタ例外を回避するため。
しかし、私の問題は、変数が前にある場合、変数が読み取られ、変数が空の場合、例外が発生することです。
変数 a が最後に来ると、変数 a を読み取る必要がなくなるのはなぜですか?比較して必ず読みたいので、質問
は順番の問題です。 null ポインタが最後に配置されている場合にそれを報告しないのはなぜですか?
以前、この問題に関して、私が会社で働いていたときに、この書き方はnullポインタを避けるためであると他の人が言っているのを聞きました。実際に検証してみたところ、nullポインタを回避できることが分かりました。その後、上で挙げた疑問をさらに深く掘り下げたいと思ったとき、古い同僚が、これもプログラミング標準を形成していると教えてくれました。今日の標準について考えてみると、そこには一定の理由があります。
今日の技術交流グループでこの質問が出て、深く考えさせられました。
それで私は投稿をしました
文字列クラスのequalsメソッドを調べました
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
しかし、ここで問題が発生します
ソースコードを見て理解しましたが、ソース内のオブジェクトが空の場合コードでは、null ポインタ例外は発生しませんか?
その後、議論を重ねた結果、このような結論に達しました。
呼び出しメソッドで問題が発生します。 null 値は String オブジェクトではないためです。そして、宣言された String オブジェクト参照を通じて String オブジェクトのインスタンス メソッドを呼び出します。もちろん違います。 nullメソッドが呼び出されました。
つまり、システムはヌルポインター例外を報告しました。
それで、記事のタイトルを繰り返しますが、これにより制御針の異常が本当に回避されます。結局のところ、フォーム「aaa」は null ではなく、メソッドを呼び出すことができます。次に、String クラスの等しいメソッドに従って比較できます。
More "aa".equals(a) なぜこの書き方で null ポインタを回避できるのでしょうか。関連記事については、PHP 中国語 Web サイトに注目してください。