2011-04-28 75 views
13

我需要一些幫助來理解IOException。我在網上查閱了很多信息,並查看了Oracle Java網站上的技術規範。瞭解Java IOException

我是否正確理解IOException類及其所有子類,並且沒有關聯的「錯誤消息」或「返回代碼」值?

因此,如果想要發出一些消息和/或返回代碼值,那麼必須使用IOException catch邏輯插入它們?

如果以上情況屬實,那麼將如何區分各種IOException子類?

例如如果應用程序檢測到IOException,它是什麼類型的IOException?文件結尾,文件被關閉,文件未被找到,文件正在使用等。

回答

17

異常(通常)中沒有「返回代碼」值,但它們包含錯誤消息。您應該在catch塊中處理它們,您可以在其中指定要處理的異常類型。在try塊之後可以有幾個catch塊,以不同方式處理不同類型的異常。 catch塊將按照指定的順序被調用,而第一個具有合適參數類型的塊將處理異常。所以你應該先捕捉更具體的異常類型,然後再捕捉更具體的異常類型。

簡單的例子:

try { 
    ... 
    throw new FileNotFoundException("This is an error message"); 
    ... 
} catch (FileNotFoundException e) { 
    System.out.println("File not found: " + e.getMessage()); 
    ... 
} catch (EOFException e) { 
    System.out.println("End of file reached: " + e.getMessage()); 
    ... 
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks 
    System.out.println("General I/O exception: " + e.getMessage()); 
    e.printStackTrace(); 
    ... 
} 

正如你在過去的catch塊看,異常存儲它們的起源,可以打印的堆棧跟蹤。但是,像這裏一樣直接打印這樣的消息通常不是一個好主意;在實際的生產代碼中,您通常希望使用日誌記錄框架來記錄這些消息,或者在UI上顯示它們(合適的部分)。

1

您可以通過使用instanceof來確定異常或任何對象是什麼類。但是,對於例外情況,您可以使用catch塊。

} catch(FileNotFoundException e) { 
    // file not found handling 

} catch(EOFException e) { 
    // handle reaching the End-Of_File. 

} catch(IOException e) { 
    // generic IOException handling for any other IOException. 

} 
1

爲了不同的方式處理IOException異常的子類,你必須單獨追上他們,就像這樣:

try { 
    // some code that may throw an exception 
} 
catch (EOFException e) { 
    // handle an end-of-file exception here) 
} 
... 
catch (IOException e) { 
    // handle an IOException that's not covered in previous catch statements 
} 
catch (Exception e) { 
    // handle any other kind of exception 
} 
3

有沒有錯誤代碼,但很多時候也有消息。例如,它們可以包含文件名或其他詳細信息,以幫助您識別出錯的地方。

請參閱IOException的子類以瞭解有關可以獲得哪些例外的更多建議。

要處理它們,您可以使用不同的catch短語。 請記住,從更多到更具體的例外(如果您在第一個塊捕獲IOException,更具體的塊如FileNotFoundException將永遠不會工作)。有時你可能想用一個單獨的catch (IOException)來捕捉它們 - 如果你不需要以不同的方式處理子類。

try { 
    // ... 
} catch (FileNotFoundException e) { 
    // ... 
} catch (IOException e) { 
    // ... 
} 
2

你應該考慮你想要以特定方式處理的異常(而不是捕獲所有的塊)。在你找到你的候選人後,你必須根據它們的繼承樹來捕捉它們,更具體的首先是更一般的(從子類到超類)。請注意,如果您的黑名單包含太多必須被捕獲的例外,並且它們只屬於一次嘗試,那麼您應該考慮將該嘗試塊分成更小的塊。