Java文字列比較方法equalsの空のポインタが異常に解決されました。


Java言語で文字列の比較には、==とequals()の2つの方法があります。
「=」は、2つのStringタイプ変数の参照に対して比較され、2つのStringタイプの変数が同一のStringオブジェクト(すなわち同じメモリスタック)を指す場合、trueに戻る。equals()メソッドは、Stringオブジェクトのパッケージの文字列内容を比較し、同じtrueに戻る。
equals方法で他の値と比較すると、空のポインタが外れてしまう可能性があります。小さいプログラムを書いて例を挙げます。

public class StringEqual {

 public static void equal1(String i, String j) {
 try {
  if(i.equals(j)) {
  System.out.println("equal1  ");
  }
 } catch (Exception ex) {
  System.out.println("equal1   :");
  ex.printStackTrace();
 } finally {
  System.out.println("equal1  ");
 }
 }

 public static void equal2(String i, String j) {
 try {
  if(j.equals(i)) {
  System.out.println("equal2  ");
  }
 } catch (Exception ex) {
  System.out.println("equal2  :");
  ex.printStackTrace();
 } finally {
  System.out.println("equal2  ");
 }
 }
 
 public static void main(String[] args) {
 equal1(null,"abc");
 equal2(null,"abc");
  }
}

プログラムを実行すると、最初の方法はjava.lang.Null PointerExceptionの異常を投げましたが、第二の方法はありません。これはなぜですか?
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;
}
ここでは、if(anObject instance of String)で、着信されたオブジェクトがStringタイプかどうかを判断し、falseに直接戻ります。
したがって、equalsを使用する方法では、もし数値が空のオブジェクトの例であっても、equals方法を呼び出した場合には、必ず「定数」.equals(変数)または後に入力されるequals(前の)に従ってください。このようにすれば、できるだけ空のポインターを避けることができます。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。