[英]try block with empty finally block
當我們有一個try塊而沒有任何代碼時,finally塊將被編譯器很好地編譯。 但是,這里沒有嘗試的目的-因為我們既沒有捕獲到異常,也沒有在finally塊中清理代碼。
public int updateTable(InputVo sfVo){
//SqlSession session = ConnFactory.getSqlSession();
//InputMapper spMapper = session.getMapper(InputMapper .class);
int updRecs=0;
try {
mapper.updateData(sfVo);
updRecs=sfVo.getRecsUpdated();
return updRecs;
} finally {
//session.close();
}
}
如果是這樣,JAVA為什么不考慮對此進行編譯時檢查?
如果編譯器本身在編譯時拋出錯誤,那就更好了,例如“不能有空的finally塊”
使用try-finally
語句而不聲明catch
語句是合法的。
從JLS :
14.20.2。 最終嘗試和最終捕獲的執行
通過首先執行try塊來執行帶有finally塊的try語句。 然后有一個選擇:
如果try塊的執行正常完成,則執行finally塊,然后可以選擇:
如果finally塊正常完成,則try語句正常完成。
如果final塊由於原因S突然完成,則try語句由於原因S突然完成。
你說 :
我們既沒有捕獲異常,也沒有在finally塊中清理代碼。 如果是這樣,JAVA為什么不考慮對此進行編譯時檢查?
您在finally
語句中編寫的內容當然由開發人員掌握。
有一個空的finally
語句是沒有用的,但是與有一個空的if
或for
語句是一樣的。
這些是無奈的,但是編譯器不會抱怨它,因為它在編譯方面仍然是有效的代碼。
但是,IDE可能會發出警告以指出難聞的氣味。
要添加一些上下文,最后只是關鍵字/標簽來標識鏈接到try
語句。 就像在try
調用的goto
一樣。
每個block語句可以為空。
if(true){}
--
while(true){}
--
public void method(){}
即使這是有效的
public void method(){
{}
}
因此,我們可以說編譯器不在乎那些內容,僅在乎其中的語法。
由於您將引發異常的代碼括在try-catch
或try-finally
語句中,因此編譯器知道您已處理了潛在的錯誤。 您對它的處理取決於您自己,有權忽略它。
您可能會爭辯:“ 那與根本沒有嘗試有什么不同? ”。 區別在於,如果不將其放在try
子句中,則編譯器將無法知道您是故意這樣做還是忘記了它。
基本上,捕獲異常是強制性的,但不是必須的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.