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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

1回答

3570閲覧

java.lang.NullPointerException エラーを解決したい

MiyatakeF

総合スコア5

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2020/02/05 21:07

前提・実現したいこと

『スッキリわかるサーブレット&JSP』第10章「アプリケーション作成」におけるつぶやきアプリの応用で、サーブレットとJSPを用いて家計簿アプリを作成しています。

品物と金額を入力し投稿すると、事前に入力したユーザー名と合わせて表示される機能を実装中に以下のエラーメッセージが発生しました。

恥ずかしながら自力での解決が出来ませんでしたのでお知恵を拝借したいと思います。

よろしくお願いします。

発生している問題・エラーメッセージ

タイプ 例外報告

説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。

例外

java.lang.NullPointerException
model.PostExpensesLogic.execute(PostExpensesLogic.java:7)
servlet.Main.doPost(Main.java:96)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
注意 原因のすべてのスタックトレースは、サーバのログに記録されています```

該当のソースコード

###クラス

package model;
import java.io.Serializable;

public class Expenses implements Serializable{
private String userName;
private String text;
private String money;

public Expenses() {} public Expenses(String userName, String text, String money) { this.userName = userName; this.text = text; this.money = money; } public String getUserName() { return userName; } public String getText() { return text; } public String getMoney() {return money; }

}


package model;

import java.util.List;

public class PostExpensesLogic {
public void execute(Expenses expenses, List<Expenses> expensesList) {
expensesList.add(0,expenses); //先頭に追加
}
}

##サーブレット

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//リクエストパラメータの取得
request.setCharacterEncoding("UTF-8");
String text = request.getParameter("text");
String money = request.getParameter("money");

//入力値チェック
if(text != null && text.length() != 0 && money != null && money.length() != 0){
//アプリケーションスコープに保存された家計簿リストを取得
ServletContext application = this.getServletContext();
@SuppressWarnings("unchecked")
List<Expenses> expensesList =
(List<Expenses>)application.getAttribute("ExpensesList");

//セッションスコープに保存されたユーザー情報を取得
HttpSession session = request.getSession();
User loginUser = (User)session.getAttribute("loginUser");

//家計簿を家計簿リストに追加
Expenses expenses = new Expenses(loginUser.getName(), text, money);
PostExpensesLogic postExpensesLogic = new PostExpensesLogic();
postExpensesLogic.execute(expenses, expensesList);

//アプリケーションスコープに家計簿リストを保存
application.setAttribute("expensesList", expensesList);
}
//メイン画面にフォワード
RequestDispatcher dispatcher =
request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
dispatcher.forward(request, response);

}

##JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model.User, model.Expenses, java.util.List" %>
<% //セッションスコープに保存されたユーザー情報を取得
User loginUser = (User) session.getAttribute("loginUser");
//アプリケーションスコープに保存された家計簿リストを取得
@SuppressWarnings("unchecked")
List<Expenses>expensesList =
(List<Expenses>) application.getAttribute("expensesList");
%>

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>カンタン家計簿</title> </head> <body> <h1>家計簿メイン</h1> <p> <%= loginUser.getName() %>さん、ログイン中 <a href= "/money/Logout">ログアウト</a> </p> <p><a href ="/money/Main">更新</a></p> <form action="/money/Main" method="post"> <input type="text" name="text"> <input type="text" name="money"> <input type ="submit" value="家計簿入力"> <% for(Expenses expenses : expensesList) { %> <p><%= expenses.getUserName() %>:<%= expenses.getText() %>:<%= expenses.getMoney() %></p> <%} %> </form> </body> </html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/02/05 23:14

nullとからは違います
dodox86

2020/02/06 01:06

サーブレット側: (List<Expenses>)application.getAttribute("ExpensesList"); application.setAttribute("expensesList", expensesList); JSP側: (List<Expenses>) application.getAttribute("expensesList"); 何はともあれ提示のコードを整形しましょう。
guest

回答1

0

スタックトレースの読み方を覚えた方がよいです。

java.lang.NullPointerException

model.PostExpensesLogic.execute(PostExpensesLogic.java:7)
servlet.Main.doPost(Main.java:96)

PostExpensesLogic.java:7

つまり、PostExpensesLogic.javaの7行目

expensesList.add(0,expenses); //先頭に追加

の部分で発生しています。
ということは、引数のexpensesListがnullの可能性が高いです。

java

1List<Expenses> expensesList = 2(List<Expenses>)application.getAttribute("ExpensesList");

としていますが、初回アクセスはnullではないですか?

このアクセスの前に、

java

1//アプリケーションスコープに家計簿リストを保存 2application.setAttribute("expensesList", expensesList);

のように設定するか、nullの時は自前でnewしてあげればよいかと思います。

『スッキリわかるサーブレット&JSP』

の、どこかに上記のような記載があるか、エラッタで追加する部分が抜けているのではないでしょうか。

投稿2020/02/06 01:19

momon-ga

総合スコア4826

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問