500エラーが発生した際の対処法
14.4 500エラーが発生した際の対処法
500エラーが起きるのは、画面遷移の処理を進める中で例外が発生した時になります。
本節では500エラーが発生した際の対処法とその手順を説明します。
14.4.1 サーブレットクラスの初期化中にエラーが発生した
図 14.4.1 サーブレットの初期化に失敗したエラーメッセージ
図のようなメッセージが表示されるのは、web.xmlに記述したサーブレットクラスに正しく遷移できなかった時となります。この時は、以下の点について確認しましょう。
①web.xmlのservlat-classタグの記述は正しいか
②サーブレットのファイル名・クラス名は正しいか
③サーブレットのクラスが適切に定義されてるか(servletクラスを継承できているか)
④WEB-INF\classesの対象のパッケージの階層にクラスファイル(.class)が作成されているか
①~③に関しては対象のファイルの記述を直せば解決します。
図 14.4.2 主な確認箇所
④の場合は、作成したプログラムがきちんとコンパイルされていないので、自動的にビルドされる設定になっているか確認しましょう。
図 14.4.3 「自動的にビルド」にチェックが入っていれば自動的にclassファイルが生成される
14.4.2 JasperExceptionが発生
図 14.4.4 org.apache.jasper.JasperExceptionのエラーメッセージ
jspの記述内容にエラーがあって上手く動作しない時は、図のようなメッセージが表示されます。
エラーが発生した箇所の前後の行も出力されますので、以下の観点を参考に見直してみましょう。
・<%page %>タグの記述が埋め込み元と埋め込み先で完全一致していない
・charset=UTF-8の後ろに; が入っている
図 14.4.5 主な確認箇所
14.4.3 NullPointerExceptionが発生
500エラーの中で一番よく発生するといっても過言ではないのが、このNullPointerExceptionです。
図 14.4.6 例外にjava.lang.NullPointerExceptionと出ている
図のようなメッセージが表示された時は、エラーメッセージに表示されている行数の箇所で、nullを参照してしまったことにより、例外が発生しています。
対象のサーブレットやjspファイルの処理の流れをデバッグで確認し、きちんと値が受け渡しされているか確認しましょう。
①パラメータ名やリクエストスコープ名が完全一致しているか
入力フォームのname属性に指定したパラメータ名と、遷移先画面でgetParameter()メソッドを呼び出す時の引数に設定している文字列が一致していないと、パラメータの値が受け取れず、nullになります。
同様に、リクエストスコープやセッションに設定した時につけた名前と、遷移先画面でデータを取得する時の引数に設定している文字列についてもそれぞれ一致している必要があります。
図 14.4.7 名前が一致せず、受け渡しに失敗しているケース
また、設定したデータがパラメータなのか、リクエストスコープなのか、セッションなのかは常に意識して、きちんと設定した時と同じ形式で取得させるようにしましょう。
図 14.4.8 セッションに登録したデータをリクエストスコープで受け取ろうとしてる
パラメータで値を送る際は、パラメータを設定しているformタグの中に送信ボタンがあることを確認しましょう。もし、別々のformタグで囲まれていた場合は、行き先のサーブレットが同じだとしても、その時押された送信ボタンと同じformタグの中に書かれた情報だけが画面遷移先に送付されます。
図 14.4.9 フォームが2つに分かれている
②nullが格納された変数を参照してる箇所が無いか
DTOを使う処理でよくあるのが、オブジェクトを生成し、各フィールド変数を初期した後に一度も値が代入されていないフィールド変数のgetterメソッドを呼び出した際にNullPointerExceptionが発生するエラーです。
まずは、デバッグ機能を使って、nullになっている箇所が無いか確認してみましょう。突然処理が終わってしまったりfinally句に移動してしまった場合は、その行でNullPointerExceptionが発生していますので、変数の値が更新されない原因をソースコードをさかのぼって確認してみましょう。
また、検索結果が0件の場合や初回起動時など、変数の値がnullになる可能性がある処理を組み立てる場合は、予めnullかどうかのチェックを組み込むようにしてみましょう。
14.4.4 IllegalStateExceptionが発生
図 14.4.10 IlligalStateExceptionのエラーメッセージ
図のようなメッセージが表示された時は、DB接続に関わる処理でエラーが発生しています。
メッセージのIlligalStateExceptionの右側に挙げられている例外の種類に着目し、以下の点について確認しましょう。
①com.mysql.jdbc.CommunicationsExceptionの場合
図 14.4.11 com.mysql.jdbc.CommunicationsExceptionのエラーメッセージ
この例外が発生した時は、DB接続に失敗しています。xamppのmysqlが起動しているか確認しましょう。
②java.lang.ClassNotFoundExceptionの場合
図 14.4.12 java.lang.ClassNotFoundExceptionのエラーメッセージ
この例外が発生した時は、JDBCのドライバーが正しく参照できていなかったり、getConnectionメソッドで引数に設定しているDB接続情報(RDB_DRIVE)の内容に誤りがあります。13章の手順を参考に、ビルド・パスの設定やDAOクラス内の記述を見直してみましょう。
③java.sql.SQLExceptionの場合
図 14.4.13 java.sql.SQLExceptionのエラーメッセージ
この例外が発生した時は、データベース接続を行う際に設定しているDB名やユーザー名、パスワードに誤りがあることが原因です。接続情報の定数に設定している文字列を見直してみましょう。
④MySQLSyntaxErrorExceptionの場合
図 14.4.14 MySQLSyntaxErrorExceptionのエラーメッセージ
この例外が発生した際は、テーブル名に誤りがある、またはSQL文に文法誤りがあることが原因です。
エラーメッセージにどこが間違っているのか、SQLのどの部分から先が実行できないのかが出力されますので、それをヒントにDAOクラスの処理を修正してみましょう。