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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

3回答

15025閲覧

JavaでNullPointerExceptionというエラーが発生しています。

Tatsuro_186

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

1クリップ

投稿2016/05/29 09:11

編集2022/01/12 10:55

###前提・実現したいこと
Javaで社員検索アプリケーションを実装しています。

###発生している問題・エラーメッセージ
ログインする際に次のようなエラーが発生します。
説明 The server encountered an internal error that prevented it from fulfilling this request.

例外
java.lang.NullPointerException
bz.action.inaba.UserDAO.selectByIdAndPassword(UserDAO.java:44)
bz.action.LoginServlet.doPost(LoginServlet.java:44)
javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

###該当のソースコード
LoginServlet.java
package bz.action;

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 bz.action.inaba.UserDAO;
/**

  • @author AA450
  • Servlet implementation class LoginServlet

/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/
*
* @see HttpServlet#doGet(HttpServlet request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,IOException{

response.setContentType("text/html; charset=UTF-8"); // ログイン画面に遷移する処理を実行 response.sendRedirect("login.jsp"); } /** * @see HttpServlet#doPost(HttpServlet request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ // ログイン画面の入力値を取得する request.setCharacterEncoding("UTF-8"); String id = request.getParameter("id"); String password = request.getParameter("pass"); UserDAO dao = new UserDAO(); // セッションを取得する HttpSession session = request.getSession(false); // ログイン失敗の場合以下の条件を実行 if(!dao.selectByIdAndPassword(id,password)){ // セッションにエラーメッセージを保持する session.setAttribute("error_message", "ログインIDまたはパスワードが間違っています。"); // ログイン画面に転送する doGet(request,response); return; } // エラーメッセージを削除する session.removeAttribute("error_message"); // 従業員一覧サーブレットに転送する request.getRequestDispatcher("empView").forward(request, response); }

}

UserDAO.java
package bz.action.inaba;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import bz.action.DataSourceManager;

/**

  • USERテーブルをIDとパスワードで検索する
  • <pre>
  • 引数(IDとパスワード)で完全一致検索する
  • 該当するデータがある場合はtrue,データがない場合はfalseを返す
  • </pre>
  • @param id ログインID
  • @param password パスワード
  • @return 検索結果の有無

*/
public class UserDAO extends DataSourceManager {
public boolean selectByIdAndPassword(String id,String password) {

StringBuffer sb = new StringBuffer(); sb.append("select"); sb.append(" COUNT(*) 'COUNT'"); sb.append(" from"); sb.append(" USER"); sb.append(" where"); sb.append(" USER_ID = ?"); sb.append(" and PASSWORD = ?"); try{ PreparedStatement ps = conn.prepareStatement(sb.toString()); ps.setString(1, id); ps.setString(2, password); ResultSet rs = ps.executeQuery(); if(rs.next()){ return rs.getInt("COUNT") == 1; } } catch (SQLException e){ // TODOエラーメッセージを表示する }finally{ try{ conn.close(); } catch (SQLException e) { // TODOエラーメッセージを表示する } } return false; }

}

DataSourceManager.java
package bz.action;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DataSourceManager {
/*コネクション/
protected Connection conn;
/*コンストラクタ/
public DataSourceManager() {

try{ Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/test"); conn = ds.getConnection(); } catch (NamingException | SQLException e){ } }

}

###試したこと
mysqlとのデータベースの接続に問題があると思ったため、設定内容については確認しました。
eclipseではコード自体にエラー箇所はないと思われます。

###補足情報(言語/FW/ツール等のバージョンなど)
実行環境
開発ツール:eclipse
ローカルサーバー:tomcat
データベース:mysql

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2016/05/29 09:21

スタックトレースにて bz.action.inaba.UserDAO.selectByIdAndPassword(UserDAO.java:44) が出ていますので、UserDAOの44行目にてNullPointerExceptionが発生していますから、UserDAOまわりのコードに問題があるかと思われますので、UserDAOのソースコードもあると良いでしょうか。
guest

回答3

0

DataSourceManagerクラスならびにUserDAOクラスにて、conn(DB接続)が取得できていないため例外が発生していると思われます。

DataSourceManagerのcatch節にて例外が発生していないかを確認すると良いでしょうか。

public DatasourceManager() { try{ Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/test"); conn = ds.getConnection(); } catch (NamingException | SQLException e){ e.printStackTrace(); } }

と、スタックトレースを出してみると原因がわかるかと思います。
ちなみに、JNDI経由でデータソースをlookupされている(java:comp/env/jdbc/test)かと思いますが、これはTomcatないしは他のクラスにて設定されていますか?
その設定がない場合や、誤っている場合は取得できません。

投稿2016/05/29 10:03

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tatsuro_186

2016/05/29 14:15

データベースの設定ファイルであるファイルから接続しています。 スタックトレイスをしてみましたが、何もでできませんでした
A-pZ

2016/05/29 15:44

では同様にUserDAOにて catch節で行コメントで書かれている// TODOエラーメッセージを表示する の2個所にも、e.printStackTrace(); してみてください。おそらくですが、PreparedStatement ps = conn.prepareStatement(sb.toString()); にてNullPointerExceptionがスローされるのではないかと思います。他にも「データベースの設定ファイルから接続している」とのことですが、そちらの設定ファイルにおそらくデータベースの接続設定が書かれているかと思いますので、そちらも確認してください。
swordone

2016/05/29 18:26

いまその箇所から発生するNullPointerExceptionをcatch出来ないので、その箇所を囲むtryの次のcatchの例外をSQLExceptionから一時的にExceptionに変えてスタックトレース出力を書くべきです。
guest

0

UserDAOがこの通りにファイルになっているとしたら、44行目はここですか。

java

1conn.close();

追記されたコードから推測するに、コンストラクタのどこかで失敗しているのではないでしょうか?
その際の例外がコンストラクタ内のcatch節で握りつぶされ、気づかないまま処理を進めている可能性があります。怪しいのはDataSourceのところでしょうか。
そうなると、connがnullのままになってしまい、まずtryの最初のconnに対するメソッドでNullPointerExceptionが発生します。そのため即座にfinallyブロックに入りますが、ここのclose()でまたNullPointerExceptionになります。この場合、最終的に投げられる例外はfinally節からの例外になります(try節からの例外は抑制される)。
コンストラクタのcatch節で、e.printStackTrace()などをして確認してみてください。

投稿2016/05/29 09:38

編集2016/05/29 10:05
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tatsuro_186

2016/05/29 09:42

44行目はconn.close()の部分になります
guest

0

conn が宣言されてないような、気がする

投稿2016/05/29 09:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tatsuro_186

2016/05/29 09:43

先ほど追加したソースコードを参照ください。connはDataSourceManager.javaで宣言しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問