• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaの掲示板について)

Javaの掲示板で投稿日時の取得でシンボルが見つからないエラーが発生

このQ&Aのポイント
  • javaの掲示板で投稿日時の取得部分でシンボルが見つからないとエラーが発生しています。
  • new SimpleDateFormatの部分でエラーが出ているようですが、問題の原因がわかりません。
  • 掲示板の投稿メッセージ一覧を取得する際にもエラーが発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.5

>はい。データベース内には投稿した時間が格納されています。 >DATE | timestamp | YES | | NULL | | >というように時間を格納するようにしているので > >Timestamp timestamp = rs.getTimestamp("DATE"); >でとれると思ったのですが、これではとれないのですね。 いえ、取得はそれで良いと思いますけど、 YESって多分nullの許容だと思いますが、Yesになっているとデータとしてnullが存在しますよね。 その場合取得されたレコード内にDATEカラムがnullのものがあったら、例外が発生すると思います。 SELECT * FROM MESSAGE_TABLE where DATE is null ORDER BY ID DESC というSQLを投げて、レコードが選択されたなら先に述べたような現象となります。 Timestamp timestamp = rs.getTimestamp("DATE"); SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); String strDate = timestamp != null ? sdf.format(timestamp) : ""; とすると、strDateには timestampがnullではないとき( timestamp != null )はフォーマット変換した日付 nullの場合は空白となります。 事前にtimestamp != nullでnullであるか判別しているためNullPointerExceptionが発生します。 ずれた回答ならすみません。

ofuoo
質問者

お礼

ありがとうございます。 たしかに今のまま掲示板表示をするとnullとして格納されていた時も日時が格納されている時もnullと表示されてしまいます。 なので一度レコード内のnullを全て消せば動くでしょうか?

ofuoo
質問者

補足

String strDate = new SimpleDateFormat(DATE_PATTERN).format(timestamp); の部分を DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM ); String strDate = fmt.format(timestamp); と書き換えたら機能は画面表示できたのですが今日になるとできなくなっていました。 立ちあげた日にちによって起動しないのはなぜなのでしょうか?

その他の回答 (5)

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.6

こんにちは。 >String strDate = new SimpleDateFormat(DATE_PATTERN).format(timestamp); >の部分を > >DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM ); >String strDate = fmt.format(timestamp); >と書き換えたら機能は画面表示できたのですが今日になるとできなくなっていました。 > >立ちあげた日にちによって起動しないのはなぜなのでしょうか? いや、なので、timestampにnullが入らないようにしないといけません。 昨日までは何かnullが入ってくるデータがなかったけど、今日になったらnullのデータがあるということでは? >たしかに今のまま掲示板表示をするとnullとして格納されていた時も日時が格納されている時もnullと表示されてしまいます。 日時が入っているときもnullというのはちょっとわかりません。 データには日時が入っているのにJava側でnullなのであれば正しいSQLで取得できていないのでは? きちんとnullが入らないようにDB設計がされていればnullのチェックはしなくても大丈夫ですが、 nullが許容されているのであれば先に回答した方法でnullの場合とnullでない場合のチェックが必要です。 それを行っていないのだからまだエラーが出るのは必至です。 砕いて書くなら String strDate; if ( timestamp != null ) { DateFormat fmt = DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.MEDIUM ); // この場合、timestampはnullではないのでformatしてもOK strDate = fmt.format(timestamp); } else { // timestampがnullなのでformatしちゃだめ。 strDate = ""; } もっと厳密に書くなら、DateFormatで起きる例外も拾う必要があります。 ただ、カラムはdate型のようですのでnullであるかどうかだけ見ればOKだと思います。 >なので一度レコード内のnullを全て消せば動くでしょうか? なので、確かめてみてくださいと言ったのですが? select count(*) from TABLE where date is null; これでカウントが1件以上であれば、timestampがnullであるかのチェックがないと表示できません。 ちなみにレコード内ではなくテーブル内ですね。 もし、他のカラムも同じような設計なのであれば、ソース内で厳密にチェックしてあげないとnullポインター等発生します。 開発していく方法としてはまず、SQLをしっかり組み立てて、実行してみて、思ったとおりのデータが取得できるか確認して、 必要なエラーチェック等を検討してください。 ただ、できるのであれば、テーブル設計の見直しをお勧めします。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.4

こんにちは。 >ありがとうございます。 >エラーはこのようだったんでその様に判断しました。 >しかしtimestamp型をString型にして取得する方法で調べて記述したのですが、これで取得できないなら、どのように変更していくべきでしょうか? 全文がわからないので、的確な回答は出来ませんが、まずは発行したSQLでデータが取得できているか確認していますか? Timestamp timestamp = rs.getTimestamp("DATE"); この値が取れていない限り、どんな記述しても無理です。

ofuoo
質問者

お礼

ありがとうございます。 はい。データベース内には投稿した時間が格納されています。 DATE | timestamp | YES | | NULL | | というように時間を格納するようにしているので Timestamp timestamp = rs.getTimestamp("DATE"); でとれると思ったのですが、これではとれないのですね。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 >コンパイルが通った結果tomcatでjava.lang.NullPointerExceptionというエラーがでたので今の記述だと上手く投稿日時の取得ができていないということですよね? どこでNullPointerExceptionが出てるかわからないので投稿日時が取得出来ていないなのか、具体的な回答は出来ません。 SimpleDateFormat付近で出ているのであればその通りだと思います。

ofuoo
質問者

お礼

ありがとうございます。 エラーはこのようだったんでその様に判断しました。 しかしtimestamp型をString型にして取得する方法で調べて記述したのですが、これで取得できないなら、どのように変更していくべきでしょうか? at java.util.Calendar.setTime(Calendar.java:1106) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:955) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:948) at java.text.DateFormat.format(DateFormat.java:336) at jp.co.insightech.MessageDao.getMessageList(MessageDao.java:48) at jp.co.insightech.BBSServlet.doGet(BBSServlet.java:83) at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.2

import java.util.*; import java.text.*; を指定すれば通るようです。

ofuoo
質問者

お礼

こちらもありがとうございます。importについて調べ直します。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 importの指定がおかしくありませんか? import java.sql.*; import java.sql.Timestamp.*; import java.io.*; import java.util.Date.*; import java.text.DateFormat.*; import java.text.SimpleDateFormat.*; import java.util.Vector; *はパッケージ内の指定になります。 java.text.SimpleDateFormat; です。 java.text.SimpleDateFormat.*; では java.text.SimpleDateFormatのパッケージ下となりますが、そんなパッケージはありません。 他にもいくつか、間違えて指定しているものがありますので、直してみてください。

ofuoo
質問者

お礼

ありがとうございます。 コンパイルが通った結果tomcatでjava.lang.NullPointerExceptionというエラーがでたので今の記述だと上手く投稿日時の取得ができていないということですよね?

関連するQ&A

専門家に質問してみよう