2014-02-28 30 views
1

我想新建一個url對象,並對url進行一些操作。如何處理不可能拋出的已檢查異常

例如,

void downloadPage() 
{ 
    URL url=new URL("http://www.google.com"); 
    do(url); 
} 

代碼不編譯,因爲URL構造函數聲明MalformatedException,我必須要麼聲明異常或嘗試,抓住它。但我認爲沒有任何兩種方法合理,因爲url字符串不會改變,這個例外是不可能被拋出的。

我應該如何處理這種情況?

+0

抓住它,並有捕撈扔InternalError該。 –

+0

@HotLicks我知道這是JDK克隆的方式,但我認爲InternalError指出了JVM問題。 – Radiodef

+0

@Radiodef - 它會,爲上述代碼。人們可以選擇一個不同的錯誤,但我認爲它應該是一個錯誤。 –

回答

2

你可以這樣做:

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!"); 
    } 
} 
+0

這真是一個聰明的解決方案!它保留了例外,並讓我在上層忽略它。 – Gqqnbig

+0

你只需要確定,如果它拋出,沒有危險的事情會發生。看到我的編輯替代。 – Radiodef

0

你可以按照我的理解在try/catch中包圍它。

void downloadPage() 
{ 

try { 

    URL url=new URL("http://www.google.com"); 
    do(url); 

} catch(MalformedException me) { 
    System.out.println("caught this: " + me); 
} 


} 
+0

這種做法非常危險,因爲「永遠不會發生」的情況。您發現錯誤並基本忽略它,並且操作未完成。該應用程序將失敗,沒有人會知道爲什麼。 –

+0

嗯,我至少打印出一些東西給控制檯,它絕對不會被忽略。我想知道這個錯誤處理是否會阻止JVM關閉,因爲大多數錯誤都會導致程序完全崩潰,就好像流星落在計算機上一樣。感謝您的評論。我沒有想到這可能是危險的。我記得從我的研究中發現,錯誤確實不應該被捕獲,因爲它們對於程序來說是很糟糕的情況。 –

+0

在控制檯上打印出來幾乎肯定會被忽略。 –

0

嘗試捕捉它是最好的方式去了解它。這也可以保護你的情況下,你不小心編輯的網址http//www.google.com

0

你必須聲明它或嘗試捕捉它。沒有其他辦法。

在運行之前,編譯器無法「檢查」您的地址是否有不正確的格式。