0

このコードを使用して、特定のディレクトリで特定のファイル パターンを再帰的に検索しています。

if (file.isDirectory()) {
        System.out.println("Searching directory ... "
                + file.getAbsoluteFile());
        if (file.canRead()) {
            System.out.println("Can read...");
            if (file.listFiles() == null) {
                System.out.println("yes it is null");
            }
            for (File temp : file.listFiles()) { // Problemetic line
                if (temp.isDirectory()) {
                    search(temp);
                } else {
                    // code to find a file
                }
            }
}

上記のコードは次のように出力します(例外も発生します):

Searching directory ... C:\swsetup\SP46840\Lang\zh-TW
Can read...
Searching directory ... C:\System Volume Information
Can read...
yes it is null

例外は次のとおりです。

Exception in thread "main" java.lang.NullPointerException
at Demo.search(Demo.java:61)
at Demo.search(Demo.java:63)

(file.listFiles())私のコードでは、「システムボリューム情報」などのシステムディレクトリからファイルのリストを取得しようとしているため、行は : を指しています。それはシステムディレクトリだからだと思うので、私が気付いていない問題が発生している可能性があります。

私の質問は:

  • このシナリオをどのように処理すればNullPointerExceptionforeachループが継続するようになりますか?
  • または、最初に例外を回避する方法(システムディレクトリなどであるかどうかを確認するなど)のほうがよいでしょうか?

誰でもこれで私を案内してもらえますか? 注: これは Windows XP で発生しています (数か月前に Windows 7 でテストしましたが、そこでは問題が発生していなかったと思います)。

4

3 に答える 3

1

javaDoc から:

 An array of abstract pathnames denoting the files and
 directories in the directory denoted by this abstract
 pathname.  The array will be empty if the directory is
 empty.  Returns <code>null</code> if this abstract pathname
 does not denote a directory, or if an I/O error occurs.

したがって、null をチェックして、Narendra Pathai の anwser からのアプローチを使用することをお勧めします。

于 2013-10-25T11:52:12.650 に答える
1

これを試して:

if (file.isDirectory()) {
        System.out.println("Searching directory ... "
                + file.getAbsoluteFile());
        if (file.canRead()) {
            System.out.println("Can read...");
            if (file.listFiles() == null) {
                System.out.println("yes it is null");
            } else { /* add the else */
              for (File temp : file.listFiles()) { // Problemetic line
                  if (temp.isDirectory()) {
                      search(temp);
                  } else {
                      // code to find a file
                  }
              }
            }
}
于 2013-10-25T11:30:16.577 に答える