2015-05-05 4 views
2

Итак, у меня есть 3 папки в моей галерее Android. Я пытаюсь прочитать файлы этих папок в массивах файлов, а затем, оттуда, перевести источник изображения в фактический ImageViews.Получение исключения NullPointer с File.listfiles()

Моя проблема в том, что я получаю NullPointerException при ссылке на мой массив файлов. Вот код:

// Get image files paths. 
private File topsFolder = new File(Environment.getExternalStorageDirectory().getPath() + "/DressIt Tops/"); 
private File bottomsFolder = new File(Environment.getExternalStorageDirectory() 
     .getPath() + "/DressIt Bottoms/"); 
private File shoesFolder = new File(Environment.getExternalStorageDirectory() 
     .getPath() + "/DressIt Shoes/"); 

private File[] allTops = topsFolder.listFiles(); 
private File[] allBottoms = bottomsFolder.listFiles(); 
private File[] allShoes = shoesFolder.listFiles(); 

Использование этих массивов изображений файлов ...

ImageAdapter topAdapter = new ImageAdapter(createList(allTops)); 
    topList.setAdapter(topAdapter); 

    ImageAdapter midAdapter = new ImageAdapter(createList(allBottoms)); 
    midList.setAdapter(midAdapter); 

    ImageAdapter botAdapter = new ImageAdapter(createList(allShoes)); 
    botList.setAdapter(botAdapter); 

Мой метод CreateList. Ошибка, когда я ссылаюсь на list.length.

private List<ImageClass> createList(File[] list) { 
    List<ImageClass> result = new ArrayList<ImageClass>(); 
    ImageClass img; 
    Bitmap bmp; 

    if (list.length > 0) { 
     for (int i = 0; i < list.length; i++) { 
      bmp = BitmapFactory.decodeFile(list[i].getAbsolutePath()); 
      img = new ImageClass(bmp); 
      result.add(img); 
     } 
    } else 
     result.add(new ImageClass(this.getResources().getIdentifier(
       "no_imgs_yet", "drawable", this.getPackageName()))); 
    return result; 
} 

Как я уже говорил, ошибка, когда я использую list.length ссылаться на один из массивов файлов, таких как allTops, что я создал в первом сегменте кода.

А вот сообщения об ошибках LogCat:

05-05 19:43:49.409: D/dalvikvm(537): Not late-enabling CheckJNI (already on) 
05-05 19:43:51.069: D/dalvikvm(537): GC_FOR_ALLOC freed 70K, 3% free 10185K/10439K, paused 63ms 
05-05 19:43:51.079: I/dalvikvm-heap(537): Grow heap (frag case) to 10.566MB for 562516-byte allocation 
05-05 19:43:51.139: D/dalvikvm(537): GC_CONCURRENT freed 1K, 3% free 10733K/11015K, paused 6ms+7ms 
05-05 19:43:51.278: D/com.example.dressit(537): /mnt/sdcard/DressIt Tops 
05-05 19:43:51.289: D/AndroidRuntime(537): Shutting down VM 
05-05 19:43:51.289: W/dalvikvm(537): threadid=1: thread exiting with uncaught exception (group=0x409961f8) 
05-05 19:43:51.319: E/AndroidRuntime(537): FATAL EXCEPTION: main 
05-05 19:43:51.319: E/AndroidRuntime(537): java.lang.RuntimeException: Unable to start activity 

