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

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

ただいまの
回答率

90.49%

  • Java

    16139questions

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

  • Eclipse

    1962questions

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

  • Tomcat

    628questions

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

java.lang.NullPointerExceptionが出てしまいました。よろしくお願いいたします。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,615

yuichikubo

score 4

eclispeの内部ブラウザにてログイン画面(login.jsp)より既にデータベースに格納してあるユーザ情報でログインしようとすると以下のエラーメッセージが出てしまいます。

メッセージ java.lang.NullPointerException

原因
java.lang.NullPointerException
org.apache.jsp.WEB_002dINF.jsp.list_jsp._jspService(list_jsp.java:175)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
pack.MemoServlet.doPost(MemoServlet.java:96)
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:53)

★MemoServlet.java

package pack;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

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

@WebServlet(name = "MemoServlet", urlPatterns = { "/MemoServlet" })
public class MemoServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

   private static final String JSP_BASE = "/WEB-INF/jsp/";

   private Connection _pooledConnection;

     public MemoServlet() {
    _pooledConnection = null;
  }

  @Override
  public void destroy() {
    if (_pooledConnection != null) {
      try {
        _pooledConnection.close();
      } catch (SQLException e) {
        ;
      }
      _pooledConnection = null;
    }

    super.destroy();
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    String action = req.getParameter("action");

    String forward = null;
    if("login".equals(action)) {

      forward = JSP_BASE + "login.jsp";
    }else{

      throw new ServletException("不正なリクエストです");
    }

    RequestDispatcher dispatcher = req.getRequestDispatcher(forward);
    dispatcher.forward(req, resp);
  }
@Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    String action = req.getParameter("action");

    String forward = null;
    if ("login_action".equals(action)) {

      forward = doLoginAction(req, resp);
    } else {

      forward = doError(req, resp, "不正なリクエストです");
    }


    RequestDispatcher dispatcher = req.getRequestDispatcher(forward);
    dispatcher.forward(req, resp);
  }


  private String doLoginAction(HttpServletRequest req,
      HttpServletResponse resp) throws ServletException, IOException {
    String userID = req.getParameter("user_id");
    String password = req.getParameter("password");
    if (userID == null || password == null) {
      throw new ServletException("不正なパラメータです。");
    }

    try{

      User user = getUser(userID, password);
      if(user == null) {
        return doError(req, resp, "不正なユーザIDもしくはパラメータです。");
      }


      Memo[] memos = getMemos();


      req.setAttribute("memos", memos);

      return JSP_BASE + "list.jsp";
    }catch(SQLException e) {
      return doError(req, resp, e.getMessage());
    }
  }


    private String doError(HttpServletRequest req, HttpServletResponse resp,
            String message) throws ServletException, IOException {
        req.setAttribute("message", message);

        return JSP_BASE + "error.jsp";
    }
   private Connection getConnection()
    throws SQLException {

    if(_pooledConnection != null) {
      return _pooledConnection;
    }
    try {

            Class.forName( "com.mysql.jdbc.Driver" );


      _pooledConnection = DriverManager.getConnection(
          "jdbc:mysql://localhost/memo", "root", "ky890703");
      return _pooledConnection;
    } catch (ClassNotFoundException e) {
      _pooledConnection = null;
      throw new SQLException(e);
    } catch (SQLException e) {
      _pooledConnection = null;
      throw e;
    }
  }

    private User getUser(String userID, String password)
      throws SQLException {
    Statement statement = null;
    try {

      statement = getConnection().createStatement();
      ResultSet resultSet = statement
          .executeQuery("SELECT USER_ID,USER_NAME FROM USER WHERE USER_ID='"
              + userID + "' AND PASSWORD='" + password + "'");
      boolean br = resultSet.first();
      if (br == false) {
        return null;
      }
      User user = new User();
      user.setId(resultSet.getString("USER_ID"));
      user.setName(resultSet.getString("USER_NAME"));

      return user;
    }catch(SQLException e) {
      _pooledConnection = null;
      throw e;
    } finally {
      if (statement != null) {
        statement.close();
        statement = null;
      }
    }
  }

 一部省略
}
★list.jsp

