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

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

ただいまの
回答率

88.58%

NumberFormatExceptionを解決したい。

受付中

回答 3

投稿 編集

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

samurai_se

score 15

 事象

hiddenでJava側へ送った値をDBに登録したいのですが、NuberformatExceptionで落ちてしまいます。
おそらくBookDAOのInteger.parseIntで落ちていると思うのですが、何がダメなのかわかりません。
ご教授よろしくお願いいたします。

 実装内容

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.BookDAO;
import tool.Action;
import util.StringQuery;
import util.StringUtil;

public class RegistCompleteAction extends Action{

    public String execute(
            HttpServletRequest request, HttpServletResponse response) throws Exception{

        try {

            response.setContentType("text/html; charset=UTF-8");
            request.setCharacterEncoding("UTF-8");


            String booktitle = request.getParameter(StringQuery.BOOKTITLE);
            String author = request.getParameter(StringQuery.AUTHOR);
            String publisher = request.getParameter(StringQuery.PUBLISHER);
            String publishday = request.getParameter(StringQuery.PUBLISHDAY);
            String runame = request.getParameter(StringQuery.RUNAME);
            String registday = request.getParameter(StringQuery.REGISTDAY);
            String category = request.getParameter(StringQuery.CATEGORY);

            BookDAO dao = new BookDAO();
            dao.regist(booktitle,author,publisher,publishday,runame,registday,category);

            return StringUtil.VIEW_FOLDER + StringUtil.SLASH + StringUtil.PAGE_REGIST_COMPLETE
                    + StringUtil.DOT + StringUtil.JSP_EXTENSION;

        }catch(Exception error) {

            //何かしらのエラーが発生しているので、エラー表示後ログイン画面へ
            return StringUtil.VIEW_FOLDER + StringUtil.SLASH + StringUtil.PAGE_ERROR
                    + StringUtil.DOT + StringUtil.JSP_EXTENSION;

        }
    }
}
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;

import util.StringQuery;

public class BookDAO extends DAO{

    public void regist(String booktitle, String author, String publisher, String publishday,
            String runame, String registday,String category) throws Exception {

        int registCategory = Integer.parseInt(category);

        Connection con = getConnection();

        PreparedStatement st;

        st = con.prepareStatement(
                "insert into BOOK values (seq_bookId.nextval,?,?,?,?,?,"
                        + "?,?,?,?,?)");

        st.setString(1, booktitle);
        st.setString(2, author);
        st.setString(3, publisher);
        st.setString(4, publishday);
        st.setString(5, runame);
        st.setString(6, registday);
        st.setString(7, StringQuery.EMPTY);
        st.setString(8, StringQuery.EMPTY);
        st.setInt(9, StringQuery.FLAG_OFF);
        st.setInt(10, registCategory);

        try {

            st.executeUpdate();

        }catch(Exception error) {

            error.printStackTrace();

        }finally {

            close(con);
            close(st);

        }

    }

}

 request.getParameter(StringQuery.CATEGORY)の内容

イメージ説明

 スタックトレース

表示がない?
catch節で囲んでいるので、そこへ入っていき、エラー画面へ遷移する。

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kabao

    2018/11/29 23:05

    落ちたときのスタックトレースと、request.getParameter(StringQuery.CATEGORY)の内容を書いた方がよいかと思います。

    キャンセル

  • punkrou404

    2018/11/29 23:20

    同じく。categoryってくらいだからlong長の文字列渡ってくることはなさそうだから、おそらく数値じゃない文字列渡ってるんだとは思うけど

    キャンセル

  • samurai_se

    2018/12/02 12:05

    回答ありがとうございます。返事が遅くなり申し訳ありませんでした。ご指摘の内容を追伸いたしましたので、ご教授お願いいたします。

    キャンセル

回答 3

+1

        int registCategory = Integer.parseInt(category);

このcategory の内容を確認しましょう
数字以外の文字が入ってるのでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

String category = request.getParameter(StringQuery.CATEGORY);

で値が取得できていないか、数値以外の値であるか、StringQuery.CATEGORY 値のリクエストパラメータが送信されていないか

ではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

できればNumberFormatExceptionのスタックトレースも欲しかったですが…。

おそらく
category="5"
ではなく
category=""5""
という文字列が入っていたので、
パースできなかったのではないでしょうか?

String category = request.getParameter(StringQuery.CATEGORY).replaceAll(""","").trim();

とすれば、

  1. 取得文字列からダブルコーテーションを削る
  2. 1から空白を削る

となり、パース可能な数値文字列が取得できるのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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