按照Java Language Specification:「突然完成最後一個子句」究竟是什麼?
如果有任何封閉try語句,其try塊包含throw語句,那麼任何最後的那些條款幾經努力控制向外轉移,直到拋出值被捕獲語句被執行。請注意,突然終止子句可能會中斷由throw語句啓動的控制權轉移。
除了在finally塊內部返回外,還有其他哪些方法?
按照Java Language Specification:「突然完成最後一個子句」究竟是什麼?
如果有任何封閉try語句,其try塊包含throw語句,那麼任何最後的那些條款幾經努力控制向外轉移,直到拋出值被捕獲語句被執行。請注意,突然終止子句可能會中斷由throw語句啓動的控制權轉移。
除了在finally塊內部返回外,還有其他哪些方法?
從finally塊中拋出異常還會摧毀原始異常(如果有的話)。
編輯:找到了解釋「突然完成」的參考。
從§14.1: Normal and Abrupt Completion of Statements:
的突然完成總是有一個 相關原因,這是繼 之一:
- 沒有標籤
- 與給定的標籤
斷開部的斷裂- A繼續使用無標籤
- 繼續使用給定的標籤
- 沒有價值的返回
- 與給定值
- 與給定值一拋,包括 Java虛擬機拋出的異常的返回
最後三個是唯一可能在finally
子句中,除非它在循環中。
Sys.exit()
或強制中止。特別是GUI程序對於異常調用Sys.exit()
是臭名昭着的,部分原因是直到JVM 1.5存在的缺陷 - 從GUI線程拋出的異常沒有將其移交給主線程。
更新:尤其是對誰低估了這一點。對不起,但Sys.exit()確實意味着突然終止,包括導致堆棧不能解開;我將在明天提交一份針對文檔的錯誤。我可以在某些權威人士的講話中談到這一點,他在Sun擔任高級Java架構師多年。
我想它也可能是一個開關內部的break語句,如果finally塊是switch case的一部分的話。 另外,如果finally塊調用一些其他語言實現的方法,它可能會執行該語言的編譯器所需的任何操作。