2013-02-26 21 views
2

之間有什麼區別:的Java的try-catch或外部

while(true) { 
    try { 
     // something 
    } catch(Exception e) { 
     break; 
    } 
} 

try { 
    while(true) { 
    // something 
    // break; // eventually 
    } 
} catch(Exception e) { 

} 

是否前者運行一個try-catch在每個迭代上或做編譯器生成相同的代碼。 哪個是首選?

編輯:打破;因爲沒有必要,所以在第二個例子中從catch塊中移除。

+0

不僅是有沒有必要在第二個例子中'break',如在我的答案是,嚴禁在那裏。 – jlordo 2013-02-27 07:06:21

回答

6

不同的是,該一個冷杉將編譯和按預期方式工作(中斷循環的發生異常時),第二個將不編譯。

編譯器錯誤將是break cannot be used outside of a loop or a switch這是非常自我解釋(你試圖使用break以外的循環(語法上),這是不允許的)。

我會修改你的例子來說明這一點:如果出現異常,我插入註釋,應該怎樣爆發的

try { 
    while(true) { 
    // something 
    // break; // eventually 
    } 
    /* --> more code, that could throw an exception <-- */ 
} catch(Exception e) { 
    break; 
} 

顯式地回答你的問題:

是否前者運行在每次迭代或一個try-catch請問 編譯器生成相同的代碼?

是的,前者在每次迭代中運行try/catch塊。

這是首選?

顯然是第一個。

的首選方法是第二種方式中,只是在沒有catch塊的break關鍵字。正如Ren在他的評論中指出的那樣,當發生異常時,你將執行catch塊(記錄錯誤或類似的東西),然後執行catch塊下面的代碼。不需要break關鍵字。

+0

那麼每次迭代都會首選try-catch?對我來說,假設它會涉及額外的開銷而不是運行一次,這似乎是違反直覺的。 – BAR 2013-02-26 23:31:44

+0

@ user417896:我同意你的思路。但另一種方式是不可能的,所以是的,首選的方式是沒有編譯器錯誤的方式。 – jlordo 2013-02-26 23:33:37

+2

使用第二種方法,當出現異常時,您將進入循環外部的catch塊。所以你不需要在那裏休息。 – Ren 2013-02-26 23:37:29