"aa".equals(a)という書き方はなぜ空のポインタを避けることができるのか.
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つの異なる比較文のテストでは、1つ目の文には空のポインタ異常は現れず、2つ目の文には現れません.だから変数と定数を比較するときは、定数を前に置くのが一般的です.空のポインタが異常にならないようにします.しかし、私の問題は、変数が前にあるとき、変数を読み、変数が空になると、異常が発生します.なぜ変数が後ろにあるとき、a変数は読まなくてもいいのですか?比較するならきっと読むでしょう.問題は前後の問題にすぎません.どうして後ろに置いて空のポインタを報告しないのですか?
前にこの問題について、会社に勤めていたときに、空のポインタを避けるための書き方だと言われました.確かに検証してみましたが、空のポインタを避けることができます.その後、上の私が提起した問題を深く究明しようとしたとき、古い同僚は、これもプログラミング規範を形成していると言った.今日規範を考えてみると、一定の理由もある.
今日、私たちの技術交流グループにこの問題が発生し、私の考えを引き起こしました.
そこで投稿しました
stringクラスの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;
}
でも私の質問が来ました
ソースは見ても分かりますが、ソースでanobjectが空の場合、空のポインタ異常は発生しませんか?その後、議論を経て、私の結論はこうでした.
問題は呼び出し方法に現れたことです.null値のため、Stringオブジェクトではありません.宣言されたStringオブジェクトリファレンスを使用して、Stringオブジェクトのインスタンスメソッドを呼び出します.もちろんだめです.nullはメソッドを呼び出した.
だからシステムは、空のポインタが異常だと報告しました.
だから、文章のタイトルに呼応して、本当に制御針の異常を避けました.結局「aaa」という形式はnull形式ではなく、メソッドを呼び出すことができます.次にStringクラスのequalsメソッドで比較すればOKです.