Java中的不可访问返回语句

Java中的不可访问返回语句,java,return,try-catch,Java,Return,Try Catch,5分钟前,我正在快速编写这个小函数,这时我收到了编译器错误unreachable语句 private static boolean isTransientField(String name, Class beanClass) { try { Field field = beanClass.getDeclaredField(name); return (field.getModifiers() & Modifier.TRANS

5分钟前,我正在快速编写这个小函数,这时我收到了编译器错误
unreachable语句

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
块只在例外情况下运行?

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

因为在try块中也有一个return语句,所以不管发生什么,在try-catch构造中会得到一个返回值。

因为在try块中也有一个返回值,所以无论发生什么,在try-catch构造中实现了返回。

因为在try块的末尾也有返回。

因为在try块的末尾也有返回。

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

Field field = beanClass.getDeclaredField(name);
…按预期工作,下一行返回:

return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT
二,。发生异常并执行catch块中的返回


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

代码中只有两条可能的执行路径。
一,。线路

Field field = beanClass.getDeclaredField(name);
…按预期工作,下一行返回:

return (field.getModifiers() & Modifier.TRANSIENT) == Modifier.TRANSIENT
二,。发生异常并执行catch块中的返回


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

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

上述所有情况均为真,原因是,您的代码要么通过快乐路径成功处理并返回,要么抛出异常并进行相应处理,因此本质上,您提供了一个if/else执行路径。编译器永远不会到达第三个返回语句。如果你删除了假报税表;从挡块上,警告将消失。如果要以某种方式处理选中的异常(重新抛出堆栈),则会收到相同的警告,因为代码将按预期返回或抛出并异常(另一个if/else执行路径)。

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

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

现在,你为什么会有另外两种说法?没错,你不会的。

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

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

现在,你为什么会有另外两种说法?没错,你不会的。

只是重申一下,不要对逻辑流使用try/catch块。catch块应用于优雅地处理异常/错误。其次,任何未声明为void的函数都必须返回声明类型的某种形式,在您的例子中是布尔值

可能的解决办法


只是重申一下,不要对逻辑流使用try/catch块。catch块应用于优雅地处理异常/错误。其次,任何未声明为void的函数都必须返回声明类型的某种形式,在您的例子中是布尔值

可能的解决办法


要编译,您仍然需要在
catch
中或在
try
/
catch
之后使用一个return语句。编译器会对这个函数嗤之以鼻。你们都是对的,应该忽略代码示例。我的观点是,无论是否发生异常,函数都必须返回一个布尔值,让编译器“不咳嗽”。要进行编译,您仍然需要在
catch
内或
try
/
catch
之后使用一个return语句。编译器会对这个函数咳嗽。您都是对的,应该省略代码示例。我的观点是,无论是否发生异常,函数都必须返回一个布尔值,让编译器“not cough”。实际上还有第三个可能的执行路径。抛出不是异常子类(例如错误)的Throwable子类。它保持未捕获状态并冒泡到调用函数,再次丢失第三条return语句。实际上还有第三条可能的执行路径。抛出不是异常子类(例如错误)的Throwable子类。它保持未捕获状态并冒泡到调用函数,再次丢失第三条return语句。