2017-02-12 118 views
-3

我的问题不在于空指针异常。 我的问题是关于为什么在C中进行文件搜索时:我得到了零点异常,即使我可以列出内容。 我做了一个类来搜索文件。 如果我在目录中搜索,一切正常。 但是,如果我在像c或d这样的驱动器中搜索,我会得到一个空指针异常。 我该如何解决这个问题?在Java根目录下搜索文件

下面的代码:

import java.io.File; 
import java.util.ArrayList; 

/** 
* Created by Marcwe on 12/02/2017. 
*/ 
public class FileSearch { 

    ArrayList<String> listOfResult = new ArrayList<>(10); 

    public FileSearch(File searchPath, String theFile) { 
     ArrayList<String> oneList = new ArrayList<>(10); 
     listOfResult = searchTheFile(theFile, searchPath, oneList); 
     for (String x : listOfResult) { 
      System.out.println(x); 

     } 
    }; 

    public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) { 
     File pathToSearch = inThePath; 
     if (!(inThePath == null)) { 
      for (File item : pathToSearch.listFiles()) { 
       if (!(item == null) && !(item.isFile())) { 
        System.out.println(item.getAbsolutePath()); 
        aList = (searchTheFile(theFileToSearch, item, aList)); 
       } else { 
        if (!(item == null)) { 
         if (item.getName().equalsIgnoreCase(theFileToSearch)) { 
          aList.add(item.getAbsolutePath()); 
         } 
        } 
       } 
      } 
     } 
     return aList; 
    } 

    public static void main(String[] args) { 
     FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt"); 
    } 
} 
+0

告诉我们更多关于错误的信息。 – byxor

+0

可能的重复[什么是NullPointerException,以及如何解决它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) –

+2

您可以使用[适用于JDK的方法]将此代码缩短为几行(https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html #walkFileTree-java.nio.file.Path-java.nio.file.FileVisitor-)。 –

回答

1
FileSearch searchTest = new FileSearch(new File("C:/"), "test.txt"); 

在这里,你浏览的所有磁盘以查找文件。
这可能是一些文件夹或文件通过

for (File item : pathToSearch.listFiles()) { 

你在一个递归调用的方式不能用Java文件API拟上市。
我认为你可能有虚拟或隐藏文件夹的一些问题。
Javadoc指示如果此抽象路径名(此处为pathToSearch变量)不表示目录或发生I/O错误,它可能会返回null。
这是相当广泛的文件系统可能有很多特殊的地方,javadoc不能引用所有的东西。

此外,您可能会错过列出某些文件夹或文件的一些权利。可能会上涨SecurityException

以下是有关的File[] java.io.File.listFiles()回报的Javadoc:

返回:

抽象路径名表示的文件和目录 此抽象路径名表示的目录的数组。如果目录为空,则数组将为 。如果此抽象 路径名不表示目录或发生I/O错误,则返回null。 抛出:SecurityException - 如果存在安全管理及其 SecurityManager.checkRead(String)方法否认读取权限 目录因为:在foreach 1.2

,所以我想你不应该直接调用listFiles()因为null值会产生NullPointerException

for (File item : pathToSearch.listFiles()) { 

你应该选择调用listFiles()检索File阵列和做循环只有当这是不是null

File[] files = pathToSearch.listFiles(); 
if (files != null){ 
    for (File item : files) { 
    ... 
    } 
} 

除此之外,您还应该抓住SecurityException,因为对文件夹或文件中的潜在缺失权利,以避免在运行时意外的异常会阻止搜索精加工而成。

最后,您可以通过应用失败快速原则来降低方法的嵌套级别:尽快处理失败的案例。
当你使用递归时,你应该做的方法非常直接可读。

public ArrayList<String> searchTheFile(String theFileToSearch, File inThePath, ArrayList<String> aList) { 

    File pathToSearch = inThePath; 

    if (inThePath != null)) { 

     // fail fast cases 
     File[] files = null; 
     try { 
      files = pathToSearch.listFiles(); 
     } catch (SecurityException e) { 
      return aList; 
     } 

     if (files == null) { 
      return aList; 
     } 

     // nominal case 
     for (File item : files) { 
      ... 
     }