【JAVA】初心者バグをなくそう Part2 -文字列比較-


まずは、最初なので超低レベルの話題あせあせ(飛び散る汗) 『文字列の比較』から始めたいと思います。
おそらく誰もが一度はやってしまったのではないでしょうか。

■文字列を比較する。


文字列の比較方法については、どの参考書でも載っているはずなのでが、
今の現場ではJAVA経験年数5年以上のベテランさんが上げているバグです。


それは、下記のようなコードでした。どこが違うかお分かりですね?


例1-1)間違った文字列比較
public boolean isBlank(String target) {
    if (target == "") {
        return true;
    }
    return false;
}

そう、JAVAでは文字列の比較は下記のようにします。


例1-2)正しい文字列比較
public boolean isBlank(String target) {
    if (target.equals("")) {
        return true;
    }
    return false;
}

簡単に言うと例1では、
  『引数のtargetという箱と""の入っている箱は同じですか?』
という意味になり、例2の場合では
  『引数のtargetという箱の中身と""は同じですか?』
の意味になります。

なので、中身同士を比べる例1-2)が正解となります。



■nullとの比較。



で、さらにソースを見るとがく〜(落胆した顔)。。。


例2-1)間違ったnullとの比較
public boolean isNull(String target) {
    if (target.equals(null)) {
        return true;
    }
    return false;
}

残念。
nullというのは箱が無いと同じ意味です。
存在しない箱と存在する箱の中身を比べると。。。

それに、もし引数ターゲットが本当に null だった場合、
equals メソッドを実行した段階で NullPointerException と
なってしまいますふらふら

なので、正解は

例2-2)正しい null との比較
public boolean isNull(String target) {
    if (target == null) {
        return true;
    }
    return false;
}

となります。

■異なるオブジェクトの比較。


さらにさらに。

例3-1)間違えたオブジェクトの比較
public boolean isNumber(Integer target) {
    if (target.equals("")) {
        return false;
    }
    return true;
}


何がおかしいかお分かりですか?
おかしなところが2つあります。
 ・Integer(数字の箱)の中身は文字列ということは無い。
 ・数字の箱の中身と文字列の箱の中身を比べても。。。

まず、1つ目ですが、
 おもちゃ箱の中に鼻をかんだティッシュが入っていたらどうですか?
 いやですねもうやだ〜(悲しい顔)
 現実の世界では絶対に無いとは言い切れませんが、
 JAVAの世界ではありえないことです。

そして2つ目
 おもちゃ箱とゴミ箱の中身を比べてうれしいことはありますか?
 ということです。


ただ、お兄ちゃんのおもちゃ箱の中身と僕の宝箱の中身であれば
比較する価値はあるかも知れませんね。

では、実際JAVAではそのようなことはあるのでしょうか?
あるか、無いかは別の機会で。


で、本題の正解ですが、”比較の必要が無い”です。
絶対にありえないものを比較しても絶対にfalseが戻ってくるので。



今回は、始めということもあり初心者の方でも知っている話をさせて頂きました。


■今日のポイントひらめき


文字列の比較は equals メソッドを使う
文字列のnull値確認は == を使う
異なるオブジェクトは equals で比較できない


■おまけ。


たかが比較、されど比較的なネットからの記事です。

文字列をequalsで判定する時
「x == y」が真なのに「x.equals(y)」が偽になるケースがあるのですがこれはJavaのバグでしょうか?


※この記事はあえてJavaの専門用語やオブジェクト思考的な考えは書きませんでした。
タグ:java 初心者


参考になりましたらクリックしていただけると励みになります。



posted by てる。 at 00:23 | Comment(0) | TrackBack(0) | 【JAVA】初心者バグをなくそう | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。