0

我能够解决此问题,但我想知道是否可以很好地解释为什么会被破坏。

我创建了一个实用程序函数来处理我与 android 应用程序数据库的日期转换。此代码在第二次访问时失败:

public class Util {

  private static final ParsePosition pos = new ParsePosition(0);

public static String isoDateFormat(Date d) {
      SimpleDateFormat databaseformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      return databaseformat.format(d);
  }

  public static Date isoToDate(String isodate) {
      SimpleDateFormat databaseformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      return databaseformat.parse(isodate, pos);
  } 
}

我知道各种 SimpleDateFormat 功能不是线程安全的,但是(据我所知)我的程序在单个线程中运行。我是android新手,也许我弄错了。我知道我可以通过将 ParsePosition 移动到方法中并对其进行更新来解决此问题。即使它不是线程安全的,它不只是一个常数吗?为什么只读常量会破坏线程?

谢谢!

编辑:这是堆栈跟踪:

E/AndroidRuntime( 2753): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mobile/com.example.mobile.ExampleSelector}: java.lang.NullPointerException
E/AndroidRuntime( 2753):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime( 2753):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime( 2753):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime( 2753):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime( 2753):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2753):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2753):    at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime( 2753):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2753):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2753):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime( 2753):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime( 2753):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2753): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 2753):    at Util.isoToDate(Util.java:34)
4

2 回答 2

0

事实证明是 ParsePosition 导致了问题。每次实例化它都解决了这个问题。

于 2010-11-15T06:45:43.920 回答
0

在 isoToDate 中,确保 isodate 不为空。就像是:

public static Date isoToDate(String isodate) {
   if (isodate == null) {
      // Raise exception, or return default date
   }
}
于 2010-10-10T10:35:04.110 回答