如果您需要任何其他信息,请告诉我。
简短版本:
当使用jUnit 4.12进行测试时,这行代码会导致NullPointerException:
File[] files = new File(searchPath).listFiles();
长版:
首先,这是环境:
只有在运行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;
}
答案 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;
}