- PR -

parse時にNumberFormatExceptionが発生する

投稿者投稿内容
arare
会議室デビュー日: 2003/11/05
投稿数: 13
投稿日時: 2008-07-07 15:44
java.text.DateFormat.parseを使用して
日付が入力されているか否かのチェックを行っています。
APIによると、ここで発生しうる例外はParseExceptionとなっていますが
NumberFormatExceptionが発生してしまいました。
何故NumberFormatExceptionが発生してしまったか
ご存知の方がいらっしゃったら教えてください。

<ログ>
Caused by: java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:415)
at java.lang.Long.parseLong(Long.java:452)
at java.text.DigitList.getLong(DigitList.java:149)
at java.text.DecimalFormat.parse(DecimalFormat.java:1068)
at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1705)
at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1156)
at java.text.DateFormat.parse(DateFormat.java:333)

<ソース>
private static final SimpleDateFormat FMT_YYYYMMDD = new SimpleDateFormat("yyyyMMdd");

public static boolean valid(String date) {
Date ds;
try {
ds = FMT_YYYYMMDD.parse(date);
} catch (ParseException e) {
return false;
}
return FMT_YYYYMMDD.format(ds).equals(date);
}
未記入
会議室デビュー日: 2007/03/28
投稿数: 19
投稿日時: 2008-07-07 16:21
""をLong型に変換しているからなのでは・・・
入力データを確認してみては?
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-07-07 16:33
JDK1.1だとそういう現象が発生する「らしい」です。
http://java-house.jp/ml/archive/j-h-b/010336.html

もうちょっと明確なソースが提示できればいいのですが。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-07-07 16:38
手前味噌ですが。
SimpleDateFormatでNumberFormatException

スレッドセーフではないSimpleDateFormatをマルチスレッド下で使った場合の現象です。
arare
会議室デビュー日: 2003/11/05
投稿数: 13
投稿日時: 2008-07-07 17:59
回答ありがとうございます。

>未記入さん
残念ながら入力データはログに出力していないので
今となってはユーザーが何を入力したのかわかりませんでした。

>rainさん
当方、JDK1.4.2になります。

>nagiseさん
確認したところ
今回はマルチスレッド下ではありませんでした。

お伝えする情報が少なかったようです。
折角教えていただいたのにすみません。

また、事前に入力チェックを行っていますので
引数の「String date」の部分は全角スペースにすることはできますが
半角スペースや""にすることはできないようにコーディングされています。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-07-07 18:07
引用:

arareさんの書き込み (2008-07-07 17:59) より:
>nagiseさん
確認したところ
今回はマルチスレッド下ではありませんでした。



Webシステムではない、ということでしょうか。
提示のソースのようにstaticフィールドにSimpleDateFormatのインスタンスを保持するようなユーティリティクラスを作った場合、Webシステムであればマルチスレッド下ですよ。

逆に、シングルスレッド下で同じ文字列をパースするときに常に例外が発生するなら、例外が発生する具体的なString文字列の値を提示してください。
arare
会議室デビュー日: 2003/11/05
投稿数: 13
投稿日時: 2008-07-08 16:41
>nagiseさん

Webシステムです。
プログラム内での「java.lang.Thread」と勘違いしていました。
ご指摘ありがとうございます。

非チェック例外ではありますが
NumberFormatExceptionをcatchすることを検討したいと思います。

ありがとうございました。

[ メッセージ編集済み 編集者: arare 編集日時 2008-07-08 17:22 ]
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2008-07-08 18:55
引用:

arareさんの書き込み (2008-07-08 16:41) より:
非チェック例外ではありますが
NumberFormatExceptionをcatchすることを検討したいと思います。



それは間違った対処法ですよ。
そもそもSimpleDateFormatをstaticフィールドに保持しないようにしましょう。
毎回生成して使い捨てるのが単純な対処法です。

スキルアップ/キャリアアップ(JOB@IT)