我最近在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
块仅在特殊情况下运行?
答案 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();
}
}