- PR -

java.lang.IllegalArgumentExceptionのエラーについて

投稿者投稿内容
うさぎ鍋
会議室デビュー日: 2004/12/22
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2005-01-06 14:34
すみませんです;;
ご迷惑おかけしました。
確かに区別できていないかもしれません。
その点は深く反省いたします。
とりあえずもう少しだけがんばってみます!

[ メッセージ編集済み 編集者: うさぎ鍋 編集日時 2005-01-06 14:41 ]
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2005-01-06 14:42
こんにちは。

やりたい事をまとめてみましょうか。

・DBのあるテーブル上からある行を抽出し、「keisaidate1」カラムの内容を表示したい
・表示形式は「YYYYMMDD」
・「keisaidate1」カラムはVARCHAR(2)(詳細不明)

とりあえず、テーブル定義を確認しないといけないのですが、「keisaidate1」はDATE型
(DBのDATE型)ではなくて、文字列型で格納されているのですよね?
恐らく8桁の数字が格納されていると仮定すると、

コード:

Integer.toString(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(strKeisaidate1)))



こうしてやるまでも無くそのまま表示しても問題無いと思うのですが、どうでしょうか?

# 上の例だとString型→String型→int→文字列型と後半2処理が無意味だったりして、
# これはこれで・・・なのですが

上記の仮定のまま話を進めますが、そのまま表示してよいなら

コード:

String strKeisaidate1 = null;



ここはString型で問題無いでしょう。

コード:

strKeisaidate1 = rs.getString("keisaidate1");



ここをjava.sql.Date型ではなくて、String型で取得して、そのままstrKeisaidate1を
表示してやれば良いと思います。

もし、strKeisaidate1をSimpleDateFormatでフォーマット変更をどうしても行いたい場合は、
コード:

import java.util.Date;

SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
java.util.Date date = format.parse(strKeisaidate1);
String formatStr = format.format(date);

# 15:06追記:処理が間違っていたので、修正しました
# また、例外処理は全て省略しています



としてやると、多分いけると思います(自信無し)。

[ メッセージ編集済み 編集者: BBC 編集日時 2005-01-06 15:08 ]

[ メッセージ編集済み 編集者: BBC 編集日時 2005-01-06 15:19 ]

[ メッセージ編集済み 編集者: BBC 編集日時 2005-01-06 16:10 ]
うさぎ鍋
会議室デビュー日: 2004/12/22
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2005-01-06 15:17
BBC様返答ありがとうございます。
いわれて見ると確かに無意味かもしれません・・・・・
推測でしかありませんがstrKeisaidate1は始めから宣言してある通りString型だからそれをInt型になおしてString型にする必要はないと・・・
そこで疑問なんですがstrKeisaidate1 = rs.String("keisaidate1");の記述は
out.println(" <td class=\"pt10\"> <input name=\"p_keisaidate1\" type=\"text\" value=\" " + Integer.toString(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(strKeisaidate1))) + " \" maxlength=\"10\" size=\"12\">");
に記述すればよいのでしょうか?
かき方からすると恐らくはstrKeisaidate1 = rs.getString("keisaidate1")の所なのではと思いまして両方試しましたがどちらもエラーが発生してまうようです。(もしかするとよく判っていないかもなのでそういった点がありましたらご指摘ください。)
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2005-01-06 16:09
再びこんにちは。

引用:

そこで疑問なんですがstrKeisaidate1 = rs.String("keisaidate1");の記述は



ごめんなさい、タイプミスです。「rs.getString("keisaidate1");」が正しいです。
それと記述場所は、SQLを実行して値を取得している場所(rs.get〜している場所)で
良いと思います。

引用:

かき方からすると恐らくは strKeisaidate1 = rs.getString("keisaidate1")の所なのではと思いまして両方試しましたがどちらもエラーが発生してまうようです。(もしかするとよく判っていないかもなのでそういった点がありましたらご指摘ください。)



未記入さんも述べていますが、SimpleDateFormat.format(Date)メソッドは、
String型を引数に持てません。

# だから、java.lang.IllegalArgumentExceptionが出現します
# String型はDate型では無いので、「不正な引数の例外」が出てしまうのです

また、getDate()で無理矢理 文字列型→DATE型にして取得した場合、失敗するとnullが
返ってくるので、やはりエラーになります。

# この場合は「java.lang.NullPointerException」が出るはず

そういったわけで、

コード:
Integer.toString(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(strKeisaidate1)))



ここを

コード:
strKeisaidate1



だけにして、とりあえず実データの内容を出力してみるのが良いと思います。

# 余談:
# java.sql.Dateってjava.util.Dateを継承してたのね・・・
# 前のレス、修正しなきゃ
うさぎ鍋
会議室デビュー日: 2004/12/22
投稿数: 16
お住まい・勤務地: 静岡
投稿日時: 2005-01-06 16:28
BBC様ありがとうございます。
とりあえずstrKeisaidate1だけにして実行してみた結果うまく実行することができました。
ご迷惑おかけして申し訳ないです;;

[ メッセージ編集済み 編集者: うさぎ鍋 編集日時 2005-01-06 17:02 ]
BBC
常連さん
会議室デビュー日: 2002/03/15
投稿数: 37
お住まい・勤務地: 東京
投稿日時: 2005-01-06 17:19
三度こんにちは。

# keisaidate1って、(恐らく)Date型なんだ・・・

あらかじめ断っておきます。
私はSQLは日常的に業務で使用していますが、複雑な処理はPGM側で行ってしまう上、
Javaは業務で使用していません。ご理解の上で以下の説明を読んでください。

コード:

TO_CHAR(v_keisaidate1, 'MI')



は、SQLの構文でDATE型(or 数値型)を指定のフォーマットで文字列に変換する命令です。
'MI'はDATE型の値から「分」の要素だけを抜き出すパラメタという事です。

# と、手元のSQLリファレンスで確認しました

java.text.SimpleDateFormatクラスの変換は少し癖があり、PL/SQL上で行っていた
処理をそのまま行えない可能性があります。

あらかじめSQL側でkeisaidate1から分だけ(keidaidate1_1と同様に)抽出し、
intCountと数値比較してみるのが良いと思います。

# SQLは自分で考えてみてください
# 取得できれば、分の文字列をInteger.parseInt()でintに変換して、
# 比較する事は可能なハズ


ここまで答えておいて今更感が漂うのですが、仕事のコードを貼り付けるのは、
あまりよろしくないので、出来る限りサンプルコードを自作してみてください。
(余裕の無い状態なのはわかるんですが・・・)

# 後は・・・、無理矢理 PL/SQL→Java のコードに変換しようとしない事

[ メッセージ編集済み 編集者: BBC 編集日時 2005-01-06 17:20 ]

[ メッセージ編集済み 編集者: BBC 編集日時 2005-01-06 17:26 ]

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