2010-10-10 2 views
0

Я смог исправить это, но мне интересно, могу ли я получить хорошее объяснение, почему это было нарушено.SimpleDateFormat Failed in 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 в методы и запустив его. Даже если это не потокобезопасность, разве это не просто постоянная? Почему постоянная только для чтения прерывает поток?

Спасибо!

EDIT: Вот StackTrace:

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

+0

Не могли бы вы разместить свой стек? вполне возможно, что ваши данные были искажены ... – st0le

+0

Я добавил след. NullPointerException соответствует вызову dataformat.parse. – SapphireSun

ответ

0

Оказалось, что причиной этого является ParsePosition. Каждый раз, создавая его, решал проблему.

0

В isoToDate, убедитесь, что ISODate не является нулевым. Что-то вроде:

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

Пока я был отлажен, у меня были записи о регистрации. Я могу подтвердить, что он не был нулевым. Спасибо за вашу помощь! – SapphireSun

+0

Можете ли вы запустить isoToDate и databaseformat.parse с жестко закодированными параметрами и проверить результат? –