0

ファイルの名前を指定するだけでWindowsでファイルを検索したいのですが、最初はこのコードを使用してすべてのファイルをリストしようとしました

File[] files = File.listRoots();   
for(File f : files){   
  parseAllFiles(f.getPath());   
}   


...

public static void parseAllFiles(String parentDirectory){   
  File[] filesInDirectory = new File(parentDirectory).listFiles();   
  for(File f : filesInDirectory){   
    if(f.isDirectory()){   
      parseAllFiles(f.getAbsolutePath());   
    }   
    System.out.println("Current File -> " + f);             
  }     
}

しかし、私は例外がありました

Exception in thread "main" java.lang.NullPointerException
    at fileoper.parseAllFiles(fileoper.java:24)
    at fileoper.parseAllFiles(fileoper.java:26)
    at fileoper.parseAllFiles(fileoper.java:26)
    at fileoper.main(fileoper.java:19)

これに関する提案はありますか?

4

4 に答える 4

0

listFiles()ファイルオブジェクトでメソッドを直接呼び出しています。ファイルがディレクトリでない場合は null を返します。そのため、 NPEを取得しています。最初のファイルがディレクトリかどうかを確認してから、メソッドを呼び出します。File#listFiles()
によると

pathname がディレクトリを示さない場合、このメソッドは null を返します。それ以外の場合は、File オブジェクトの配列が返されます

これは変更するコードです

public static void parseAllFiles(String parentDirectory)
{        
          File file =  new File(parentDirectory);
          if(file.isDirectory())
         {
           File[] filesInDirectory =listFiles();   
           for(File f : filesInDirectory)
           {    
                    parseAllFiles(f.getAbsolutePath());   
            }   

          }else{
               System.out.println("Current File -> " + file);                  
          }

}

于 2013-08-05T08:10:13.040 に答える
0

parseAllFiles()開きたいすべてのファイルが実際に存在するかどうかは、次の方法で確認できます。

File fileInDirectory = new File(parentDirectory);
  if(fileInDirectory.exists()){
  File[] filesInDirectory = fileInDirectory.listFiles();
} 

次に、どのファイルが見つからない/作成されていないかを理解できます。

最初のループでも同じことができます:

for(File f : files){  
  if(f.exists()) 
  parseAllFiles(f.getPath());   
}   
于 2013-08-05T08:12:47.663 に答える
0

私はあなたの例を試しました。を開こうとすると、ヌル ポインターが表示されます/root。ターミナル経由で開こうとすると、権限がないと表示されます。

したがって、基本的に権限に問題があります。

javadoc は言う:

̀Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.

これをキャッチするにfilesInDirectoryは、null かどうかを確認する必要があります。

public static void parseAllFiles(String parentDirectory){   
  File[] filesInDirectory = new File(parentDirectory).listFiles();
  //Added this line.
  if(filesInDirectory != null){   
    for(File f : filesInDirectory){   
      if(f.isDirectory()){   
        parseAllFiles(f.getAbsolutePath());   
      }   
      System.out.println("Current File -> " + f);             
    }
  }
}
于 2013-08-05T08:16:55.003 に答える