“finally block does not complete normally”的警告解決

weixin_34402090發表於2014-11-13

但是,java裡面不是可以保證finally一定會執行的麼,為什麼不可以在finally塊做return???

 

細細看道來:

debug一下這個函式,就會驚訝的發現, 裡面丟擲的異常會被finally吃掉。 這也就是為什麼會被警告的原因。

Java程式碼 
    @SuppressWarnings("finally")  
    private boolean isReturnWithinFinally() {  
    try {  
    if (true) throw new RuntimeException();  
    } finally {  
    return true; // This hides the exception  
    }  
    }  

 

那麼,下面這樣會不會ok呢?先把異常處理

Java程式碼 
    public static void main(String[] args) {  
        try{  
            throw new RuntimeException();  
        }catch(Exception e) {  
            //  
        }  
        finally {  
            return;  
        }  
    }  

 

結論是:依舊不行。java裡面的異常分為可不獲和不可捕獲兩類,即便使用到catch塊,也會導致非捕獲的錯誤被finally吃掉。

 

因此,return一定要放到finally外面。

 

相關文章