サーブレットのエラー処理を完全解説!初心者でもわかる基本の考え方
新人
「サーブレットでエラーが起きたって言われたんですけど、正直エラー処理って何をすればいいのかわからなくて……」
先輩
「最初は戸惑いますよね。サーブレットのエラー処理は、プログラムで問題が起きたときに、正しく対処するための仕組みなんです。」
新人
「問題が起きたときに、画面が真っ白になるのはエラー処理ができていないからなんですか?」
先輩
「その通りです。エラー処理を理解すると、利用者にも開発者にもやさしいアプリが作れるようになりますよ。」
1. サーブレットにおけるエラー処理とは?(基本的な考え方)
サーブレットにおけるエラー処理とは、プログラムの実行中に問題や異常が発生した場合に、 そのまま処理を止めてしまうのではなく、決められた方法で対応する仕組みのことです。 エラーと聞くと難しく感じるかもしれませんが、簡単に言えば「トラブルが起きたときの対応マニュアル」を プログラムに用意しておくイメージです。
例えば、自動販売機でお金を入れずにボタンを押した場合、 何も表示されなかったら利用者は困ってしまいます。 しかし「お金を入れてください」と表示されれば、次に何をすればよいかがすぐにわかります。 サーブレットのエラー処理も同じで、エラーが起きたときに 適切なメッセージや画面を表示する役割があります。
サーブレットでは、Javaというプログラミング言語を使って処理を書きます。 Javaでは「例外(れいがい)」という仕組みがあり、 これを使ってエラーを検知し、対応することができます。 例外とは「通常とは違う特別な状態」を表すもので、 ファイルが見つからない、数値に変換できない、といった状況を知らせてくれます。
2. サーブレットでエラー処理が必要な理由と発生しやすい場面
サーブレットでエラー処理が必要な理由は、大きく分けて三つあります。 一つ目は、利用者が安心して使える画面を提供するためです。 エラーが発生しても、意味のわからない英語の文章が表示されるだけでは、 利用者は何が起きたのかわかりません。
二つ目は、開発者が原因を特定しやすくするためです。 エラー処理をしていないと、どこで問題が起きたのか調べるのに時間がかかります。 適切なエラー処理を行えば、ログと呼ばれる記録に情報を残すことができ、 修正作業がとても楽になります。
三つ目は、システム全体を止めないためです。 一部の処理で問題が起きても、全体が完全に動かなくなるのは避けたいところです。 エラー処理を行うことで、被害を最小限に抑えることができます。
サーブレットでエラーが発生しやすい場面としては、 利用者が入力した値が想定と違う場合や、 データベースに接続できない場合、 存在しないページにアクセスされた場合などがあります。 特に初心者のうちは、入力値のチェック不足によるエラーがとても多いです。
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SampleErrorServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String value = request.getParameter("number");
int num = Integer.parseInt(value);
response.getWriter().println("入力された数値は " + num + " です");
}
}
上記の例では、数字として扱えない文字が入力されるとエラーが発生します。 このようなケースを想定して、エラー処理を書くことが重要です。
3. エラー発生時の基本的な処理の流れと全体像
サーブレットでのエラー処理の基本的な流れは、とてもシンプルです。 まず、エラーが起きそうな処理をあらかじめ想定します。 次に、その処理中に問題が起きた場合の対応方法を決めます。 そして、利用者にわかりやすい形で結果を返します。
Javaでは、try と catch という仕組みを使ってエラーを処理します。 try の中に「エラーが起きるかもしれない処理」を書き、 catch の中に「エラーが起きたときの対応」を書きます。 これにより、プログラムが突然止まるのを防ぐことができます。
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TryCatchServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
int price = Integer.parseInt(request.getParameter("price"));
response.getWriter().println("価格は " + price + " 円です");
} catch (NumberFormatException e) {
response.getWriter().println("数値を正しく入力してください");
}
}
}
このようにエラー処理を書くことで、利用者には状況に応じたメッセージを表示できます。 また、サーブレットでは設定ファイルを使って、 特定のエラーが起きたときに専用のエラーページを表示することも可能です。 これにより、画面の見た目を統一し、より使いやすいシステムを作ることができます。
エラー処理は地味に見えるかもしれませんが、 サーブレット開発では欠かせない重要な要素です。 基本的な考え方と流れを理解するだけでも、 プログラムの安定性は大きく向上します。
4. try catch を使ったサーブレットの基本的なエラー処理方法
サーブレットにおけるエラー処理で、最も基本となるのが try catch を使った方法です。 これは Java 全体で使われている仕組みであり、サーブレットでも例外なく重要な考え方になります。 初心者のうちは「エラーが出たら直すもの」という意識が強くなりがちですが、 実務では「エラーが起きる前提で対策を書く」ことが求められます。
try catch の役割はとてもシンプルです。 try の中には、失敗する可能性がある処理を書きます。 catch の中には、実際にエラーが起きた場合の対応を書きます。 この構造によって、エラーが発生しても処理全体が止まらず、 利用者にわかりやすいメッセージを返すことができます。
サーブレットでは、リクエストパラメータの取得や型変換、 データベース処理など、エラーが発生しやすい場面が多く存在します。 特に入力値の変換処理は例外が発生しやすく、 try catch を使わないと画面がそのままエラー表示になってしまいます。
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ErrorHandlingServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
int age = Integer.parseInt(request.getParameter("age"));
response.getWriter().println("年齢は " + age + " 才です");
} catch (NumberFormatException e) {
response.getWriter().println("年齢は数値で入力してください");
}
}
}
この例では、数値に変換できない文字が入力された場合でも、 catch の処理が実行されるため、利用者は状況を理解できます。 また、エラー内容に応じて catch を複数用意することで、 より細かいエラー対応も可能になります。
try catch は万能ではありませんが、 最低限のエラー処理として必ず押さえておきたい基本です。 これを理解しておくことで、次に紹介する画面遷移を含むエラー処理も スムーズに理解できるようになります。
5. エラーページへリダイレクト・フォワードする仕組みと実装の概要
サーブレットのエラー処理では、 単にメッセージを出力するだけでなく、 専用のエラーページに遷移させる方法もよく使われます。 これにより、画面デザインを統一でき、 利用者にとっても安心感のある表示を提供できます。
エラーページへの遷移には、大きく分けてフォワードとリダイレクトの二種類があります。 フォワードは、サーバー内部で処理を引き継ぐ方法で、 URLは変わりません。 一方、リダイレクトは、別のURLへ再アクセスさせる方法で、 ブラウザのアドレスも切り替わります。
エラー処理では、リクエスト情報を引き継げるフォワードが 使われることが多いです。 エラー内容をリクエストスコープに保存し、 JSPで表示することで、柔軟なエラーページを作成できます。
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ForwardErrorServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
int price = Integer.parseInt(request.getParameter("price"));
response.getWriter().println("価格は " + price + " 円です");
} catch (Exception e) {
request.setAttribute("errorMessage", "入力内容に誤りがあります");
RequestDispatcher dispatcher =
request.getRequestDispatcher("/error.jsp");
dispatcher.forward(request, response);
}
}
}
このようにフォワードを使うことで、 エラーが起きた場合でも自然な画面遷移が可能になります。 実務では、エラー専用の JSP を用意し、 共通のレイアウトで表示するケースが多く見られます。
リダイレクトは、処理を完全に切り替えたい場合や、 二重送信を防ぎたい場面で使われることが多いです。 エラー処理では目的に応じて、 フォワードとリダイレクトを使い分ける意識が大切です。
6. web xml を使ったエラーハンドリング設定の理解ポイント
サーブレットのエラー処理は、 プログラム内だけで完結させる必要はありません。 web xml を使うことで、 特定のエラーやステータスコードに対して、 自動的にエラーページを表示する設定が可能です。
この方法のメリットは、 すべてのサーブレットに共通したエラー処理を 一元管理できる点にあります。 開発規模が大きくなるほど、 web xml による設定は非常に重要になります。
代表的なのは、例外クラスや HTTP ステータスコードごとに エラーページを割り当てる方法です。 これにより、想定外のエラーが発生しても、 利用者に専用の画面を表示できます。
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
この設定を行うことで、 サーブレット内で try catch を書いていなくても、 例外発生時に指定した JSP が表示されます。 特に共通エラー画面を作りたい場合には、 非常に有効な方法です。
ただし、すべてを web xml 任せにするのではなく、 入力チェックなどはサーブレット側で行うことが重要です。 プログラムと設定ファイルを組み合わせて使うことで、 より堅牢で保守しやすいシステムになります。
web xml を使ったエラーハンドリングは、 初心者には少し難しく感じるかもしれませんが、 仕組みを理解すると強力な武器になります。 サーブレット開発では、 コードと設定の両方からエラー処理を考える視点が大切です。
7. サーブレットで適切なエラー処理を行うメリットと実務での効果
サーブレットで適切なエラー処理を行う最大のメリットは、利用者と開発者の双方にとって安心できるシステムを実現できる点にあります。 エラーが発生した際に何も考えず例外をそのまま表示してしまうと、利用者は操作方法がわからず混乱し、 場合によってはサービス自体への不信感につながります。 一方で、事前に想定したエラー処理を実装しておけば、利用者は次に何をすればよいのかを自然に理解できます。
実務の現場では、エラー処理の質がそのままシステムの評価に直結することも少なくありません。 例えば入力ミスが起きた場合に、専門用語だらけのエラーメッセージが表示されるよりも、 「入力内容を確認してください」といった簡潔で親切な案内がある方が、利用者満足度は確実に向上します。 このような細かな配慮の積み重ねが、長く使われるシステムを支えています。
また、エラー処理は開発者にとっても大きな助けになります。 適切に例外を捕捉し、ログとして情報を残しておくことで、 障害が発生した際の原因調査が格段に楽になります。 実務では「なぜエラーが起きたのか」を短時間で特定できるかどうかが重要であり、 エラー処理が整っているシステムほど保守性が高いと評価されます。
さらに、サーブレットでのエラー処理はシステム全体の安定性を高めます。 一部の処理で問題が起きても、適切に処理を分岐させることで、 他の機能への影響を最小限に抑えることができます。 これは特に利用者数が多いサービスや、業務システムにおいて重要なポイントです。
結果として、エラー処理を丁寧に実装することは、 「トラブルに強いアプリケーション」を作ることにつながります。 初心者のうちは見落としがちですが、 実務ではエラー処理こそがシステムの品質を左右する重要な要素であるといえます。
8. エラー処理とリダイレクト実装時の注意点とよくあるミス
サーブレットでエラー処理やリダイレクトを実装する際には、 いくつかの注意点があります。 特に初心者がつまずきやすいのが、 処理の途中でレスポンスを確定させてしまうミスです。 レスポンスに出力した後でフォワードやリダイレクトを行おうとすると、 意図した画面遷移ができなくなります。
例えば、エラーが発生したにもかかわらず、 すでに画面に文字を出力してしまっていると、 その後でエラーページへ遷移できません。 このような場合、画面が崩れたり、 中途半端な表示になったりする原因になります。 エラー時の遷移を考える場合は、 レスポンスに直接出力するタイミングを慎重に設計する必要があります。
また、リダイレクトを使う場合には、 リクエストスコープの情報が引き継がれない点にも注意が必要です。 エラー内容をそのまま表示したい場合にリダイレクトを使うと、 メッセージが消えてしまい、原因がわからなくなることがあります。 このようなケースでは、フォワードを使う方が適しています。
よくあるミスとして、すべてのエラーを一律で処理してしまう点も挙げられます。 入力ミスとシステムエラーを同じ扱いにしてしまうと、 利用者に不要な不安を与えてしまいます。 エラーの種類に応じて表示内容や遷移先を分けることで、 よりわかりやすい画面を提供できます。
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RedirectErrorServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String value = request.getParameter("count");
if (value == null) {
response.sendRedirect("inputError.jsp");
return;
}
int count = Integer.parseInt(value);
response.getWriter().println("回数は " + count + " 回です");
}
}
上記のように、条件に応じて早めにリダイレクトを行い、 不要な処理を続けないことが重要です。 また、例外が発生する可能性がある箇所は、 事前にチェックすることでエラーそのものを減らすこともできます。
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SafeCheckServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String ageParam = request.getParameter("age");
if (ageParam == null || ageParam.isEmpty()) {
request.setAttribute("errorMessage", "年齢を入力してください");
request.getRequestDispatcher("/error.jsp")
.forward(request, response);
return;
}
int age = Integer.parseInt(ageParam);
response.getWriter().println("登録された年齢は " + age + " 才です");
}
}
このように事前チェックとエラー処理を組み合わせることで、 リダイレクトやフォワード時のトラブルを防ぎやすくなります。 エラー処理と画面遷移はセットで考えることが大切です。
9. サーブレットのエラー処理とリダイレクトの重要ポイント整理
ここまで見てきたように、サーブレットにおけるエラー処理とリダイレクトは、 単なる補助的な機能ではなく、アプリケーション全体の品質を左右する重要な要素です。 エラーが発生したときにどのような挙動をするかを事前に考えておくことで、 利用者にとっても開発者にとっても扱いやすいシステムになります。
まず押さえておきたいのは、 「エラーは必ず起きるもの」という前提で設計する姿勢です。 想定外の入力や通信エラーは、どれだけ注意しても完全には防げません。 だからこそ、エラーが起きたときにどう振る舞うかを サーブレットの段階で明確にしておく必要があります。
次に、フォワードとリダイレクトの使い分けを理解することが重要です。 エラー内容をそのまま画面に表示したい場合はフォワード、 処理を切り替えたい場合や再送信を防ぎたい場合はリダイレクト、 というように目的に応じて選択することで、 無駄のない画面遷移が実現できます。
また、web xml による共通エラー設定と、 サーブレット内の個別エラー処理を組み合わせることで、 柔軟で保守性の高い構成を作ることができます。 すべてを一つの方法に頼るのではなく、 役割ごとに適切な手段を選ぶ意識が大切です。
サーブレットのエラー処理とリダイレクトを正しく理解し実装できるようになると、 初心者の段階から一歩進んだ開発者として評価されやすくなります。 安定した動作とわかりやすい画面遷移を意識しながら、 実務でも通用するエラー処理の考え方を身につけていきましょう。