[英]Java unreported exception
在學習 Java 時,我經常偶然發現這個錯誤。 它是這樣的:
未報告的異常 java.io.FileNotFound 異常; 必須被捕獲或聲明被拋出。
java.io.FileNotFound 只是一個例子,我見過很多不同的例子。 在這種特殊情況下,導致錯誤的代碼是:
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("myfile.pdf")));
一旦我將語句放入 try/catch 塊中,錯誤總是消失並且代碼編譯並成功運行。 有時這對我來說已經足夠了,但有時卻不夠。
首先,我正在學習的示例並不總是使用 try/catch 並且顯然應該可以工作。
更重要的是,有時當我將整個代碼放入 try/catch 時,它根本無法工作。 例如,在這種特殊情況下,我需要out.close(); 在finally{}塊中; 但是如果上面的語句本身在try{ }內部, finally{}不會“看到”出來,因此無法關閉它。
我的第一個想法是導入 java.io.FileNotFound; 或其他相關的例外,但它沒有幫助。
您所指的是檢查異常,這意味着它們必須被聲明或處理。 Java 中處理文件的標准結構如下所示:
InputStream in = null;
try {
in = new InputStream(...);
// do stuff
} catch (IOException e) {
// do whatever
} finally {
if (in != null) {
try {
in.close();
} catch (Exception e) {
}
}
}
丑嗎? 當然。 它很冗長嗎? 當然。 Java 7 會用 ARM 塊讓它更好一點,但在那之前你會被上面的內容困住。
您還可以讓調用者處理異常:
public void doStuff() throws IOException {
InputStream in = new InputStream(...);
// do stuff
in.close();
}
盡管即使那樣close()
應該包含在finally
塊中。
但是上面的函數聲明說這個方法可以拋出一個IOException
。 由於這是一個已檢查的異常,因此該函數的調用者需要catch
它(或聲明它以便其調用者可以處理它等等)。
Java 的檢查異常使程序員可以解決這樣的問題。 (在我看來,這是一件好事,即使掃地毯下的蟲子更容易。)
如果發生故障,您應該采取一些適當的措施。 通常,處理應該在與拋出異常不同的層。
應該正確處理資源,它采用以下形式:
acquire();
try {
use();
} finally {
release();
}
永遠不要將acquire()
放在try 塊中。 永遠不要在acquire()
和try
之間放置任何東西(除了簡單的賦值)。 不要嘗試在單個finally
塊中釋放多個資源。
所以,我們有兩個不同的問題。 不幸的是,Java 語法將兩者混為一談。 編寫此類代碼的正確方法是:
try {
final FileOutputStream rawOut = new FileOutputStream(file);
try {
OutputStream out = new BufferedOutputStream(rawOut);
...
out.flush();
} finally {
rawOut.close();
}
} catch (FileNotFoundException exc) {
...do something not being able to create file...
} catch (IOException exc) {
...handle create file but borked - oops...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.