1

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

4

7 回答 7

17

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

于 2009-10-10T04:34:48.987 回答
3

您的代码中只有两种可能的执行路径。
1. 线路

Field field = beanClass.getDeclaredField(name);

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

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

2、发生异常,执行catch块中的return。

鉴于这两条路径,永远无法到达第三条 return 语句。

于 2009-10-10T04:37:20.683 回答
2

因为你在 try 块的末尾也有一个 return。

于 2009-10-10T04:35:32.507 回答
2

你所拥有的基本上相当于以下内容:

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

现在,你为什么会有两个 else 语句?没错,你不会。

于 2009-10-10T04:48:21.050 回答
1

因为你的try块中也有一个 return,所以无论如何,在 try catch 构造中都会有一个 return。

于 2009-10-10T04:34:56.460 回答
0

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

于 2009-10-10T04:39:28.567 回答
-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();
    }
}
于 2009-10-10T19:40:05.140 回答