スッキリわかるサーブレット&JSPを参考につぶやきサイト「笹焼」を作成しました。
そのつぶやきサイトを作成するのに苦労した点をいくつかあげて行きたいと思います。
1.まずはじめに
作成したサイトは、「スッキリわかるサーブレット&JSP」をしっかりと読んでいればほぼ確実にできます。
スッキリわかるサーブレット&JSP入門 第2版 (スッキリシリーズ)
しかし環境の違いがエラーに繋がり解決を行うのに時間がかかってしまいました。
この本は基本Windows環境なのとデータベースはH2というデータベースを使用しています。
macOSの場合はWindowsでのパス環境設定などが記載されているとそこでつまずいたりしてしまったり、url設定でつまずいたりしてしまうので最短でプログラムを作成したいという方に、Windows環境での作成をおすすめします。
私はMacを使用していますが、時間はかかりましたが良い勉強になったので作成してみて非常に良かったと思っています。
2.どんなサイト?
JSP,servlet,BO,DAOを使用した下記の機能のページがあります。
・ログインページ
・投稿ページ
・データベース連携
ウェブサイトとしては、
ささやいたコメントが記録されるサイトとなっています。
苦労した点
一番苦労したのはプログラム実行時に発生した、「NullPointerException」のエラー解決です。
多分解決するのに8時間くらいかかりました。
8時間もかかってしまった理由は、
・とりあえずプログラムを写経した
・データベースをMySQLで扱おうとした
・その他細かい間違えの修正
特に上2つは初心者の内に行うのは良くないので反省です。
NullPointerException
実際のエラーがこちらの画像になります。
例外は出てきた瞬間「うわっ」となります。
特にプログラミングを始めて一ヶ月くらいのときなんかは、解決への壁が高すぎて挫折します。
ウォール・マリアです。
問題解決へは一旦落ち着いて冷静になり、出力されたページを見ていきましょう。
上記の場合はHTTPのStatus500ページが出ています。
例外が発生した場合はこのエラーページが出力され、
どこで例外が発生したか?やどんな例外が発生しているのか?などの例外レポートが中に記してあります。
例外には発生した「行番号」の記載があります。今回は32行目。
根本原因に「例外の種類」があります。今回はNullPointerException
<!--今回の例外発生ポイント↓ -->
<% for(Mutter mutter : mutterList) { %>
<p><%=mutter.getUserName() %>:<%= mutter.getText() %></p>
<% }%>
自分なりの解釈だとmutterListの中が空っぽですといってるのではないかと思います。
なのでその中身が書いてあるファイルを見直して行くことにしました。
解決
結論から書くと、
daoパッケージのSQLに送るSELECT文が間違っていて、FROMの先にデータベース名を記載している事が一番の原因でした。
本来はテーブル名を記載しなければなりません。
SQL文が通せず値がスコープにセットできてない為、nullと怒られていました。
というように、
NullPointerExceptionが出た場合は値がうまく渡せてないことが多いです。
エラー解決の為にしたことは、
①プログラムの動きを理解する
②受け渡している値に誤時脱字がないか?(直接的な原因はほぼこれ)
③データベースは書籍通りのソフトを使用する
書籍の通りに書けばプログラムは動きます。
私は最初書籍が間違えているんじゃないかなと本気で思いました。
出来ないと疑心暗鬼になる。プログラミングあるあるではないでしょうか?
私のように困る方がいるのではないかと思い、
もうエラー解決の為に行ったことを詳しく見ていきます。
①プログラムの動きを理解する
ページを順に追っていきます。
大変ですがこれが出来ないとたぶんプログラム作れません。
この作成した投稿サイトだと、
MVCモデルとDAOを使用するのでこの動きは必須です。
ポイントはちゃんと各スコープに値をしっかりとセットできているか?です。
私は分からなくなりそうならページを追いながら独自のコメントをつけて行きます。
後から思い出しやすいですが、ちょっとごちゃごちゃします。
②受け渡している値に誤時脱字がないか?(直接的な原因はほぼこれ)
直接の原因はほぼこれといっていいと思います。
これだけプログラムが多くなるとほぼ100%どこかでミスります。
とくに大文字や小文字の間違え、ちょっとした脱字自分では完璧と思っていてもどこかに潜んでいる可能性が高いです。
前述の動きを追いながらでいいので一緒に確認をしていくと良いと思います。
③データベースは書籍通りのソフトを使用する
これは変な意地をはらずに最初は書籍通りH2データベースを使用した方がいいです。
urlやドライバの問題でエラーを起こす可能性があります。
今回のNullPointerExceptionの場合は、プログラムでエラーが起きているのか?データベース連携でエラーが起きているのかはっきり分からなくなります。迷宮壁ラビリンス・ウォールに突入します。
なので慣れないうちは間違えの少ない法をチョイスしてとりあえずプログラムを完成させて自身をつけましょう。
私は冒頭に書いたようにmacOSを使用していたので、書籍とは明らかにurlが異なります。
調べるのに少し苦労したので、私が使用したH2データベースのDRIVER_NAMEとJDBC_URLをこちらに載せて置くのでよかったら参考にしてください。
DRIVER_NAME ="org.h2.Driver";
JDBC_URL ="jdbc:h2:tcp://localhost/~/データベース名";
まとめ
ダメとは分かっていても気持ちが前にでてしまい、とにかくプログラムを書くことだけに集中し、
そして自分の用意した書籍に沿わずにMySQLでデータベースを扱ったことで、どこでエラーが発生したか分からなくなり結局最初から見直して行くことなってしまいました。
前提として大事なのはプログラムをしっかりと理解することは必須になります。
エラー解決と向き合い一つずつ解決していくことでよりプログラムのことも理解が出来、成功体験を積む事が出来たので良い経験となりました。
最後までお読み頂きありがとうございます。
今回参考にした書籍はこちらになります。(※私のは初版リンクは最新版)
読みやすいので初学者にオススメです。
スッキリわかるサーブレット&JSP入門 第2版 (スッキリシリーズ)
駆け出しエンジニア けいこ♂
コメント