nullPointerExceptionとの遭遇

10133 ワード

自己紹介

  • 22卒、SE1年生。
  • 都内IT企業勤務。
  • 高校教員免許取得、基本情報技術者(FE)。バイクに乗りたくて最近普通二輪免許を取得。
  • 大学時代パソコンはちょくちょく触っていたため人並程度のスキルはあるが、プログラミングに関しては未熟者。

こんにちは。noelです。

会社の研修中にNullPointerExceptionで少し躓いたので、備忘録として残します。
新人さんはおそらく通る道だと思います…。

使用言語はjavaです。

NullPointerExceptionに遭遇した

研修で、データベースを利用した図書館の管理システムを作ることになりました。

データベースに格納されている情報は次の通りです。

データベース定義

ISBN title price
データ型 varchar(10) varchar(100) integer
制約 PRI NOT NULL

データベース格納情報

ISBN title price
10001 羅生門 1100
10002 伊豆の踊子 1200
10003 坊っちゃん 1300
10004 源氏物語 1400
10005 こころ 1500

メインの機能の一つとして、ISBNをコンソールから入力(inputIsbn)し、検索にひっかかった本のレコードを削除する機能があります。

そこで入力する値と一致する本の情報をdeleteBookに格納しています。

処理を行うメソッド内(必要箇所だけ抜粋)

BookListFunction.java
Book deleteBook = objDao.selectByIsbn(inputIsbn);

if (deleteBook.getIsbn().equals(null)){
  system.out.println("削除対象のISBNは存在しませんでした")
}

BookDAO.java(必要箇所だけ抜粋)

BookDAO.java
public Book selectByIsbn(String isbn){

  connection con = null;
  Statement  smt = null;
  Book book = new Book();

  try{

    String sql = "SELECT * FROM bookinfo where isbn = '" +
    isbn +  "'";

    //DB接続
    con = BookDAO.getconnection();
    smt = con.createStatement();

    //SQL発行
    ResultSet rs = smt.executeQuery(sql);

    //検索結果をbookに格納
    while(rs.next()){
      book.setIsbn(rs.getString("isbn"));
      book.setTitle(rs.getString("title"));
      book.setPrice(rs.getInt("price"));
    }

    } catch(Exception e){
      …省略…
    } finally{
      …省略…
    }

    return book;

}

Book.java

Book.java
private String isbn;
private String title;
private int price;

//以下アクセサは省略

ここで、入力値(inputisbn)を「10006」として実行すると、実行時エラーとなります。
エラーの内容は、「NullPointerException」です。

原因

ISBNが10006と一致する本はデータベース上にないので、戻り値としてdeleteBookには空のbook(null,null,0)が帰ってきます。

処理メソッド内の条件式であるdeleteBook.getIsbn()でゲットした情報はもちろんnullです。
つまりif文の中身は「null.equals(null)」となっているのですが、これはダメなようです。実体のないものをイコールはできないということでしょう。

「文字列型の比較はequalsメソッドで」という固定観念から出たエラーでした。

解決

BookListFunction.java
if (deleteBook.getIsbn() == null){
  system.out.println("削除対象のISBNは存在しませんでした")
}

が正解のようです。
nullかどうかはイコールで判断するのですね…。

さいごに

例外処理は奥が深いと感じました(素人感想)。

Bookクラスのコンストラクタ等で初期値をうまくコントロールできれば…とも思いましたが、どうなのでしょう。もう少し知識をつけてから見直してみます。

今後も躓いたところをアウトプットしていければと思います。