2013-10-14 6 views
0

J'ai reçu ce rapport d'accident dans Google Play Developer Console:Android: NullPointerException dans onCreate

java.lang.RuntimeException: Unable to start activity ComponentInfo{ZhuangDictActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675) 
at android.app.ActivityThread.access$1500(ActivityThread.java:121) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:138) 
at android.app.ActivityThread.main(ActivityThread.java:3701) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at ZhuangDictActivity.showChooseDictDialog(ZhuangDictActivity.java:560) 
at ZhuangDictActivity.onCreate(ZhuangDictActivity.java:339) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623) 
... 11 more 

C'est sous onCreate:

sharedPreferences = getSharedPreferences(PREFERENCES_FILE, Context.MODE_PRIVATE); 
      dictName = sharedPreferences.getString(PREFERENCES_DICT_NAME, null); 
if (dictName == null) { 
       showChooseDictDialog(false); 
      } else { 
       modifyDictVar(dictName); 
       setTitle(loadDictInfo()); 

       initDbFile(); 
       databaseHelper.initDb(); 
      } 

Le showChooseDictDialog:

private void showChooseDictDialog(boolean cancelable) { 
     AlertDialog.Builder dictChooseBuilder = new AlertDialog.Builder(this); 
     FilenameFilter filter = new FilenameFilter() { 
      @Override 
      public boolean accept(File dir, String filename) { 
       return filename.contains(".ifo"); 
      } 
     }; 
     dictFilenames = dictPathFile.list(filter); 
     if (dictFilenames.length > 0) { 
      dictChooseBuilder.setItems(dictFilenames, new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dictName = dictFilenames[which].substring(0, dictFilenames[which].indexOf(".ifo")); 

        modifyDictVar(dictName); 
        initDbFile(); 
        databaseHelper.initDb(); 

        if (new File(ifoFileName).isFile()) { 
         setTitle(loadDictInfo()); 
        } 

        if (new File(idxFileName).isFile() && dictFile.isFile()) { 
         sharedPreferences.edit().putString(ZhuangDictActivity.PREFERENCES_DICT_NAME, dictName).commit(); 

         // dbHelper.dropTable(tableName); 
         if (!databaseHelper.isTableExist(tableName)) { 
          databaseHelper.beginTransaction(); 
          databaseHelper.createTable(tableName); 
          for (char c = 'a'; c <= 'z'; c++) { 
           String temp = DatabaseHelper.transTableName(c); 
           databaseHelper.createTable(temp); 
          } 
          databaseHelper.setTransactionSuccessful(); 
          databaseHelper.endTransaction(); 
          new LoadDictIndexAsyncTask().execute(dictName); 
         } 
        } else { 
         showDialog(getResources().getString(R.string.choose_dict_content)); 
        } 
       } 
      }); 
      dictChooseBuilder.setCancelable(cancelable).setTitle(getResources().getString(R.string.choose_dict_title)) 
        .create().show(); 
     } else { 
      dictChooseBuilder.setCancelable(cancelable).setMessage(
        getResources().getString(R.string.choose_dict_content)).create().show(); 
     } 
    } 

Le complet le code source de ZhuangDictAcitivity.java est disponible ici: https://code.google.com/p/zhuang-dict/source/browse/trunk/ZhuangDict/src/cn/wangdazhuang/zdict/ZhuangDictActivity.java

Quelqu'un sait-il la solution pour cela?

+0

Pourriez-vous fournir plus d'informations sur l'endroit où l'erreur se produit? – Tafari

+2

À quoi correspond la ligne 560 de la version ZhuanDictActivity.java qui a été créée avec cette version de l'application? – laalto

+0

Essayez de fournir le contexte dans votre alertdialog comme 'AlertDialog.Builder dictChooseBuilder = nouveau AlertDialog.Builder (ZhuangDictActivity.this);' – GrIsHu

Répondre

0

Sur la base des commentaires est le problème ici:

dictFilenames = dictPathFile.list(filter); 
if (dictFilenames.length > 0) { 

File.list() peut revenir null par exemple si le File est pas un répertoire. Et l'accès au champ length d'un tableau null conduit à . Le changement suivant aide probablement:

dictFilenames = dictPathFile.list(filter); 
if (dictFileNames != null && dictFilenames.length > 0) { 
+0

Merci pour la réponse. Le problème est que je connais seulement cette erreur de la console de développeur. Je ne suis pas confronté à cette erreur lors du test sur émulateur et mon appareil. Alors, comment savoir si ce problème a été résolu? Désolé, je suis encore nouveau dans le développement d'applications Android. – user2872856

+0

@ user2872856 Comme vous n'avez pas les étapes/l'environnement exact pour reproduire le plantage, vous ne pouvez pas être certain que le problème est vraiment résolu. Mais connaissant l'exception de plantage avec le numéro de ligne exact comme dans ce cas, vous pouvez revenir en arrière sur la cause immédiate du plantage (référence de tableau null) et une solution de contournement pour cela (vérifiez null avant d'utiliser). Le code émet de nombreuses hypothèses sur l'environnement d'exécution qui peuvent ne pas être vraies pour tous les périphériques et utilisateurs, par ex. 1) stockage externe existe 2) il est inscriptible 3) il contient un dossier du nom donné. – laalto

Questions connexes