- - PR -
NTPサーバー利用時のJavaでの日付の扱い
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-09 18:56
こんにちは
助けてください!!! あるTomacatの案件で、これまで動いていたアプリが、 Caused by: java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:902) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:782) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:775) at java.text.DateFormat.format(DateFormat.java:314) といったメッセージを残して、動作しないという 不具合が発生しました。 環境的に異なるのはNTPサーバーとの接続を行うように なったことくらいです。 NTPサーバーを利用すると、 日付関係のクラスに変化が生じてしまうものなのでしょうか? | ||||||||
|
投稿日時: 2005-05-09 19:40
java.text.DateFormat.format(Date date)の呼び出しにおいて、dateにnullが渡されたんでしょうね。
java.text.DateFormat.formatの呼び出し部分を疑ってみては? | ||||||||
|
投稿日時: 2005-05-09 20:07
かずくんさん
formatter = new SimpleDateFormat(Fmt); sDate = formatter.format(dt1); というコードの部は分で、 fmtには yyyy年M月度 というのが指定されており、 dt1には 2005/04/01 という日付が入っています。 何かまずいことはあるでしょうか? | ||||||||
|
投稿日時: 2005-05-09 20:45
全く関係ありません。 今までたまたま動いていただけだと思われます。 OS側で日付の書式でも変えましたか?
dt1がString型なのかなんなのかすら分かりませんけど、ホントに入っているのですか? 前後のコードがないと判断できません。 あと、エラーログもあれで終わりですか? | ||||||||
|
投稿日時: 2005-05-09 21:18
ありがとうございます。
>dt1がString型なのかなんなのかすら分かりませんけど、ホントに入っているのですか? 前後のコードがないと判断できません。 本番環境なのでトレースは出来ませんでした。 が同じデータで他のサーバーで実行すると入っていました。 これについては明日、本当に値がわたってきているか検証予定です。 >あと、エラーログもあれで終わりですか? すみません 下記のログが対象の全てのログです。 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at rems.commons.action.BaseDispatchAction.dispatchMethod(BaseDispatchAction.java:142) at rems.commons.action.BaseDispatchAction.doAction(BaseDispatchAction.java:100) at rems.commons.action.BaseAction.execute(BaseAction.java:63) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at rems.commons.filter.EncodingFilter.doFilter(EncodingFilter.java:40) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) Caused by: java.lang.NullPointerException at java.util.Calendar.setTime(Calendar.java:902) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:782) at java.text.SimpleDateFormat.format(SimpleDateFormat.java:775) at java.text.DateFormat.format(DateFormat.java:314) at rems.commons.rpt.Get.Date(Get.java:71) at rems.commons.rpt.Get.StartDate(Get.java:141) at rems.re010.logic.RE010ShowOut.setPrint(RE010ShowOut.java:30) at rems.rptCom.action.rptComAction.RE010(rptComAction.java:61) ... 42 more | ||||||||
|
投稿日時: 2005-05-09 23:49
問題点は、Dateから文字列に変換する際、内部処理としてCalenderの実装にDateをセットしようとしたとき例外が発生していることであり、フォーマット指定がおかしいということではないと思います。 Calenderの実装がnullという可能性も考えましたが、Calender.GetInstance()がnullを返さないことから、この可能性は無視しました。 rems.commons.rptは何物でしょうか?社内パッケージでしょうか?どこかから購入したものでしょうか?(雰囲気からして社内パッケージの線濃い) rems.commons.rpt.Get.Date rems.commons.rpt.Get.StartDate rems.re010.logic.RE010ShowOut.setPrint rems.rptCom.action.rptComAction.RE010 これらのメソッドの中で、Dateオブジェクトを取り出しているのはどの部分でしょうか。 おそらくDateオブジェクトを取得した時点で既にnullなのではと推測します。 この辺を中心に調査すると、一歩進むかもしれません。 | ||||||||
|
投稿日時: 2005-05-10 15:27
有難う後いざいます。
まだ現地で確認が取れていませんが、 rems.commons.rpt.Get.Date で発生していると考えています。 コードは下記のとおりです。 Date dt1=ToDate(pMap.get(Fld).toString()); formatter = new SimpleDateFormat(Fmt); sDate = formatter.format(dt1); のコードの辺でトレースを取ってみようと思っています。 pMap.get(Fld)はPostパラメータを取り出しており、 中身には2005/04/01といったような値が文字列で格納されているはずです。 仮にNUllが返されたとして回避策はどうすればいいのでしょう? public static String Date(Map pMap,String Fld,String Fmt) { String sDate=""; if(pMap.get(Fld)!=null){ if(!pMap.get(Fld).toString().equals("")){ if(!Fmt.equals("")){ SimpleDateFormat formatter; Date dt1=ToDate(pMap.get(Fld).toString()); formatter = new SimpleDateFormat(Fmt); sDate = formatter.format(dt1); } else { sDate = pMap.get(Fld).toString(); } } } return sDate; } | ||||||||
|
投稿日時: 2005-05-10 15:48
先ほどのレスの補足です。
toDateの中身のコードを送付します。 } catch(ParseException e) { log.info("◆◆◆ toDate:ParseException:"+e.getMessage()); の部分の記述がなかったので これを入れて明日実行してみようと思います。 public static Date ToDate(String strVal) { Date dt1 =null; try{ strVal = strVal.replaceAll("-","/"); DateFormat df = DateFormat.getDateInstance() ; dt1 = df.parse(strVal); } catch(ParseException e) { log.info("◆◆◆ toDate:ParseException:"+e.getMessage()); } finally {} return dt1; } |