当我尝试在驱动器中搜索时,程序抛出NullPointerException?

我写了一个程序来查找文件或目录。
当我尝试在目录中搜索文件时,它正常工作

java FileSearch abc.txt f:\xyz
但是当我尝试从本地驱动器搜索文件而不是程序抛出exception时
java FileSearch abc.txt f:\
显示所有搜索结果后抛出NullPointerException。

nullpointerexcepion

代码是:

 import java.io.*; class FileSearch{ static String fd; static boolean flg=true; public static void main(String arr[]){ fd=arr[0]; String path=arr[1]; String dir[]=new File(path).list(); new FileSearch().finder(dir,path); if(flg){System.out.print("File not found.");} } public void finder(String[] dir,String path){ for(int i=0;i<dir.length;i++){ if(dir[i].equals(fd)){ System.out.println(path+"\\"+fd); flg=false; } if(new File(path,dir[i]).isDirectory()) finder(new File(path,dir[i]).list(),path+"\\"+dir[i]); } } } 

我想知道为什么抛出这个exception以及如何解决它。

名单()

listFiles()的文档提到如果此抽象路径名不表示目录,或者发生I / O错误,它将返回null 。 此外,您需要检查file.canRead()是否应用程序可以读取该目录。

恕我直言

一直用这种方式;

 String[] files = file.list(); if (files!=null) { for (String f : files) processFile(f); } 

推荐这个;

 File directory = new File(directoryName); //get all the files from a directory File[] fList = directory.listFiles(); if(fList != null){ for (File file : fList){ if (file.isFile()){ System.out.println(file.getName()); } } } 

如果您有任何疑问,请告诉我。

另一种方法是使用JDK7中引入的FileVisitor接口来执行搜索。 http://docs.oracle.com/javase/tutorial/essential/io/walk.html上的链接提供了有关如何使用FileVisitor界面的详细信息。

以下代码块是搜索的重新实现,除了普通目录之外,应该能够在Windows驱动器级别列出文件。 请注意,该实现使用作为NIO 2文件IO操作的一部分提供的Files.walkTree方法。

 public class FileSearch { static String fd; static boolean flg = true; static class FileSearchVisitor extends SimpleFileVisitor { private final Path pathToSearch; boolean found; FileSearchVisitor(Path pathToSearch) { found = false; this.pathToSearch = pathToSearch; } public boolean isFound() { return found; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { super.preVisitDirectory(dir, attrs); if (pathToSearch.getFileName().equals(dir.getFileName())) { System.out.println("Found " + pathToSearch); found = true; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { super.visitFile(file, attrs); if (pathToSearch.getFileName().equals(file.getFileName())) { System.out.println("Found " + pathToSearch); found = true; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) { System.err.println("Visit failed for file at path : " + file); exc.printStackTrace(); return FileVisitResult.CONTINUE; } } public static void main(String arr[]) throws Exception { fd = arr[0]; String path = arr[1]; final Path searchFile = Paths.get(fd); Path filePath = Paths.get(path); FileSearchVisitor visitor = new FileSearchVisitor(searchFile); Files.walkFileTree(filePath, visitor); if (!visitor.isFound()) { System.out.print("File not found."); } } } 

这是你如何解决它:

 import java.io.*; class FileSearch{ static String fd; static boolean flg=true; public static void main(String arr[]){ fd=arr[0]; String path=arr[1]; String dir[]=new File(path).list(); new FileSearch().finder(dir,path); if(flg){System.out.print("File not found.");} } public void finder(String[] dir,String path){ if(dir == null){ return; } for(int i=0;i 

为什么? String dir [] = new File(path).list(); 在您指定的目录上为null,因此当您调用dir.length时,您将获得空指针exception

另一件可以帮助你理解的事情是System.out.print(new File(path).isDirectory()); 如果它是假的,那么你将获得空指针exception。