2010-10-10 22 views
0

J'ai été en mesure de résoudre ce problème, mais je me demande si je peux obtenir une bonne explication de pourquoi cela a été brisé.SimpleDateFormat À défaut d'Android

J'ai créé une fonction utilitaire pour gérer mes conversions de date avec la base de données pour une application Android. Ce code n'a pas la deuxième fois il a été consulté:

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); 
    } 
} 

Je comprends que les différentes caractéristiques SimpleDateFormat sont pas thread-safe, mais (pour autant que je sache) mon programme était en cours d'exécution dans un seul fil. Je suis nouveau à Android et peut-être que je me trompe. Je sais que j'ai été capable de résoudre ce problème en déplaçant la ParsePosition dans les méthodes et en la remplissant. Même si ce n'est pas sûr, n'est-ce pas une constante? Pourquoi une constante en lecture seule casse un thread?

Merci!

EDIT: Voici le 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

Je devrais probablement mentionner que je suis assez nouveau à java, donc je pourrais juste faire quelque chose de stupide. ;-) – SapphireSun

+0

Pourriez-vous poster votre stacktrace? il est tout à fait possible que vos données aient été mutilées ... – st0le

+0

J'ai ajouté la trace. L'exception NullPointerException correspond à l'appel à databaseformat.parse. – SapphireSun

Répondre

0

Il s'avère que c'était la ParsePosition qui causait les problèmes. L'instancier à chaque fois a résolu le problème.

0

En isoToDate, assurez-vous que ISODate est non nul. Quelque chose comme:

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

Pendant le débogage, j'avais des instructions de journalisation. Je peux confirmer que ce n'était pas nul. Merci quand même pour vôtre aide! – SapphireSun

+0

Pouvez-vous exécuter isoToDate et databaseformat.parse avec des paramètres codés en dur et vérifier le résultat? –