nullPointerExceptionとの遭遇
自己紹介
- 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に格納しています。
処理を行うメソッド内(必要箇所だけ抜粋)
Book deleteBook = objDao.selectByIsbn(inputIsbn);
if (deleteBook.getIsbn().equals(null)){
system.out.println("削除対象のISBNは存在しませんでした")
}
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
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メソッドで」という固定観念から出たエラーでした。
解決
if (deleteBook.getIsbn() == null){
system.out.println("削除対象のISBNは存在しませんでした")
}
が正解のようです。
nullかどうかはイコールで判断するのですね…。
さいごに
例外処理は奥が深いと感じました(素人感想)。
Bookクラスのコンストラクタ等で初期値をうまくコントロールできれば…とも思いましたが、どうなのでしょう。もう少し知識をつけてから見直してみます。
今後も躓いたところをアウトプットしていければと思います。
Author And Source
この問題について(nullPointerExceptionとの遭遇), 我々は、より多くの情報をここで見つけました https://zenn.dev/minoel/articles/null-pointer-exception著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol