2010-09-09 171 views
1

在Java中,如果我沒有捕獲拋出的異常,那麼線程執行將在其他地方停止,如果我捕獲相同的線程,則在catch塊之後繼續執行線程。爲什麼以這種方式設計Java異常處理。Java異常處理機制

THX

+0

這是一個非常廣泛的問題來回答.Exceptions基本上是爲處理異常情況而設計的,並提供了一個控制權,如果他想要通過捕捉它來做些什麼,否則這個線程會拋出它,因爲這種異常情況會導致錯誤的結果或應用程序的錯誤狀態,從而導致進一步的問題。 – 2010-09-09 05:49:19

回答

5

異常的目的是爲了讓程序知道,奇怪的事情發生了,所以做什麼,通常會在節目中下一個很可能是錯誤的。你所稱的功能無法給你一個真正的答案,而你依賴於這個答案,所以它必須阻止你。

有兩種方法可以結束:處理異常(通過catch塊),或者整個程序停止。

如果您的程序在這些事情發生時不知道該怎麼做,最好什麼也不做。讓異常崩潰的線程,然後你可以稍後檢查崩潰日誌,並找出崩潰的程序和原因。如果你的程序不能處理錯誤,Exception的「崩潰線程」行爲可以讓你看到什麼錯誤是未處理的,所以你可以改變程序使它能夠在將來處理這種情況,或者防止出現這種情況從發生。

雖然有些錯誤可能是非常正常的,但不應該阻止整個程序 - 您需要有一種方法從它們中恢復。這就是一個catch塊:有機會說「Hello Java,我知道該怎麼解決這個問題」,然後去做。如果可以,Catch塊允許您清理程序並繼續前進。 Java假設你的Catch塊處理這個問題並使其消失。如果出現了新問題,或者同一個問題,您需要再次捕獲異常,或者可能是新的問題,所以其他問題可以嘗試解決問題 - 即使其他人是您,作爲程序員。

如果異常總是使程序崩潰,那麼將無法處理預期的錯誤並且可以處理。但是,如果完全沒有準備好處理錯誤,程序就無法繼續運行,因爲現在有些事情變得很奇怪,並且它不知道該怎麼做,因爲你沒有編程來做任何事情。

1

在Java中,如果我沒有捕獲拋出的異常,那麼線程執行停止在那裏,如果我捕獲相同的線程執行繼續catch塊。

還有第三種情況。如果線程有Thread.UncaughtExceptionHandler(通過調用thread.setUncaughtExceptionHandler(handler)註冊),則在線程退出之前,將在線程堆棧上發生未捕獲的異常時通知它。 (實際上,這個行爲比這更復雜;請參閱javadocs。)

爲什麼使用這種方式設計Java異常處理。

因爲替代方案差很多......在大多數情況下。

假設線程已導致run()方法終止(因爲您沒有發現異常),那麼您唯一可以做的事情就是「不停止」,這將使線程基礎結構再次調用run()

但未捕獲的異常通常意味着發生了一些不良事件。典型的run()方法沒有設計,所以他們多次會做一些明智的事情。如果run()方法剛剛失敗了一些未知的原因(就run()方法而言),更不可能再次調用它。

此外,在少數情況下,如果您的run()方法能夠從每個異常中捕獲並恢復,您可以隨時對其進行編碼。如果你不想讓線程恢復,你可以實現一個「未捕獲的異常處理程序」來通知別的事情,並且(可能)開始更高級別的恢復。

唯一可能是可能是有問題的關於當前的設計是由於未捕獲的異常導致線程終止往往是沉默的。但是,治療的目的是實現一個默認的未捕獲的異常處理程序,它會產生一些噪音......