2013-01-11 104 views
1

今天我寫了一個小型Java程序來查找我的硬盤上的文件,部分原因是Windows缺少正確的文件,部分原因是它是爲了好玩。它只是遍歷一個目錄的所有孩子,並遞歸通過他們所有的孩子,如果他們是目錄。但後來我有一個NullPointerException。經過一些System.out.println()'stry-catch block我發現這發生在D:\System Volume InformationC:\Users\Public\Documents\My VideosC:\ProgramData\Templates等一些目錄上。 Windows本身說,當在資源管理器地址欄中輸入「訪問被拒絕」時。當探索,他們似乎被鎖定。從java.io.Filesource告訴我:爲什麼java.io.File.listFiles()拋出NPE而不是正確的異常?

public File[] listFiles() { 
    String[] ss = list(); 
    if (ss == null) return null; //This line seems to cause the NPE 
    int n = ss.length; 
    File[] fs = new File[n]; 
    for (int i = 0; i < n; i++) { 
     fs[i] = new File(ss[i], this); 
    } 
    return fs; 
} 

我的問題是,爲什麼沒有適當的發言權,IOExceptionSecurityException,甚至是IDontCareWhatKindOfExceptionButPleaseNoNullPointerExceptionException

我知道我可以只try-catchNPEs,或檢查null,但我真的很好奇爲什麼有拋出沒有適當Exception

因爲我不喜歡try/catch和檢查null因爲代碼的審美價值,我做這從模擬一些java.io.File方法,因爲它們是私有的一些討厭,討厭的反射代碼(有很多虛僞try/catch塊),和一些軟件包(如java.io.FileSystem)不可見。而且因爲我不關心的一些Windows文件,我用這個代碼根本不理會他們,給我一個空array

public static File[] listFiles(File mThis) { 
    String[] ss = list(mThis); 
    if (ss == null) { 
     //System.out.println("ss is null"); 
     return new File[] {}; 
    } 
    int n = ss.length; 
    File[] fs = new File[n]; 
    for (int i = 0; i < n; i++) { 
     fs[i] = getNewFile(ss[i], mThis); 
    } 
    return fs; 
} 

編輯:爲了避免誤解:我使用try/catch,我只是不像他們一樣美觀。

EDIT2:我寧願使用GUI而不是命令提示符。我非常不喜歡Windows搜索圖形用戶界面。這幾乎是痛苦的使用。

+0

你有沒有聽說過'find'命令? – Woot4Moo

+0

@ Woot4Moo命令行沒有適當的GUI。我更喜歡GUI。 – stealthjong

+0

編寫一個GUI並以這種方式調用它?只是說微軟解決了在系統上查找文件的問題,只是想知道在GUI外面有什麼缺點。 – Woot4Moo

回答

2

簡短的回答:

  • 安裝JDK 7;
  • 使用新的Files API。

之後你再也不會回到File

+0

至少你提供了一些有用的幫助,而不是指出我的 – stealthjong

+1

哦,這並不是說你真的在這裏犯了錯誤......但是你有沒有想過爲什麼有那麼多處理'File'對象的API /實用程序類(例如commons-io)?只是包裝API並拋出異常;) – fge

2

爲什麼,因爲API的設計者正確識別的功能合同的原因(文檔+簽名)原因:

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

它返回null,它給出了具體原因。

因爲我不喜歡的try/catch因爲代碼的 審美價值的檢查空

這可能是一個「短來了」的API,但你公然漠視它,因此你的程序崩潰了。

+1

「如果此抽象路徑名不表示目錄,則此方法返回空值。」它表示一個目錄,只是一個無法訪問的目錄。你從我的問題中引用的句子被誤解了。我使用它們,但我不喜歡它們美觀。 – stealthjong

+0

@ChristiaandeJong它沒有錯誤引用,它被用來加強你對API的漠視:)。 – Woot4Moo

+1

但是第一部分?它表示一個目錄,只是一個無法訪問的目錄。所以從技術上講,我沒有,就像你所說的那樣,「公然無視」任何東西。 – stealthjong

相關問題