<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ page import="pack.User" %>
<%@ page import="pack.Memo" %>
<%@ page import="java.util.Calendar" %>
<%
    User currentUser = (User) request.getSession().getAttribute("currentUser");
%>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>検索一覧</title>
        <link rel="STYLESHEET" href="todo.css" type="text/css">
    </head>
    <body>
                <!-- 作業登録・検索 -->
        <table border="0" width="90%" class="toolbar">
            <tr>
                <form action="todo" method="post">
                    <input type="hidden" name="action" value="add">
                    <td>
                        <input type="submit" value="作業登録">
                    </td>
                </form>
                <td align="left">
                    <table border="0">
                        <tr>
                            <td>
                                タイトル
                            </td>
                            <form action="todo" method="post">
                                <input type="hidden" name="action" value="search">
                                <td>
                                    <input type="text" name="title" value="" size="24">
                                </td>
                            </form>
                        </tr>
                        <tr>
                            <td>
                                更新日
                            </td>
                            <form action="todo" method="post">
                                <input type="hidden" name="action" value="search">
                                <td>
                                    <input type="text" name="update_datetime" value="" size="24">
                                </td>
                            </form>
                        </tr>
                        <tr>
                                <td>
                                    <input type="submit" value="検索">
                                </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
        <%
           Memo[] memos = (Memo[]) request.getAttribute("items");
           if(memos.length == 0) {
               // アイテムが存在しない場合
        %>
        <div align="center">検索項目はありません。</div>
        <%
           }else{
        %>
        <table border="0" width="90%" class="list">
            <tr>
                <th>
                    ID
                </th>
                <th>
                    タイトル
                </th>
                <th>
                    登録日
                </th>
                <th>
                    更新日
                </th>
            </tr>
            一部省略
                    // メモを出力
                    for(int i = 0; i < memos.length; i ++) {
                        Memo memo = memos[i];
                        String styleAttr = "";
            %>
            <tr>
                <td <%= styleAttr %>>
                    <%= memo.getId() %>
                </td>
                <td <%= styleAttr %>>
                    <%= memo.getTitle() %>
                </td>
                <td <%= styleAttr %>>
                    <%= memo.getInsertDate() %>
                </td>
                <td <%= styleAttr %>>
                    <%= memo.getUpdateDate() %>
                </td>
            </tr>
            <%
                    }
            %>
        </table>
        <%
                }
        %>
    </body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • yuichikubo

    2016/09/19 15:29

    すいません。別のjspを追加いたしました。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/09/19 16:00

    workspace 以下でプロジェクト以外のディレクトリの下に「list_jsp.java」というファイルが作成されているはずなのでそれを探してみてもらえますか。

    キャンセル

  • yuichikubo

    2016/09/19 16:09

    すいません。ひととおり探しましたが、見つけることができませんでした。
    とりあえずはエラーが出なくなったので、進めてみようと思います。
    コメントありがとうございました。

    キャンセル

回答 1

checkベストアンサー

0

getMemos()の実装がないので予想でしかありませんが、サーブレットの中で呼び出している getMemos() メソッドがnullだった場合に、JSPでNullPointerExceptionが発生します。

具体的には

<%
  Memo[] memos = (Memo[]) request.getAttribute("items");
  if(memos.length == 0) {
  // アイテムが存在しない場合
%>

次のように記述すれば回避はできますが、Memo[]の内容がnullにならないよう、サーブレット側でnullのMemo[]にならないよう制御するのが一番良いでしょう。

<%
  Memo[] memos = (Memo[]) request.getAttribute("items");
  if (memos == null || memos.length == 0) {
  // アイテムが存在しない場合
%>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/19 16:02

    ありがとうございます。
    おっしゃるとおりの記述にしましたところNullPointerExceptionは解消されました。
    >Memo[]の内容がnullにならないよう、サーブレット側でnullのMemo[]にならないよう制御するのが一番良いでしょう。
    につきましては引き続き調べながらやっていきます。

    キャンセル

  • 2016/09/19 20:09

    d(・ω・

    キャンセル

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

  • Java

    16139questions

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

  • Eclipse

    1962questions

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

  • Tomcat

    628questions

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