2015-09-25 36 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

相關問題