- PR -

NTPサーバー利用時のJavaでの日付の扱い

投稿者投稿内容
BLACKGUM
常連さん
会議室デビュー日: 2004/12/24
投稿数: 23
投稿日時: 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サーバーを利用すると、
日付関係のクラスに変化が生じてしまうものなのでしょうか?


かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-05-09 19:40
java.text.DateFormat.format(Date date)の呼び出しにおいて、dateにnullが渡されたんでしょうね。

java.text.DateFormat.formatの呼び出し部分を疑ってみては?
BLACKGUM
常連さん
会議室デビュー日: 2004/12/24
投稿数: 23
投稿日時: 2005-05-09 20:07
かずくんさん

formatter = new SimpleDateFormat(Fmt);
sDate = formatter.format(dt1);

というコードの部は分で、
fmtには
yyyy年M月度
というのが指定されており、

dt1には
2005/04/01
という日付が入っています。

何かまずいことはあるでしょうか?

aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-05-09 20:45
引用:
NTPサーバーを利用すると、
日付関係のクラスに変化が生じてしまうものなのでしょうか?


全く関係ありません。
今までたまたま動いていただけだと思われます。
OS側で日付の書式でも変えましたか?
引用:
dt1には 2005/04/01 という日付が入っています。


dt1がString型なのかなんなのかすら分かりませんけど、ホントに入っているのですか?
前後のコードがないと判断できません。

あと、エラーログもあれで終わりですか?
BLACKGUM
常連さん
会議室デビュー日: 2004/12/24
投稿数: 23
投稿日時: 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
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2005-05-09 23:49
引用:

formatter = new SimpleDateFormat(Fmt);
sDate = formatter.format(dt1);

というコードの部は分で、
fmtには
yyyy年M月度
というのが指定されており、

dt1には
2005/04/01
という日付が入っています。

何かまずいことはあるでしょうか?


問題点は、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なのではと推測します。

この辺を中心に調査すると、一歩進むかもしれません。
BLACKGUM
常連さん
会議室デビュー日: 2004/12/24
投稿数: 23
投稿日時: 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;

}
BLACKGUM
常連さん
会議室デビュー日: 2004/12/24
投稿数: 23
投稿日時: 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;

}

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