繁体   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