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

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

ただいまの
回答率

90.23%

(JSP)DBを用いた登録システムでエラーが発生し、NULLがデータに格納される。

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 706

yoshim95

score 10

前提・実現したいこと

JSP及びJAVAを学習しているものです。
データベースを用いたJSPプログラムにおいて再度引っかかった点があり、自己解決を試みても解決が難しいと感じたため、質問いたします。
JSPでデータベースに接続し、データベース内にデータを格納するプログラムを作成しております。
接続は出来たものの、コンソール内にエラーメッセージが表示され、登録してもnullとデータを入力したわけでもないのにすべての項目がnullとして格納されます。
nullにならないように登録するにはどのようにすればよろしいでしょうか?

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

java.lang.NullPointerException
    at org.apache.jsp.Input_jsp._jspService(Input_jsp.java:143)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

該当のソースコード

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

 <!-- JDBCのために必要なインポート文 -->
  <%@ page import="java.sql.*"%>

  <!-- Oracle JDBC Driver のロード -->
  <% Class.forName("oracle.jdbc.driver.OracleDriver");%>

  <!-- connection の作成 -->
  <% Connection conn = DriverManager.getConnection("(ホスト名:ポート番号:SID)","(ユーザー名)","(パスワード)");%>

  <!-- Statement の生成 -->
  <% Statement stmt = conn.createStatement();%>

  <!-- 変数の初期化 -->
  <% conn = null;
     stmt = null;
  %>

  <!-- getParameter -->
  <%
  try{
  stmt = conn.createStatement();

  String id = request.getParameter("id");
  String name = request.getParameter("name");
  String birthdate = request.getParameter("birthdate");
  String address = request.getParameter("address");

  StringBuffer buf = new StringBuffer();
  buf.append("INSERT INTO STUDENT (");
  buf.append("id, name, birthdate, address) ");
  buf.append("values (");
  buf.append(id);
  buf.append(",'");
  buf.append(name);
  buf.append("','");
  buf.append(birthdate);
  buf.append("','");
  buf.append(address);
  buf.append("')");
  stmt.executeUpdate(buf.toString());


  try { stmt.close(); } catch (Exception e) {}
  try { conn.close(); } catch (Exception e) {}

} catch (Exception e) {
  e.printStackTrace();
}


  %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学生情報新規登録</title>
</head>
<body>

<form action="Input">

<p>学生情報を登録</p>

<p>学生番号</p><input type="text" name="id">
<p>名前</p><input type="text" name="name">
<p>誕生日</p><input type="text" name="birthdate">
<p>住所</p><input type="text" name="address">

<p><input type="submit" value="登録">

<p><a href="Top.jsp">戻る</a></p>

</form>

</body>
</html>

試したこと

エラーメッセージ「java.lang.NullPointerException
」をコピーして検索しても、解決方法がよくわからないです。
Nullが関係していることは承知しています。
サーブレットで作ってみてもダメでした。

開発の参考にしたサイト及びソース
http://www.rsch.tuis.ac.jp/~nagai/SYS/SYS14_new1.html

補足情報(言語/FW/ツール等のバージョンなど)

言語:JAVA、JSP
開発環境:Eclipse4.6

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

0

お粗末すぎる。

conn = null;
stmt = null;

で null を設定した conn を使って処理をしているから NullPointerException なってしかるべき

stmt = conn.createStatement();

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/27 13:21

    ちなみに

    $CATARINA_HOME/work/Catalina/localhost/$CONTEXT_NAME/org/apache/jsp/

    あたりに JSPがコンパイルされた サーブレットファイルがあります。

    キャンセル

  • 2016/12/27 18:14

    消したら通りました。

    キャンセル

-1

最近こういったJSP/Servletで躓いている初心者の方の質問をよく見ますが、書かれているコードがあまりにも酷過ぎて正直びっくりしています。
参考のサイト確認しましたが、JSP内にJavaのコードを書いているようなサイトを参考にするのはやめた方がいいですよ。
まずJSP/Servletの学習の前にJavaプログラミングの基礎をもう一度しっかりやり直した方がよいでしょう。少なくとも例外処理に関して、catchした例外を無視することは絶対にやってはいけません。もしこれを実際の開発プロジェクトでやってしまった場合、納期直前に開発メンバー全員で徹夜しなければならない羽目に陥る可能性がありますよ。
Class.forNameメソッドの使用も、自前でのリソースのcloseも、おそらく5年以上前の(ITの世界ではかなり昔となる)コードです。
JSP内でスクリプトレットを使用してJavaのコードを書くのもやめましょう。別の質問ではServlet内にHTMLの出力を書いていたコードもありましたが、それもやめましょう。
勉強中であれば、もう少しましな「お手本」を見つけた方がいいですね。

そもそもNullPointerExceptionの意味が理解できていないように思えますが。
自分で書いたnullを設定しているコードが把握できていますか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/27 10:31

    javaのコードはJSP内にスクリプトレットコードを記述せずに、servlet内で記述するのが適切ということでしょうか?
    catchは使わないようにした方がよろしいのですね。
    参考にしたサイトでも間違っていたり情報が古かったりする場合もあるので、あまり参考にはせずに基礎を身につけ自分で考えるようにします。
    nullは変数を初期化しないと別のエラー文が表示されるため、初期化を行っております。

    キャンセル

  • 2016/12/27 10:43

    MVC(Model-View-Controller)は理解できていますか?基本的に Servlet内に記述するJavaのコードはControllerに相当するコードだけです。データベース処理に関連するロジックはServletに書いてはいけません。
    あと、catchを使用してはいけないと言っているのではなく、発生した例外を無視してはいけないと言っているのです。意味が分かりますか?
    それからnullの意味、変数の初期化、この辺りのJavaプログラミングの基本をもう一度きちんと学習した方がいいですよ。JSPやServletはあくまでもJavaプログラミングの基本が理解できたうえでのテクノロジーです。基本を理解せずに先に進んでも、どのみちいろいろなところで躓いて前に進めなくなるだけです。まずは、NullPointerExceptionの意味と発生理由、そして書いたコードでnullの初期化を行っている部分がなぜ問題になるのかを考えてみてください。

    キャンセル

  • 2016/12/27 13:11

    MVCは使わずに、JSP、サーブレットのみでDBを用いたプログラムを開発する課題を行っておりました。基本事項をまた学びなおしてからではないと厳しいというのがわかりました。

    キャンセル

-2

JDBC INSERT サンプル を参考にされては?
また、CREATE TABLE 時にNULLを設定できないようにしたい列には NOT NULL 制約を記述します。
質問時にCREATE TABLE 文も載せた方が良いでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/12/27 09:53

    質問者の問題の原因はデータベースでもJSP/Servletでもなく、Javaの基本的な部分です。その回答では問題の原因にはたどり着けないですよ。

    キャンセル

  • 2016/12/27 11:26

    たしかに、Javaの基礎ができていませんね。

    キャンセル

  • 2016/12/27 13:14

    そもそも Insert 前で落ちてるはずよ。このソースコードだと(被害妄想)

    キャンセル

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

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