ComponentInfo{com.example.dressit/com.example.dressit.MainActivity}: java.lang.NullPointerException 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.os.Looper.loop(Looper.java:137) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread.main(ActivityThread.java:4340) 
05-05 19:43:51.319: E/AndroidRuntime(537): at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 19:43:51.319: E/AndroidRuntime(537): at java.lang.reflect.Method.invoke(Method.java:511) 
05-05 19:43:51.319: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-05 19:43:51.319: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-05 19:43:51.319: E/AndroidRuntime(537): at dalvik.system.NativeStart.main(Native Method) 
05-05 19:43:51.319: E/AndroidRuntime(537): Caused by: java.lang.NullPointerException 
05-05 19:43:51.319: E/AndroidRuntime(537): at com.example.dressit.MainActivity.createList(MainActivity.java:125) 
05-05 19:43:51.319: E/AndroidRuntime(537): at com.example.dressit.MainActivity.onCreate(MainActivity.java:103) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.Activity.performCreate(Activity.java:4465) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
05-05 19:43:51.319: E/AndroidRuntime(537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
05-05 19:43:51.319: E/AndroidRuntime(537): ... 11 more 
05-05 19:43:51.509: D/dalvikvm(537): GC_CONCURRENT freed 420K, 5% free 10747K/11271K, paused 6ms+5ms 
05-05 19:44:25.629: I/Process(537): Sending signal. PID: 537 SIG: 9 

У меня есть мое разрешение на месте, а также:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

К сожалению, чтобы бросить в так много кода, но я чувствую, как она является необходимым и достаточным для того, чтобы кто-то мог выяснить здесь проблему.

Я провел здесь несколько часов и подумал, что я попрошу сообщество! Большое спасибо всем.

EDIT: Спасибо за отзыв! Вот мой код, который сохраняет сделанные снимки. Это должно показать вам весь путь сохраненных изображений. Кроме того, мой LogCat говорит, что путь к файлу -/mnt/sdcard/DressIt Tops.

/** Create a File for saving an image or video */ 
private static File getOutputMediaFile(int type) { 
    // To be safe, you should check that the SDCard is mounted 
    // using Environment.getExternalStorageState() before doing this. 

    String dirName; 

    if (imageType == 1) { 
     dirName = "DressIt Tops"; 
    } else if (imageType == 2) { 
     dirName = "DressIt Bottoms"; 
    } else 
     dirName = "DressIt Shoes"; 

    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      dirName); 
    // This location works best if you want the created images to be shared 
    // between applications and persist after your app has been uninstalled. 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(dirName, "failed to create directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") 
      .format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } else if (type == MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "VID_" + timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 
    return mediaFile; 
} 
+1

list имеет значение null, что должно означать, что topsFolder.listFiles() возвращает null. Вы уверены, что файл topsFolder существует и является каталогом? (Одинаковые вопросы для «bottomomsFolder» и «shoesFolder») – Damien

+2

Итак, какая строка - строка 125 «MainActivity»? Я предполагаю, что это 'if (list.length> 0)' из метода 'createList (...)'. В этом случае один или другой из 'allTopes',' allBottoms' или 'allShoes' равен null. – Squonk

+0

@JonasCz: Как бы вы предложили вызвать NPE? – Squonk

ответ

1

Согласно документации File.listFiles(), он будет возвращать null если File не является каталогом.

Есть три (очень похожая) альтернатива, как, почему это мое быть ...

  1. String возвращаемых (например) ... Environment.getExternalStorageDirectory().getPath() + "/DressIt Tops/" не представляет действительный каталог (то же самое можно подать заявку на ..."/DressIt Bottoms/" и/или ..."/DressIt Shoes/").
  2. Strings вернулся ARE действительные пути НО один или другой из них представляет собой файл и НЕ каталог.
  3. В каталогах DO есть BUT У вас есть опечатка с именем каталога - помните, что файловая система чувствительна к регистру. Если вы создали каталог «/ DressIt Tops /» как «/ dressIt tops /» (например), он не будет найден в качестве допустимого пути.

Еще одна вещь - никогда не предполагайте путь в любую точку файловой системы Android - зарегистрируйте то, что на самом деле возвращает Environment.getExternalStorageDirectory().getPath(), проверьте, где вы создали каталоги, а также проверьте, есть ли у вас все в правильном случае.

+0

Он вернул/mnt/sdcard, когда я зарегистрировал, что Environment.getExternalStorageDirectory(). GetPath() возвращен. Я попробую добавить это к имени пути к файлу. Просто испытал это - не повезло. – Matt

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