2012-12-03 29 views
-1

是什麼的try-catch阻止這些使用和什麼時候應該使用每個人之間的區別?下面的try-catch語句有什麼區別?

try { 
    doSomething1(); 
} catch(Exception e1){ 
    exception_handle1(); 
} 
try { 
    doSomething2(); 
} catch(Exception e2){ 
    exception_handle2(); 
} 

try { 
    doSomething1(); 
    doSomething2(); 
} catch(Exception e1) { 
    exception_handle1(); 
} catch(Exception e2) { 
    exception_handle2(); 
} 

try { 
    doSomething1(); 
    try { 
    doSomething2(); 
    } catch(Exception e2){ 
    exception_handle2(); 
    } 
} catch(Exception e1){ 
    exception_handle1(); 
} 
+0

嘗試,你會看到 – njzk2

+1

非常驚人的是,它們都是語法錯誤。 – melpomene

+0

如果你在尋找一般的例外,第一個和第二個非常相似。除非你使異常更具體(例如IOException,MathException等),否則它們幾乎是相同的。 – hesson

回答

2

好了,第一,其他兩個是doSomthing2將嘗試是否doSomthing1拋出異常之間的明顯差異。在你引用確切的代碼,沒有比第三個例子以外的第二個和第三個例子之間的巨大差異(語法錯誤除外),第二try你的異常處理代碼是的異常處理代碼第一個,所以如果投擲,投擲將被抓住。

,你應該使用完全取決於具體情況。有時,無論doSomthing1是否引發異常,運行doSomthing2都是適當的。有時不是。

+0

你的意思是'doSomething2'會在第一個代碼中執行嗎?其實你的第一個陳述很混亂。您可能想要更新它。 –

+0

@RohitJain:是的,在第一個例子中,無論doSomthing1是否拋出,doSomthing2都會被執行。在第二和第三,它不會。我的第一個陳述有什麼困惑? (我有一個錯誤,我剛纔糾正了,也許是這樣嗎?) –

+0

哦,是的。就是這樣。沒有刷新頁面。我的錯。 –

2

如果doSomThing1失敗,則代碼轉移到執行doSomthing2

在第二示例中,doSomthing2不獲取如果doSomthing1失敗

然而,第三實施例類似於第二個執行。

3
try { 
    doSomthing1() 
catch(Exception e1){ 
    exception_handle1() 
} 
try { 
    doSomthing2() 
catch(Exception e2){ 
    exception_handle2() 
} 

doSomthing1()doSomthing2()無關的方法。任何一方的失敗都是彼此獨立的。

try { 
    doSomthing1() 
    doSomthing2() 
catch(Exception e1){ 
    exception_handle1() 
}catch(Exception e2){ 
    exception_handle2() 
} 

我們可以使用try-catch塊這樣從如果doSomthing1()失敗時停止執行doSomthing2()方法。我們可以用兩個catch塊分別處理每個異常。但是,需要注意的一點是,您的2nd catch blockunreachable code。一般來說,你應該首先捕捉更具體的異常,接下來是廣義異常。現在,就你的情況而言,第二個catch塊應該處理的所有異常都將在第一個中處理。

try { 
    doSomthing1() 
    try { 
    doSomthing2() 
    catch(Exception e2){ 
    exception_handle2() 
    } 
} 
catch(Exception e1){ 
    exception_handle1() 
} 

我們有2個嵌入對方的try-catch塊。即使在doSomthing2()失敗之後,程序仍會在try塊內繼續。

0

它,當你創建一個條件語句同樣的概念,只是條件語句測試條件下嘗試捕捉正在測試一個錯誤

0

首先讓asume,doSomething1()和exceltion_handle1(),不叫System.exit(x)什麼的。 1)所以第一段代碼,將doSomething1(),不管doSomething1()是否會拋出任何Exception,它將處理它(處理catch代碼塊),並提前第二次嘗試並運行它辦法。

try { 
    doSomething1(); 
} catch(Exception e1){ 
    exception_handle1(); 
} 
try { 
    doSomething2(); 
} catch(Exception e2){ 
    exception_handle2(); 
} 

今天早上,所以我希望我不會做出任何錯誤的決定。這個代碼將運行doSomething1()然後doSomething2(),並且不管哪一個會失敗(拋出Exception),只有第一個catch子句會被調用,因爲它吸收了所有的子類和它自己,所以第二個catch將無法達到(首先考慮所有可能的例外情況)。 所以afaik,你應該得到一個錯誤(不應該編譯)。這是聰明的,會承認,第二次捕獲將不會以任何方式達成。

正確的模式是:當我們進入底部時,例外應該更寬和更寬(嚴格)。這是合乎邏輯的,因爲捕捉子句的次序減少,上部捕捉不應該是底部父項,因爲ANYWAY父項將採用該異常,並且底部的子項將不會被觸及。

Example: (I recommend you to learn about Multicatch in java.) 
catch (Specific2ChildOfSpecific1 e3) 
... 
catch (specific1ChildOfException e2) 
... 
catch (Exception e1) 


try { 
    doSomething1(); 
    doSomething2(); 
} catch(Exception e1) { 
    exception_handle1(); 
} catch(Exception e2) { 
    exception_handle2(); 
} 

3)這一個:如果doSomething1()將失敗E1 catch子句就會執行,多數民衆贊成,是否會通過,那麼如果了doSomething2()將運行,如果失敗,那麼E2 catch子句會被執行。

注意@第二個例子,無論哪個doSomething將會失敗,e1都會被執行(不要忘記有一個錯誤,因爲第二個是不可訪問的)。但我明白你想問什麼。

try { 
    doSomething1(); 
    try { 
    doSomething2(); 
    } catch(Exception e2){ 
    exception_handle2(); 
    } 
} catch(Exception e1){ 
    exception_handle1(); 
} 
相關問題