簡體   English   中英

嘗試使用空的finally塊進行阻止

[英]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語句是沒有用的,但是與有一個空的iffor語句是一樣的。
這些是無奈的,但是編譯器不會抱怨它,因為它在編譯方面仍然是有效的代碼。
但是,IDE可能會發出警告以指出難聞的氣味。

要添加一些上下文,最后只是關鍵字/標簽來標識鏈接到try語句。 就像在try調用的goto一樣。

每個block語句可以為空。

if(true){}
--
while(true){}
--
public void method(){}

即使這是有效的

public void method(){
    {}
}

因此,我們可以說編譯器不在乎那些內容,僅在乎其中的語法。

由於您將引發異常的代碼括在try-catchtry-finally語句中,因此編譯器知道您已處理了潛在的錯誤。 您對它的處理取決於您自己,有權忽略它。

您可能會爭辯:“ 那與根本沒有嘗試有什么不同? ”。 區別在於,如果不將其放在try子句中,則編譯器將無法知道您是故意這樣做還是忘記了它。

基本上,捕獲異常是強制性的,但不是必須的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM