簡體   English   中英

Java嘗試捕獲塊

[英]Java try catch blocks

這是一個簡單的問題:

您如何看待每次使用try catch的代碼?

void myfunction() {
    try {
        instruction1();
    }
    catch (ExceptionType1 e) {
        // some code
    }
    try {
        instruction2();
    }
    catch (ExceptionType2 e) {
        // some code
    }
    try {
        instruction3();
    }
    catch (ExceptionType3 e) {
        // some code
    }
    try {
        instruction4();
    }
    catch (ExceptionType4 e) {
        // some code
    }

    // etc
}

我知道這太可怕了,但我想知道這是否會降低性能。

嘗試這樣的事情:(我知道這不會回答你的問題,但它更清潔)

void myfunction() {
try {
    instruction1();
    instruction2();
    instruction3();
    instruction4();
}
catch (ExceptionType1 e) {
    // some code
}
catch (ExceptionType2 e) {
    // some code
}
catch (ExceptionType3 e) {
    // some code
}
catch (ExceptionType4 e) {
    // some code
}

// etc
}

它不會降低性能(當然不會明顯),但確實看起來很糟糕。

記住黃金法則:可讀代碼通常是更快的代碼。 首先生成可讀代碼,只有在證明速度太慢時才更改它。

將您的try-catch塊分組為原始代碼的邏輯塊(例如,一個用於打開流並從中讀取數據,一個用於之后完成的所有處理),維護開發人員將感謝您。

您還應該考慮,如果捕獲異常的第一個catch塊未突然結束(即,在正常流程中繼續執行),則后續指令可能會拋出其他異常,這些指令依賴於先前成功完成的指令,這兩個指令都是虛假,他們可以減慢你的代碼。

不,這可能不會降低性能(但是,一如既往,您必須對其進行測試)。 編譯成字節碼時,Java異常處理程序將更改為字節碼偏移范圍和關聯處理程序地址的表。 catch處理程序通常在代碼的主線之外編譯,因此不會影響“正常”的非異常執行。

有關更多信息,請參閱Java虛擬機規范, 第7.12節“拋出和處理異常” 本節還提供了如何將各種代碼構造編譯為字節碼的示例。

如果拋出異常,使用過量的try-catch可能會在性能方面開始變得昂貴。 如果沒有這么多的已檢查異常或者讓所有ExceptionTypes都擴展了一個常見的Exception基類,你會更好。 通過這種方式,您可以使用單個try catch,它更易於閱讀並具有更好的性能。

這個答案可以看出,除非引發錯誤,否則性能最低。

暫無
暫無

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

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