今天我寫了一個小型Java程序來查找我的硬盤上的文件,部分原因是Windows缺少正確的文件,部分原因是它是爲了好玩。它只是遍歷一個目錄的所有孩子,並遞歸通過他們所有的孩子,如果他們是目錄。但後來我有一個NullPointerException
。經過一些System.out.println()'s
和try-catch block
我發現這發生在D:\System Volume Information
,C:\Users\Public\Documents\My Videos
和C:\ProgramData\Templates
等一些目錄上。 Windows本身說,當在資源管理器地址欄中輸入「訪問被拒絕」時。當探索,他們似乎被鎖定。從java.io.File
的source告訴我:爲什麼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;
}
我的問題是,爲什麼沒有適當的發言權,IOException
,SecurityException
,甚至是IDontCareWhatKindOfExceptionButPleaseNoNullPointerExceptionException
?
我知道我可以只try-catch
爲NPEs
,或檢查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搜索圖形用戶界面。這幾乎是痛苦的使用。
你有沒有聽說過'find'命令? – Woot4Moo
@ Woot4Moo命令行沒有適當的GUI。我更喜歡GUI。 – stealthjong
編寫一個GUI並以這種方式調用它?只是說微軟解決了在系統上查找文件的問題,只是想知道在GUI外面有什麼缺點。 – Woot4Moo