【问题标题】:Unreachable statement when using return in finally?在finally中使用return时无法访问语句?
【发布时间】:2010-03-23 17:38:18
【问题描述】:

这样编译:

class Ex1 {
    public int show() {
        try {
            int a=10/10;
            return 10;
        }   
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
        }
        System.out.println("hello");
        return 20;
    }
}

另一方面,这不是:

class Ex15 {
    public int show() {
        try {
            int a=10/0;
            return 10;
        }
        catch(ArithmeticException e) {
            System.out.println(e);
        }
        finally {
            System.out.println("Finally");
            return 40;
        }

        System.out.println("hello");
        return 20;
    }
}

并给出无法访问的语句 System.out.println("hello");错误。为什么会这样?

【问题讨论】:

  • 编译器有什么错误?只是警告说 10/0 不是一个好主意?
  • 由于 finally 中的返回,可能是关于无法访问代码块的警告。
  • 请告诉我们编译器错误,否则将很难提供帮助。
  • @pablochan:只需在行首添加 4 个空格即可。
  • 为什么这个问题是社区维基?

标签: java


【解决方案1】:

finally 有一个返回,因此您可能会遇到无法访问的代码块错误。

finally
{   
    System.out.println("Finally"); 
    return 40;
}
System.out.println("hello"); // unreachable code
return 20;

这实际上是 Java 中的编译时错误。见14.20部分。

如果一个 语句无法执行,因为 无法访问。

【讨论】:

  • 这是默认错误吗?我想我能够将其更改为 Eclipse 中的警告。
  • 为什么只有当 finally 的返回是一个错误而不是之前的时候
  • 这是一个编译器错误。我看不出你如何配置 Eclipse 来抑制它。
  • @Abson - 每个执行路径都会到达 finally 并返回。打印“hello”的代码无法执行。 Java 将此视为编译器错误。第一个示例运行良好,因为 finally 块中没有返回。
  • L:Eclipse 有一个“死代码”选项,但我不确定它是否相同(今天晚些时候可能会检查)。
【解决方案2】:

它是unreachable code。根据编译器,System.out.println("hello"); 永远无法执行。

除此之外,永远不要在 finally 块中写入 return。 (请参阅Hidden Features of Java 了解您不应该这样做的原因)。

编辑:

是的,但是最终返回的原因 这样做?

这不是因为它在 finally 块中。即使您删除 finally 关键字,您仍然会收到错误消息。

   class ex15 {
        public int show() {
            int a = 10 / 0;
            return 40;
            System.out.println("hello");
            return 20;
        }
    }

显然,如果你return 40,你就无法执行下一行。 finally 只是意味着“永远做,无论如何”。所以。

【讨论】:

    【解决方案3】:

    当您在“finally”块中放置“return”时,它之后的任何内容都不会被执行。 “return”语句在此处结束该方法。

    如果您将 System.out.println() 放在第一个方法中,在其中的“return”语句之后,您会得到同样的错误。

    【讨论】:

      【解决方案4】:

      您在finally 块中有一个return。这使得之后的任何语句都无法访问。此外,您在 try 块中有一个 return,在 finally 块中也有一个。这没有意义。

      【讨论】:

        猜你喜欢
        • 2020-07-14
        • 2019-12-21
        • 2019-02-18
        • 2013-06-04
        • 1970-01-01
        • 2013-05-05
        • 1970-01-01
        • 2014-04-19
        • 2011-08-07
        相关资源
        最近更新 更多