代码之家  ›  专栏  ›  技术社区  ›  non sequitor

Java中的不可达返回语句

  •  1
  • non sequitor  · 技术社区  · 15 年前

    我最近在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 回复  |  直到 7 年前
        1
  •  17
  •   Cellfish    15 年前

    因为在try中有一个返回语句。

        2
  •  3
  •   akf    15 年前

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

    Field field = beanClass.getDeclaredField(name);
    

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

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

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

    给定这两条路径,就永远无法到达第三个RETURN语句。

        3
  •  2
  •   aem    15 年前

    因为在try块的末尾还有一个返回。

        4
  •  1
  •   David    15 年前

    因为你也有回报 尝试 块,因此无论什么,在try-catch构造中都会到达一个返回。

        5
  •  1
  •   Joe Phillips    15 年前

    您所拥有的基本上等同于以下各项:

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

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

        6
  •  0
  •   Droo    15 年前

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

        7
  •  -1
  •   BrentAllenParrish    15 年前

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