【Java】バグを減らすために意識すること part1

目次

    1. Java実行時のエラーについて

    2. NullPointerExceptionとは?

    3. NullPointerExceptionが起きない実装

    4. まとめ

1.Java実行時のエラーについて

Javaプログラムはコンパイルが成功しても、実行した際にエラーが発生することがあります。Java言語では実行時に発生したエラーを例外と呼び、例外処理が発生したときに例外に対する処理を記述していない場合、強制的に処理を終了してしまいます。

今回はこの例外を未然に防ぐための実装についてお話ししたいと思います。

2.NullPointerExceptionとは?

例外にもいくつか種類がありますが今回はNullPointerException(いわゆるヌルポ)についてお話ししたいと思います。まずヌルポが起きる時はどんな時でしょうか?以下のサンプルソースからどこでヌルポが発生するか考えてみてください。


public class NullPoEducation {
    protected void outputEmployeeInfo(String strProc, ArrayList lstEmp ){
        if(strProc.equals("社員名出力")) {
            for(String strEmp : lstEmp) {
                System.out.println(strEmp);
            }
        }
    }
}

まずはoutputEmployeeInfoメソッドの第一引数がnullの場合、NullPointerExceptionが発生します。これは参照変数strProcがnullにも拘わらずstrProcからequalsメソッドを呼び出しているためです。このようにnullのオブジェクトからメソッド呼び出しを行うと起こります。

さらに第二引数がnullの場合もNullPointerExceptionが発生します。拡張For文に渡すリストがnullのためです。ではどのように実装すればヌルポを防げるのでしょうか?

3.NullPointerExceptionが起きない実装

オブジェクトの比較を行う際にequalsメソッドはよく使用しますが、上記のケースでは以下の様に実装することでヌルポが起きなくなります。


if("社員名出力".equals(strProc)) {

}

条件判定の文字列"社員名出力"はオブジェクトとして必ず存在するため、 ヌルポが100%起きなくなります。なのでNullの可能性がある場合はequalsメソッドのパラメタにするようにしましょう。

拡張For文は以下の様にNullチェックを入れることでヌルポを回避できます。


if(lstEmp != null){
    for(String strEmp : lstEmp) {
        System.out.println(strEmp);
    }
}

4.まとめ

 上記のことを気を付けるだけでNullPointerExceptionが回避できるようになるわけですが、もちろんNullの場合の動作や振る舞いは考えなければなりません。実装者で判断つかなければ設計者に確認したり、呼び元、呼び先の処理を追って判断したり、とコードを組む以上に考えさせられることがあります。特に既存処理を修正する場合はこの調査に労力がかかります。そこまで考慮した上でコーディングを行うとバグも少なくなるはずです。ではではこれにて失礼します。