2013-04-29 92 views
4

我有一個非常簡單的方法,它掃描目錄結構以執行檢查。掃描如下所示:掃描目錄時發生java.lang.NullPointerException

File file = new File(initpath); 

for(File hex : file.listFiles(new HexagonNameFilter())) { 

    for(File wall : hex.listFiles()) { 

     for(File shelf : wall.listFiles()) { 

      for(File book : shelf.listFiles()) { 

       // Perform some actual work 
      } 
     } 
    } 
} 

該方法在執行程序期間被調用很多次。

不一致(意味着,在掃描過程中的某個不可預知的地方),我得到一個java.lang.NullPointerException,堆棧跟蹤指向for語句之一(它也是不一致的)。這不是很有啓發。我正在考慮將FilenameFilters傳遞給三個listFiles()調用,但無法看到這將如何幫助解決該問題。

+1

壞消息:'listFiles'可能返回null:所以你需要一個'File []'變量和一個if語句。或者在你自己的函數中使用wrap listFiles。 – 2013-04-29 16:23:43

+0

http://stackoverflow.com/questions/6077909/is-there-a-way-to-avoid-null-check-before-the-for-each-loop-iteration-starts – ykaganovich 2013-04-29 18:40:52

回答

3

您應該驗證您是否在目錄上調用此方法。否則,它返回null。

listFiles

公共文件[] listFiles()

返回一個抽象路徑表示在此抽象路徑名錶示的 目錄中的文件的陣列。

如果此抽象路徑名不表示目錄,則此方法返回空。否則,返回一個File對象數組, 一個用於目錄中的每個文件或目錄。路徑名錶示 目錄本身和目錄的父目錄不是 包含在結果中。每個生成的抽象路徑名是 ,使用File(File,String) 構造函數從此抽象路徑名構造而成。因此,如果此路徑名是絕對的,那麼每個產生的路徑名都是絕對的;如果此路徑名是相對的,則每個產生的路徑名將相對於相同的目錄。

不保證結果數組 中的名稱字符串將以任何特定順序出現;他們不是,特別是, 保證按字母順序出現。

返回:一個抽象路徑名數組,表示該抽象路徑名錶示的目錄中的文件和 目錄。如果目錄是空的 數組將爲空。如果此 抽象路徑名不表示目錄,或者發生I/O錯誤 ,則返回null。

+0

謝謝,我認爲這有助於解決問題。我會嘗試使用FileFilter或FilenameFilter來確保只掃描要掃描的目錄。令我困惑的是我知道我掃描的目錄絕對不是空的並且存在 - 因此缺少檢查。不過,我現在看到我可能會在點文件中調用該方法! – principal 2013-04-29 16:32:36