簡體   English   中英

有沒有一種方法可以將IOException拋出為可運行狀態?

[英]Is there a way to throw IOException in a runnable?

我有一些無法正常工作的代碼(這對我來說是很常見的事情),但是因為我沒有收到錯誤,所以它只會繼續以錯誤的數據運行。 我認為的問題是,它不斷告訴我將部分代碼包裝在try / catch塊中(我的測試是基本的,我只是在try區域中輸出一條消息,如果輸出了,我認為一切都很好。好在我的代碼中)。 據我了解,在生產環境中,放置try / catch語句有助於代碼繼續運行,但是這使我難以進行故障排除,因為我正嘗試對代碼的這一部分進行故障排除。

有沒有辦法解決這個問題,這樣我就可以真正看到嘗試區域中何時出現故障?

這是我的代碼示例:

    try {
        ByteArrayInputStream baos_back = new ByteArrayInputStream(message);
        ObjectInputStream oos_back = new ObjectInputStream(baos_back);
        i = oos_back.readInt();
        d = oos_back.readDouble();
        list_of_ints = (int[]) oos_back.readObject();
        oos_back.reset();
        baos_back.reset();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

您是否正在嘗試使程序在發生此錯誤時崩潰? 如果是這樣,您應該能夠將IOException包裝在RuntimeException然后拋出該IOException 它們未經檢查,因此您無需聲明它們,它應該可以殺死您的程序。

如果您想讓代碼引發適當的異常,建議不要使用try-catch塊。 Try-catch用於處理異常發生時的異常,然后繼續運行程序,但是聽起來您根本不想處理它們。

如果確實要使用try-catch塊,則始終可以在catch塊的末尾手動拋出RuntimeException。 就像是:

throw new IOException();
try {
    // Some code...
} catch(Exception e) {
    // Error handling code...
    throw new RuntimeException(e.getMessage());
}

正如我在評論中提到的那樣,您可以使用一攬子catch語句捕獲Java中的所有異常:

try {
    // code
} catch (Exception e) {
    e.printStackTrace();
}

這將捕獲在try塊中引發的每個Exception ,並且唯一不能捕獲的是Error

在實踐中,您將希望限制捕獲的異常類型,並捕獲更具體的異常,因此可以按以下方式進行異常鏈:

try {
    // code
} catch (IOException ioe) {
    // we expected this
    ioe.printStackTrace();
} catch (SomeOtherException soe) { // just an example...
    soe.printStackTrace();
} catch (Exception e) {
    // Did we expect this? Maybe not!
    e.printStackTrace();
}

上面的內容還表明,您預計會發生某些類型的異常,然后發出大范圍的包羅萬象的語句,可能會捕獲您未曾想到的事情。

您也可以將異常記錄到文件或其他內容中,而不是像現在的代碼那樣將它們輸出到標准輸出中。 基本的日志記錄實用程序是java.util.logging


我仍然建議您學習使用調試器。 調試器可以執行很多操作,例如每當引發異常時就暫停程序執行,並允許您在程序執行的任何時候檢查變量和字段的值。 如果使用Eclipse或Netbeans或IntelliJ或其他IDE,則它們具有調試器。 如果使用命令行,則有jdb命令行Java調試器。

我建議編輯您的代碼生成模板以執行此操作

catch ( $ExceptionClass e )
{
  // TODO: Autogenerated catch block
  e.printStackTrace();
  throw new RuntimeExcepton( e );
}

這樣,您就有了一個TODO提醒,在stdout上有一個barf,並確保如果您沒有提供正確的異常處理程序,您的程序將崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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