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

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

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

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

Q&A

解決済

4回答

10125閲覧

java.lang.NullPointerException エラー

Yoshi--

総合スコア62

Java

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

0グッド

1クリップ

投稿2017/05/09 09:49

java

1 2//ユーザー登録に関するリクエストを処理するコントローラ 3 4package servlet; 5 6import java.io.IOException; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.HttpSession; 15 16import model.RegisterUserLogic; 17import model.User; 18 19@WebServlet("/RegisterUser") 20public class RegisterUser extends HttpServlet { 21 private static final long serialVersionUID = 1L; 22 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 25 // フォワード先 26 27 28 // 「ユーザー登録」をリクエストされたときの処理 29 // if (action == null) { 30 // フォワード先を設定 31 String forwardPath = "/WEB-INF/jsp/registerForm.jsp"; 32 //} 33 34 // 設定されたフォワード先にフォワード 35 RequestDispatcher dispatcher = 36 request.getRequestDispatcher(forwardPath); 37 dispatcher.forward(request, response); 38 } 39 40 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 41 42 // リクエストパラメーターの取得 43 request.setCharacterEncoding("UTF-8"); 44 45 String nickName = request.getParameter("nickName"); 46 String eMail = request.getParameter("eMail"); 47 String pass = request.getParameter("pass"); 48 String userName = request.getParameter("userName"); 49 50 // 登録するユーザー情報を生成 51 User registerUser = new User(nickName, eMail, pass, userName); 52 53 54 // セッションスコープに登録ユーザーを保存 55 HttpSession session = request.getSession(); 56 session.setAttribute("registerUser", registerUser); 57 58 // サーブレットクラスの動作を決定する「action」の値をリクエストパラメータから取得 59 String action = request.getParameter("action"); 60 61 62 63 64 // 登録確認画面から「登録」をリクエストされたときの処理 65 if (action.equals("done")) { 66 67 68 // セッションスコープに保存された登録ユーザーを取得 69 HttpSession session2 = request.getSession(); 70 User registerUser2 = (User) session2.getAttribute("registerUser"); 71 72 // 登録処理の呼び出し 73 RegisterUserLogic logic = new RegisterUserLogic(); 74 logic.execute(registerUser2); 75 76 // 不要となったセッションスコープ内のインスタンスを削除 77 session.removeAttribute("registerUser"); 78 79 // 登録後のリダイレクト 80 response.sendRedirect("WEB-INF/jsp/registerDone.jsp"); 81 82 }else{ 83 84 // フォワード 85 RequestDispatcher dispatcher = 86 request.getRequestDispatcher 87 ("/WEB-INF/jsp/registerConfirm.jsp"); 88 dispatcher.forward(request, response); 89 } 90 } 91 } 92

イメージ説明

この対処を教えてほしいです。エラーの意味と場所はわかっているのですが、どうすればいいのかわかりません

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

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

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

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

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

A-pZ

2017/05/10 02:44

RegisterUser.java の 50行目で出ているとありますので、記載したソースの50行目はどこであるかを明記しないと、ただしい解答は得られないでしょう。
guest

回答4

0

ベストアンサー

あーこれわかりにくいやつですね。リクエストスコープを使いましょう。

セッションスコープはマルチスレッドセーフではありません。
同じWebブラウザから別画面を開くと、それら二つの画面ではひとつのセッションを共有します。それぞれの画面からサーバにほぼ同時にアクセスすると、その処理は確率的に「同時並行で実行される」可能性があります。

それらのリクエストを仮に「リクエストA」「リクエストB」と呼ぶことにして、このとき、

  1. リクエストAの処理が、session.setAttribute("registerUser", registerUser); を実行する。
  2. リクエストAの処理が、session2.getAttribute("registerUser");を実行して登録ユーザを取り出そうとする。
  3. 2.が実行される直前に、同時並行で動いているリクエストBの処理がsession.removeAttribute("registerUser"); を実行する。
  4. 3.が実行された結果、2.の返り値が[nullとなる](http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html#getAttribute(java.lang.String)ため、registerUser2 に null が代入される。
  5. registerUser2 を使おうとしたとき、NullPointerException が発生する。

……どこでだ?


無駄話はさておき、if文はヨーダ記法で記述するとか、[Object.equals()](http://docs.oracle.com/javase/jp/7/api/java/util/Objects.html#equals(java.lang.Object, java.lang.Object)) を使えばいいんじゃないかなと思います。

投稿2017/05/10 00:48

matobaa

総合スコア2493

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

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

tacsheaven

2017/05/10 00:56

50行目だと > User registerUser = new User(nickName, eMail, pass, userName); ですね。これで NullPointerException ならば、User のコンストラクタの中ですかね。
matobaa

2017/05/10 01:02

えっえっ あれれ。Userのコンストラクタの中でNPEが発生してもスタックトレースに出ないんでしたっけ。
matobaa

2017/05/10 02:39

興味深い。JIT最適化の結果ですかー。そんなことがあるんですね。面白い、勉強になります。
Yoshi--

2017/05/11 00:21

みなさま返答ありがとうございます。色々試してみます。
guest

0

エラーの意味と場所はわかっているのですが、どうすればいいのかわかりません

きっとわかってはいないので、デバッガでステップ実行するとよいです。

投稿2017/05/09 10:50

koko_u

総合スコア936

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

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

Yoshi--

2017/05/10 00:21

ありがとうございます
guest

0

エラーメッセージに、doPost の中(RegisterUser.java の 50行目)とエラーの起こった場所が特定されていますね。

doPost ということはフォームから何かデータを受け取って処理(名前からしてユーザー登録でしょうか)しようとしているので、可能性として一番考えられるのはフォームから受け取るはずのデータが受け取れていないでしょうか。

  • フォームでの名前と、RegisterUser の中で見ているPOSTデータの名前とが合っていない
  • 空で来ることを想定したガードをしていない
  • データベースへアクセスして結果が該当なしだった時を想定していない

あたりですかねえ。

投稿2017/05/10 00:42

tacsheaven

総合スコア13703

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問