"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です.