Java中无法访问的返回语句

时间:2009-10-10 04:33:11

标签: java return try-catch

我最近在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块仅在特殊情况下运行?

7 个答案:

答案 0 :(得分:17)

因为你在try中有一个return语句。

答案 1 :(得分:3)

代码中只有两个可能的执行路径。
1。这条线

Field field = beanClass.getDeclaredField(name);

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

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

2。发生异常并执行catch块中的返回。

鉴于这两条路径,无法达到第三个返回语句。

答案 2 :(得分:2)

因为你在try块结束时也得到了回报。

答案 3 :(得分:1)

因为您的尝试块中也有返回,所以无论如何,都会在try catch构造中返回。

答案 4 :(得分:1)

您拥有的内容基本上等同于以下内容:

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

现在,为什么你会有另外两个陈述?没错,你不会。

答案 5 :(得分:0)

虽然以上所有都是正确的,但原因是您的代码将通过快乐路径成功处理和返回,或者它将抛出异常并进行相应处理,所以从本质上讲,您提供了if / else执行的路径。编译器永远不会到达第三个return语句。如果删除了返回false;从捕获区块开始,警告就会消失。如果您以某种方式处理已检查的异常(重新抛出堆栈),您将得到相同的警告,因为代码将按预期返回或抛出异常(另一个if / else执行路径)。

答案 6 :(得分:-1)

重申一下,不要将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();
    }
}