【JAVA】初心者バグをなくそう Part1 -はじめに-

■ はじめに。



私の現場では、現在製品のリリースも終わり、
お客様の研修も兼ね実際に利用していただくフェーズです。

私は今の研修フェーズから参画したのですが、
そこは驚くようなレベルの現場でした。。。

というのも、他の現場ではありえないような低レベルのバグが
毎日のようにあがります。

知っている方から言わせれば、findbugsなどのツールを使えば一発じゃんって言うところなのでしょうが、
最近はJavaの有用な雑誌も少なくなり初心者の方の情報源も少ないのかと思います。

そこで、なぜそれがいけないのかという説明も含め
実際にあがった初級レベルのバグを参考に
JAVAをこれから始める方、始めたばかりの方へ数回にわけ記事を投稿したいと思います。
タグ:初心者 java


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



posted by てる。 at 23:33 | Comment(0) | TrackBack(0) | 【JAVA】初心者バグをなくそう | このブログの読者になる | 更新情報をチェックする

【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】初心者バグをなくそう | このブログの読者になる | 更新情報をチェックする

【JAVA】初心者バグをなくそう PART3 -&と|の使い方-


先日は比較についての記事を書きました。

今回は、そのつながりで。
if文で ”かつ”、 ”または”というように複数の条件を合わせて条件を評価したいときがあります。
今日はそのお話です。


■”かつ”、”または”を使う



下記のソースは、『引数 test がnull値や空文字ではないか』
ということを確認しようとしているソースなのですが、 1つ問題があります。

これも実際にあったバグのひとつなのですが、どこがおかしいかわかりますか?


例1-1)間違えた if 文
public boolean requiredCheck(String test) {
    if (test != null & !test.equals("")) {
        return true;
    }
    return false;
}


条件をつなげつとき、 "&" や "|" のように1つだけ記述すると
その後の式も実行されてしまいます。

つまり、test==null の条件判定の結果がtrueでもfalseでも、 test.equals("")の部分の式は必ず実行されるということです。

もし引数test に null の値が入ってきた場合どうなるでしょう?
そう、NullPointerExceptionが発生してしまうのです。

そのため下記のように記述するのが正解です。


例1-2)正しい if 文
public boolean requiredCheck(String test) {
    if (test != null && !test.equals("")) {
        return true;
    }
    return false;
}


普通、& や | だけで評価をすることは少ないかと思います。
(わざと何らかの例外を発生させたい場合などは除きます。)

なので、少し雑ですが、"&&", "||"を常に使うと
覚えてしまっても良いかもしれません。


■重複した比較


バグではないのですが、関連した話をもうひとつ。

さて、上記の例を踏まえ、下記のようなソースを見たとき
皆さんはどう考えますか?


例2-1)
public boolean flgCheck(AbcBean bean) {
    if (bean == null || (bean != null && !bean.getFlg())) {
        return false;
    }
    return true;
}


例1-2を参考に考えると
もし、bean が null のときはそれ以降の式は実行されないので
"bean != null"の部分は必要がありません。
つまり、こんな感じ。


例2-2)
public boolean flgCheck(AbcBean bean) {
    if (bean == null || !bean.getFlg()) {
        return false;
} return true; }


どうですか、不必要な部分がなくなった分スッキリしませんか?

& なのか、&& なのか。
たった1文字で大きく動作が変わってしまうのですね。

&と|の使い方のお話でした。

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

&, | ではその前後の式すべて実行した後評価される。
&&, || では条件が成立した時点で評価が終了する。




タグ:java 初心者


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



posted by てる。 at 22:29 | Comment(0) | TrackBack(0) | 【JAVA】初心者バグをなくそう | このブログの読者になる | 更新情報をチェックする
×

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