使用File函数时,jUnit会获取NullPointerException

时间:2015-09-25 13:38:40

标签: java file junit nullpointerexception

如果您需要任何其他信息,请告诉我。

简短版本:

当使用jUnit 4.12进行测试时,这行代码会导致NullPointerException:

File[] files = new File(searchPath).listFiles();

长版:

首先,这是环境:

  • 操作系统:Win7 Pro(Netbeans以管理员身份运行)
  • IDE:Netbeans 8.0.2
  • 构建自动化工具:Gradle
  • Java:JDK 1.8
  • 测试框架:jUnit 4.12

只有在运行jUnit-tests时才会发生异常。 当我在没有任何测试的情况下构建它时,一切正常并且来自 File [] files = new File(searchPath).listFiles()的函数 listFiles()不会返回空。

gradle clean & gradle build -x test & gradle rest:jettyRun 2> test.txt

这是在我的类的构造函数中调用的问题函数:

/**
 * Scans for JSON files on given path
 * @param searchPath full path given
 * @return String[] with the full paths and names of found files
 */
private String[] scanForJsons(String searchPath){
    System.out.println("search path "+searchPath); // shows D:\..\core\files

    File[] files = new File(searchPath).listFiles(); // problem line, allways returns null

    System.out.print(((files!=null)?"Not null" : "Null"));
    System.out.println("files.length: "+files.length);
    String[] stringArray = new String[files.length];

    for(int i = 0; i < files.length; i++){
        String path = files[i].getName();
        if (path.endsWith(".json")) {
            path = path.substring(0, path.length() - 5);
        }
        stringArray[i] = path;
    }
    return stringArray;
}

2 个答案:

答案 0 :(得分:1)

documentation for File.listFiles()包括:

  

如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。

所以看起来就是这样。 d:\..\core\files的路径看起来不像我的有效路径名...您如何期望目录成为根目录的父目录?

您需要更改测试以提供有效路径 - 并且很可能会更改您的方法以应对可能返回listFiles()的{​​{1}}。

答案 1 :(得分:1)

如在 java.io.File 的描述中,应使用 java.nio.file 来克服 java.io.File 的限制强>

在我重新编写整个函数并从java.io.File和字符串迁移到java.nio.file和Path之后,它运行正常。

代码在Read all files in a folder找到。

private List<Path> scanForJsons(Path pathScanned){
    List<Path> pathList = new ArrayList<>();
    try {
            Files.walk(pathScanned).forEach(filePath -> {
            if (Files.isRegularFile(filePath)) {
                pathList.add(filePath);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
    }
    return pathList;
}

即使我不再需要它,我也写了这个函数来获取没有文件扩展名的文件名:

//Get a list of the filenames without the filename extension
private List<String> getRawNamesOfFiles(String filenameExtension){
    List<String> fileNames = new ArrayList<String>();
    try {
        Files.walk(Paths.get("").toAbsolutePath().getParent()).forEach(filePath -> {
            if (Files.isRegularFile(filePath)) {
                String fileName = getRawNameOfFile(filePath, filenameExtension);
                if(fileName != null){
                    fileNames.add(fileName);
                }
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fileNames;
}

// removes the filename extension 
// checks if the file extension of the path fits the wanted filename extension, returns null if it doesn't fit
private String checkAndEditTheName(Path path, String wantedFilenameExtension){
    int cutLength = wantedFilenameExtension.length() + (wantedFilenameExtension.startsWith(".")?0:1);
    String pathEnd = path.getFileName().toString();
    if(pathEnd != null && pathEnd.endsWith(wantedFilenameExtension)){ //search for a specific filename extension
        pathEnd = pathEnd.substring(0, pathEnd.length() - cutLength); // remove the filename extension and the point
        return pathEnd;
    }
    return null;
}