2012-04-16 3 views
0

Я получаю исключение NullPointerException в следующей строке, прокомментированной ниже.
Иногда я получаю его (особенно в первой инстанции), иногда я этого не делаю. Поэтому я пытаюсь решить это раз и навсегда.
Я извлекаю путь к файлу из базы данных изображений, а затем использую растровое декодирование на нем. Я уверен, что в базе данных есть значения.NullPointerException в ArrayList изображений

спасибо.

 ImageDB imagedb = new ImageDB(this);  
     imagedb.open(); 

     ArrayList<String> image_list = new ArrayList<String>(); 
     image_list.clear(); 

      if(imagedb.open() != null){ 
      Cursor tagcursor = imagedb.retrieveTag(tag); 

      if(tagcursor.moveToFirst()){ 
       do{ 
        image_list.add(tagcursor.getString(tagcursor.getColumnIndex(tag))); 

       }  
       while(tagcursor.moveToNext()); 

       } 

      tagcursor.close(); 
      imagedb.close(); 
      } 


       if(image_list != null && !image_list.isEmpty()){ 
      Collections.shuffle(image_list); 

    if(image_list.get(0).toString() != null){ // nullpointerexception here or below if I comment here 

       imagepath = image_list.get(0).toString(); 
      } 

     } 

Это трассировка стеки, но его так же, как предупреждение, программа по-прежнему работает:

04-16 19:03:31.603: W/System.err(1355): java.lang.NullPointerException 
04-16 19:03:31.613: W/System.err(1355):  at com.MucaaApps.imageUpdate.ImageService.setTag(ImageService.java:422) 
04-16 19:03:31.613: W/System.err(1355):  at com.MucaaApps.ImageUpdate.imageService.setImageIcon(ImageService.java:377) 
04-16 19:03:31.623: W/System.err(1355):  at com.MucaaApps.ImageUpdate.ImageService.onStart(ImageService.java:237) 
04-16 19:03:31.623: W/System.err(1355):  at android.app.Service.onStartCommand(Service.java:306) 
04-16 19:03:21.552: W/System.err(1355):  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873) 
04-16 19:03:21.552: W/System.err(1355):  at android.app.ActivityThread.access$3500(ActivityThread.java:119) 
04-16 19:03:21.552: W/System.err(1355):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926) 
04-16 19:03:21.552: W/System.err(1355):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-16 19:03:21.552: W/System.err(1355):  at android.os.Looper.loop(Looper.java:123) 
04-16 19:03:21.552: W/System.err(1355):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
04-16 19:03:21.563: W/System.err(1355):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-16 19:03:21.563: W/System.err(1355):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-16 19:03:21.573: W/System.err(1355):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-16 19:03:21.573: W/System.err(1355):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-16 19:03:21.582: W/System.err(1355):  at dalvik.system.NativeStart.main(Native Method) 
+1

Можете ли вы опубликовать StackTrace? Из вашего комментария, похоже, что нет ничего в индексе 0 из image_list, который заставил бы 'toString()' бросать 'NullPointerException' – Nicholas

+0

@Nicholas, я добавил трассировку стека. Он приходит как предупреждение. Как я уже сказал, он показывает исключение NullPointerException в строке, которую я прокомментировал. – irobotxxx

+0

Попробуйте положить строки прерывания или операторы вывода, чтобы убедиться, что 1) 'imagedb.open()' не является нулевым, 2) 'tagcursor' не является нулевым или имеет значения, 3)' image_list' имеет значения после попытки его заполнения. – Nicholas

ответ

1

Простой ответ. Вы добавили значение null в свой ArrayList.

вы можете это исправить так:

ImageDB imagedb = new ImageDB(this); 
     imagedb.open(); 
     ArrayList<String> image_list = new ArrayList<String>(); 
     image_list.clear(); 

     if (imagedb.open() != null) { 
      Cursor tagcursor = imagedb.retrieveTag(tag); 

      if (tagcursor.moveToFirst()) { 
         final int index = tagcursor.getColumnIndex(tag) 
       do { 
        final String val = tagcursor.getString(index); 
        if (val!=null){ 
         image_list.add(val); 
        } 

       } while (tagcursor.moveToNext()); 

      } 

      tagcursor.close(); 
      imagedb.close(); 
     } 

     if (image_list != null && !image_list.isEmpty()) { 
      Collections.shuffle(image_list); 

      if (image_list.get(0).toString() != null) { // nullpointerexception 
                 // here or below if i 
                 // comment here 

       imagepath = image_list.get(0).toString(); 
      } 

     } 
+0

Я согласен с этим, однако реальная проблема, скорее всего, где-то дальше. Сыворотка, вы положили нулевые значения в свою базу данных для начала? Возможно, вам стоит обратиться к этому вопросу, так как это может указывать на другую проблему – Kyle

+0

, поэтому я изменил его код, чтобы не вносить нуль в список :-) – Renard

+0

@Kyle .. у меня будет подробный взгляд, чтобы узнать, но я думаю, что раньше я проверил null. – irobotxxx

0

Вы перетасовка списка. Поэтому я предполагаю, что один из путей к файлу равен null и случайным образом перетасовывается в первую позицию, что приводит к нулевому указателю.

Вы можете проверить его здесь

String filePath = tagcursor.getColumnIndex(tag); 
if (filepath == null || filepath.isEmpty()) [ 
    //get additional info from cursor ..row id etc to debug 
} else { 
    image_list.add(filepath); 
} 
+0

@Anirudh .. спасибо – irobotxxx

Смежные вопросы