当前位置: 首页 > 知识库问答 >
问题:

jUnit 在使用 File 函数时获得 NullPointerException

万俟鸿波
2023-03-14

如果你需要任何其他信息,请让我知道。

简短版本:

用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-test时才会发生异常。当我在没有任何测试的情况下构建它时,一切正常,并且File[]file=new File(搜索路径). listFiles()中的函数listFiles()不会返回null。

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个答案

商飞龙
2023-03-14

如java.io的描述所示。文件,java.nio。文件应该用来克服java.io.file的限制。

在我重新编写了整个函数并从java.io迁移之后。文件和字符串到java.nio。文件和路径。

该代码是在读取文件夹中的所有文件中找到的。

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;
}
姬乐
2023-03-14

<code>文件的文档。listFiles()包括:

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

所以看起来这就是正在发生的事情。d:\.. 的路径。\核心\文件对我来说看起来不像一个有效的路径名...您如何期望目录成为根目录的父目录?

您需要更改您的测试来提供一个有效的路径——并且很可能更改您的方法来处理< code>listFiles()可能返回的< code>null。

 类似资料:
  • 我无法同时运行TestNG/JUnit的Cucumber TestRunner类。我希望在我的框架中包含Testng和junit。我得到一些abc类错误。我的项目中有所有的依赖项。我这里有2qns。1.当从cucumber junit导入时,我可以在我的cucumber脚本中使用Testng注释吗?2.如何解决错误执行我的testrun。 我错过了什么...如果我错过了什么,请帮我把它修好。

  • 本文向大家介绍JavaScript中使用arguments获得函数传参个数实例,包括了JavaScript中使用arguments获得函数传参个数实例的使用技巧和注意事项,需要的朋友参考一下 JS与PHP在函数传参方面有点不同,PHP形参与实参个数要匹配,而JS就灵活多了,可以随意传参,实参比形参少或多都不会报错。 实参比形参多不会报错 执行结果 我们再来看看形参比实参多的结果 执行结果 a 对应

  • 我的类路径:C:\Users\48790\IdeaProjects\WorkingWithCommand\Src在terminal:C:\Users\48790\IdeaProjects\WorkingWithCommand的目录中 我尝试了:-cp C:\users\48790\ideaProjects\workingwithcommand\src和 set CLASSPATH=c:\users

  • 我已经写下了如下测试用例,并得到了以下错误, 日志错误: 失败:setpassword java.lang.AssertionError:1个预期失败。预期状态代码 代码:

  • 我正在使用Junit4测试外部java类。我想模拟下面的代码行 我试过这样 但我仍然收到了这个错误“java.lang.ExceptionInInitializeError” Java语言lang.ExceptionInInitializerRor在sun。反映GeneratedSerializationConstructorAccessor6。java上的newInstance(未知源)。lan

  • 函数功能:获得 LuaBox 当前版本 函数方法 version = device.getLuaBoxVer() 返回值 类型 说明 version string 返回获得 LuaBox 当前版本如:1.0 函数用例 version = device.getLuaBoxVer() dialog(version,5000) 注意事项 目前积木编程函数和触动精灵函数不通用,请仔细查看本手册,此手册中