簡體   English   中英

Java未報告的異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM