2012-01-11 4 views
-1

Я использую эту логику для удаления файлов в SD-карте. Он удаляет все файлы, но я получаю исключения NullPointer в журналах во время операции удаления файла. Любая помощь?Удаление файлов: Исключение NullPointer

Мой код:

void DeleteRecursive(File fileOrDirectory) { 
    if (fileOrDirectory.isDirectory()) { 
     try { 
      for (File child : fileOrDirectory.listFiles()) { 
       DeleteRecursive(child); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    fileOrDirectory.delete(); 
} 

Это сообщение я получаю во время операции удаления:

01-01 01:28:43.440: W/System.err(4183): java.lang.NullPointerException 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:34) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.DeleteRecursive(Delete_sdcard1Activity.java:35) 
01-01 01:28:43.450: W/System.err(4183):  at com.stericsson.sdcard.Delete_sdcard1Activity.onCreate(Delete_sdcard1Activity.java:23) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.Activity.performCreate(Activity.java:4465) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.ActivityThread.access$600(ActivityThread.java:122) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
01-01 01:28:43.450: W/System.err(4183):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-01 01:28:43.450: W/System.err(4183):  at android.os.Looper.loop(Looper.java:137) 
01-01 01:28:43.450: W/System.err(4183):  at android.app.ActivityThread.main(ActivityThread.java:4340) 
01-01 01:28:43.450: W/System.err(4183):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-01 01:28:43.450: W/System.err(4183):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-01 01:28:43.450: W/System.err(4183):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-01 01:28:43.450: W/System.err(4183):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-01 01:28:43.450: W/System.err(4183):  at dalvik.system.NativeStart.main(Native Method) 
+0

Опубликовать сообщение об исключении также с сообщением. –

+0

Ваш стиль кодирования не является стандартным стилем кодировки java. А также лучше использовать фигурные скобки для включения блоков кода, подобных этому блоку «if», чтобы улучшить читаемость вашего кода. –

+1

Вышеприведенный код в порядке. Можете ли вы поместить полную трассировку стека, которую вы получаете при удалении всех файлов? @Manjla это стиль стиля java standrard. – Acn

ответ

2

в listFIles() функция может возвращать нулевое значение, если имя пути обозначается объект Файл не является каталогом или если какой-либо ошибки ввода/вывода имеет место. Как стандартная практика, вы должны добавить нулевую проверку для возвращаемого значения listFiles().

0

для удаления файлов/папок рекурсивно:

public boolean deleteDir(File dir) { 
    if (dir != null && dir.isDirectory()) { 
     String[] children = dir.list(); 
     for (int i = 0; i < children.length; i++) { 
      boolean success = deleteDir(new File(dir, children[i])); 
      if (!success) { 
       return false; 
      } 
     } 
    } 

      return dir.delete(); 
} 
+0

Как можно использовать метод void return false? – Acn

+0

oops, мой плохой, исправил его ... :) – waqaslam

1

Commons апача -io FileUtils

FileUtils.deleteDirectory(new File("directory")); 
0

это: if(fileOrDirectory.isDirectory()) должен быть if(fileOrDirectory != null && fileOrDirectory.isDirectory()) и filesOrDirectory.delete(); должны быть

if(filesOrDirectory != null) { 
     filesOrDirectory.delete(); 
    } 
Смежные вопросы