簡體   English   中英

Java中無法到達的return語句

[英]Unreachable return statement in Java

我最近在5分鍾前迅速得到了編譯器錯誤unreachable statement很快就編寫了這個小函數

private static boolean isTransientField(String name, Class beanClass) {
        try {
            Field field = beanClass.getDeclaredField(name);
            return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT;
        } catch (Exception e) {return false;}

        return false;//unreachable statement
    }

顯然我的最后一個return false是無法到達的,但是為什么我的catch塊僅在特殊情況下運行?

因為您在嘗試中有一個return語句。

您的代碼中只有兩個可能的執行路徑。
1.線

Field field = beanClass.getDeclaredField(name);

...按預期工作,下一行返回:

return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT

2.發生異常,執行catch塊中的返回。

給定這兩個路徑,就永遠無法達到第三個return語句。

因為在try塊的末尾也有返回。

因為您的try塊中也有返回值,所以無論如何,在try catch構造中都會達到返回值。

您所擁有的基本上等同於以下內容:

if (something)
    return true;
else
    return false;
else
    return false;

現在,為什么還要另外兩個語句? 沒錯,您不會。

盡管上述所有內容都是正確的,但原因是您的代碼將通過快樂路徑成功處理並返回,或者將引發異常並進行相應處理,因此,實質上,您提供了if / else執行路徑。 編譯器將永遠不會到達第三個return語句。 如果您刪除了return false; 從捕獲塊,警告將消失。 如果您將以某種方式處理您檢查的異常(重新拋出堆棧),則會收到相同的警告,因為代碼將按預期返回或拋出異常(另一個if / else執行路徑)。

只是重申一下,不要將try / catch塊用於邏輯流。 catch塊應用於優雅地處理異常/錯誤。 其次,任何未聲明為void的函數都必須返回某種形式的聲明類型,在您的情況下為布爾值。

可能的解決方案

private static boolean isTransientField(String name, Class beanClass) 
{
    try 
    {
        Field field = beanClass.getDeclaredField(name);
        if((field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT)
        {
            return true;
        }
        else
        {
            return false;
        }

    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

暫無
暫無

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

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