3

重複の可能性:
null の可能性がある文字列を比較するより良い方法

次のような if 条件があります。

if( !str1.equals(str2) )
{
    ---
    ---
    ---
}

ここで、str1 と str2 は 2 つの文字列オブジェクトです。

str1 が null である可能性があるため、以下のコードは上記と同等であり、null チェックを処理していますか?

if( !(str1==null ? str2==null : str1.equals(str2)) )
{
    ---
    ---
    ---
}

ありがとう!

4

6 に答える 6

5

2 つの null を等しくしたいと仮定すると、確かにそうです。メソッドによっては、NullPointerException が正しい応答になる場合があります。を知ることで、タイピングの多くを省くことができます

org.apache.commons.lang.StringUtils

!StringUtils.equals(str1, str2);同じ方法でヌルを処理します。

于 2012-04-04T17:17:00.173 に答える
5

Java 7 を使用している場合:

java.util.Objects.equals(str1, str2);
于 2012-04-04T17:18:22.840 に答える
4

はい、同じ結果になります。

もう少し具体的に言うと:

  1. null でstr1 ない場合は、前と同じ式に 3 項チェックを通過するだけなので、まったく同じです。
  2. str1 null の場合、str2null かどうかを確認するためのチェックになります。

三項式全体が out front でラップされている!ため、これは以前と同じように動作します。

もう少し明確にしたい場合は、と:str2==nullを実際に比較することができます。値の 1 つが既にであるため、それが適切な文字列等価チェックではなく参照チェックであることは問題ではなく、コードでもう少し明確になります (とにかく、私には)str1str2str1==str2null

ただし、他の人が言及したように、Apache Commons ライブラリには、このヌルセーフの等価機能が既に含まれていますが、かなりのライブラリを含める必要があります。一方、Apache Commons の機能は効果的に Java 自体の一部と見なされるべきであると多くの人が感じているため、追加の依存関係が必要かどうかは自分で決めることができます。

最後に、機能は技術的に同等ではありません。デフォルトの.equals()メソッドは をスローNullPointerExceptionしますが、同等性チェック コードは をスローしません。それがあなたが探していた動作である場合 (私はそうだと思います)、問題ありませんが、注意が必要です。

于 2012-04-04T17:15:38.667 に答える
2

nulls が等しいと見なし、 であることを許可str2すると、正しいように見えますnull。しかし、誰も信じないで、考えられるすべてのケースについてテストを書いたほうがよいでしょう。

于 2012-04-04T17:18:17.640 に答える
1

三項演算子を使用することは、そのチェックを行うための非常にばかげた方法であり、読むのがイライラする可能性があります。AND を使用するだけです。

if(str1 != null && !str1.equals(str2))
{
    ---
    ---
    ---
}

null チェックを行うために、まったく新しいライブラリをインポートする必要はありません。

于 2012-04-04T17:18:07.600 に答える
0

はい、コードはif、文字列が等しくない場合にのみブロックに入ります (文字列の 1 つだけが null であるか、両方が null ではなく異なる)。

それを行う別の方法は

if( (str1 == null && str2 != null) || !str1.equals(str2) ){
    // Only executes when strings are unequal
}

好みの問題です。三項演算子にアレルギーがある人もいます。(私は彼らが好き)。

于 2012-04-04T17:39:46.313 に答える