2012-01-11 32 views
-1

私はこのロジックを使用してsdcardのファイルを削除しています。すべてのファイルを削除していますが、ファイル削除操作中にログに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

あるべきif(fileOrDirectory.isDirectory())if(fileOrDirectory != null && fileOrDirectory.isDirectory())filesOrDirectory.delete();する必要があります発生する。 標準的な方法として、listFiles()の戻り値としてnullチェックを追加する必要があります。

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メソッド偽を返しますか? – Acn

+0

おっと、私の悪い、それを固定:) – waqaslam

1

Apacheのコモンズを-io FileUtils

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

この:Fileオブジェクトによって表されるパス名は、ディレクトリや一部のI/Oエラーならばされていない場合LISTFILES()関数はnullを返すことがあり

if(filesOrDirectory != null) { 
     filesOrDirectory.delete(); 
    } 
関連する問題