2010-10-10 62 views
0

我能够解决这个问题,但我想知道如果我能得到一个很好的解释为什么这被打破。SimpleDateFormat在Android中失败

我创建了一个实用程序函数来处理我的数据库为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的功能不是线程安全的,但(据我所知)我的程序是一个单独的线程中运行。我是新来的机器人,也许我错了。我知道我能够通过将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) 
+0

我应该提到我对Java很新,所以我可能只是在做一些愚蠢的事情。 ;-) – SapphireSun 2010-10-10 06:35:18

+0

你可以发布你的stacktrace吗?很可能你的数据被破坏了...... – st0le 2010-10-10 06:37:15

+0

我添加了跟踪。 NullPointerException对应于对databaseformat.parse的调用。 – SapphireSun 2010-10-10 06:45:24

回答

0

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

0

在isoToDate,确保isodate不为空。例如:

public static Date isoToDate(String isodate) { 
    if (isodate == null) { 
     // Raise exception, or return default date 
    } 
} 
+0

当我调试时,我有日志记录。我可以确认它不是空的。尽管感谢您的帮助! – SapphireSun 2010-10-10 15:08:05

+0

你可以使用硬编码参数运行isoToDate和databaseformat.parse并检查结果吗? – 2010-10-10 15:19:32