【问题标题】:Unreachable return statement in JavaJava中无法访问的返回语句
【发布时间】:2010-12-05 13:06:23
【问题描述】:

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

【问题讨论】:

    标签: java return try-catch


    【解决方案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();
        }
    }
    

    【讨论】:

    • 要编译,您仍然需要在 catch 内或 try/catch 之后的 return 语句
    • 编译器会在这个函数上咳嗽
    • 你说得对,应该省略代码示例。我的观点是,无论是否发生异常,函数都必须返回一个布尔值,以便编译器“不咳嗽”。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      Field field = beanClass.getDeclaredField(name);
      

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

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

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

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

      【讨论】:

      • 实际上还有第三种可能的执行路径。抛出一个不是 Exception 子类的 Throwable 子类(例如错误)。它仍然没有被捕获并冒泡到调用函数,再次错过了第三个 return 语句。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        因为你在 try 块的末尾也得到了 return。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-03-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-23
              • 1970-01-01
              • 2016-09-27
              相关资源
              最近更新 更多