質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.09%

処理されない例外の型

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 12K+

score 87

下記のようなコードを書いていると
Customer customer = dao.search(loginname,password);//カスタマーDAOで見つけた値をcustomerに代入
の部分でエラー表示が出て「処理されない例外の型」と出ます。
この表示が出る理由と対処法を教えていただけますでしょうか?
よろしくお願いいたします。

OS windows10
エディション enterprise
言語 java8.0.1310.11
MariaDB10.1
HeidiSQL
eclipse NEON

package NewOne;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import beans.Customer;
import dao.CustomerDAO;

/**
 * Servlet implementation class Login
 */
@WebServlet("/Login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //doGet(request, response);
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

        HttpSession session = request.getSession();//セッション用意

        String loginname = request.getParameter("loginname");//パラメータ取得
        String password = request.getParameter("password");//パラメータ取得

        CustomerDAO dao = new CustomerDAO();//カスタマーDAOインスタンス化

        Customer customer = dao.search(loginname,password);//カスタマーDAOで見つけた値をcustomerに代入


        if(customer != null){
            session.setAttribute("customer", customer);//見つかったらセッションに入れる!

            request.getRequestDispatcher("login-ok.jsp").forward(request, response);//ログイン完了のページへ
        }else{
            request.getRequestDispatcher("login-error.jsp").forward(request, response);//ログインエラーのページへ
        }

    }

}


dao.searchメソッドは下記のとおりです。

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import beans.Customer;

public class CustomerDAO extends DAO {
    public Customer search(String loginname,String password)
    throws Exception{

        Customer customer = null;

        Connection con = getConnection();

        PreparedStatement st = con.prepareStatement("select* from customer where loginname=? and password=?");
        st.setString(1, loginname);
        st.setString(2, password);
        ResultSet rs = st.executeQuery();

        while(rs.next()){
         customer = new Customer();
         customer.setId(rs.getInt("id"));
         customer.setLoginname(rs.getString("Loginname"));
         customer.setPassword(rs.getString("password"));

        }
        st.close();
        con.close();
        return customer;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

CustomerDAO.searchthrows Exceptionがあるので、このメソッドを使う側で「throws Exceptionする」、あるいは「Exceptionの例外を処理する」必要が出てきます。このように、RuntimeException以外の例外が飛ぶ場合は検査例外といって、正しく処理しないとコンパイルすら通りません。

なお、よほどの理由がない限り、throws Exceptionを宣言するのは幅が広すぎます(何が来るのかわからないと、例外を処理する方も大変になります)。おそらく、java.sql.SQLExceptionあたりまで絞れるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/21 14:09

    ご回答ありがとうございます!
    CustomerDAOのthrowsExceptionと連携していたのですね。
    例外を絞る事と例外の種類をもっと勉強しなおそうと思います!
    今回は構造が分かって助かりました!
    ありがとうございました!

    キャンセル

+1

このDAO っていうのもわかりませんし、Java自体使い慣れていないですが。
( 一応趣味でC++ )

このエラーメッセージはたぶん、「例外処理されていない」ことが原因かもしれない。

具体的にどれが投げているかわかりませんが、

CustomerDAOクラスあたりが何かしらの例外を投げていて、catchされていないためとか。

それか、存在しない例外クラスを投げているとか。

もしかするとJavaでは クラスやメソッドに throws 例外 と記載したら

少なくとも一回は投げる処理がないとダメとか?

( ifとかで 投げる場合と投げない場合の2種類用意できるとしても、内部で一回はthrowがないとダメとか. )

C++ではそれはありえませんが、Javaだとどうだろう?

少なくとも例外処理関係だろうと思う。

それかそれより前の処理とか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/21 14:04

    ご返信ありがとうございました。
    例外処理についてtryとcatchを勉強しなおしたいと思います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る