2015-09-25 40 views
1

如果您需要任何其他信息,请让我知道。当使用文件函数时,jUnit获取NullPointerException

短版本:

时使用JUnit 4.12测试的这行代码导致NullPointerException异常:

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

龙版本:

首先,这是环境:

  • OS:Win7的临(Netbeans的运行作为管理员)
  • IDE:Netbeans的8.0.2
  • 构建自动化工具:摇篮
  • 的Java:JDK 1.8
  • 测试框架:JUnit的4.12

只有当我运行jUnit测试时才会发生异常。 当我建立它没有任何测试,一切正常,功能listFiles() from File [] files = new File(searchPath).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; 
} 
+0

现在还不清楚有问题的线路是否*收益* NULL或抛出一个例外。你的文字说了一件事,评论说另一件事。另外,请提供有问题的单元测试。 –

回答

1

如在的java.io.Filejava.nio.file描述应当被用来从的java.io.File克服的限制。

当我重新整理了整个功能并从java.io.File和字符串迁移到java.nio.file和路径它工作正常。

该代码被发现在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; 
} 
1

documentation for File.listFiles()包括:

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

所以它看起来就是这样发生的事情。 d:\..\core\files的路径对我来说看起来不像一个有效的路径名......你怎么能期望一个目录是根目录的父目录?

您需要更改测试以提供有效路径 - 并且很可能会更改您的方法以应对listFiles()潜在返回null

+0

其实它是一个有效的路径名。我刚刚在我的评论中缩短了它,因为里面有我的真实姓名。 [编辑]这是完整的路径:D:\ OneDrive \ MyName \ Projekte \ Java \ REST \ Projekt_Abgabe \ Rechteverwalltung \ Data \ core \ files – ZeugeDerUnity

+0

@ZeugeDerUnity:那不是非常有用,是吗?我建议你尝试记录'File.exists(searchPath)'和'File.isDirectory(searchPath)'...我仍然认为这个问题是由于路径在某些方面不合适。 –

+0

我在所提到的功能之上添加了以下行: 'File directory = new File(searchPath); ()是否是目录?:“是”:“否”));' 当我运行jUnit测试:**是目录?:否** 当我建立它没有测试,并与jettyRun运行:**是目录?:是** – ZeugeDerUnity

相关问题