我想新建一個url對象,並對url進行一些操作。如何處理不可能拋出的已檢查異常
例如,
void downloadPage()
{
URL url=new URL("http://www.google.com");
do(url);
}
代碼不編譯,因爲URL構造函數聲明MalformatedException
,我必須要麼聲明異常或嘗試,抓住它。但我認爲沒有任何兩種方法合理,因爲url字符串不會改變,這個例外是不可能被拋出的。
我應該如何處理這種情況?
我想新建一個url對象,並對url進行一些操作。如何處理不可能拋出的已檢查異常
例如,
void downloadPage()
{
URL url=new URL("http://www.google.com");
do(url);
}
代碼不編譯,因爲URL構造函數聲明MalformatedException
,我必須要麼聲明異常或嘗試,抓住它。但我認爲沒有任何兩種方法合理,因爲url字符串不會改變,這個例外是不可能被拋出的。
我應該如何處理這種情況?
你可以這樣做:
try {
throwsCheckedException();
} catch(CheckedException e) {
throw new RuntimeException(e);
}
這樣,如果你是錯的,但你沒有,如果你真的相信這不會發生在處理它的異常仍拋出。這可能不適用於生產代碼。如果程序對於不是你的人很重要,更好的解決方案可能是以適當的方式記錄它。
你真的不能確定一個例外永遠不會拋出,我親自將它發生了幾次,我確信它不會這樣做。
另一種方式是處理它在一個娘娘腔方式:
// in some utility class
public static void exitWithError(Throwable e, String msg) {
dumpStackTraceToFile(e); // something you should have
JOptionPane.showMessageDialog(null, msg);
System.exit(1); // force JVM exit when the dialog closes
}
// wherever this should be, only do it once
static final URL GOOGLE;
static {
try {
GOOGLE = new URL("http://google.com");
} catch(MalformedURLException e) {
exitWithError(e, "Somebody changed the Google URL!");
}
}
你可以按照我的理解在try/catch中包圍它。
void downloadPage()
{
try {
URL url=new URL("http://www.google.com");
do(url);
} catch(MalformedException me) {
System.out.println("caught this: " + me);
}
}
這種做法非常危險,因爲「永遠不會發生」的情況。您發現錯誤並基本忽略它,並且操作未完成。該應用程序將失敗,沒有人會知道爲什麼。 –
嗯,我至少打印出一些東西給控制檯,它絕對不會被忽略。我想知道這個錯誤處理是否會阻止JVM關閉,因爲大多數錯誤都會導致程序完全崩潰,就好像流星落在計算機上一樣。感謝您的評論。我沒有想到這可能是危險的。我記得從我的研究中發現,錯誤確實不應該被捕獲,因爲它們對於程序來說是很糟糕的情況。 –
在控制檯上打印出來幾乎肯定會被忽略。 –
嘗試捕捉它是最好的方式去了解它。這也可以保護你的情況下,你不小心編輯的網址http//www.google.com
。
你必須聲明它或嘗試捕捉它。沒有其他辦法。
在運行之前,編譯器無法「檢查」您的地址是否有不正確的格式。
抓住它,並有捕撈扔InternalError該。 –
@HotLicks我知道這是JDK克隆的方式,但我認爲InternalError指出了JVM問題。 – Radiodef
@Radiodef - 它會,爲上述代碼。人們可以選擇一個不同的錯誤,但我認爲它應該是一個錯誤。 –