0

当 if 参数为真时,为什么 java 程序在 if else 情况下不会出错。为什么它没有任何例外。例如,这里的method1和method2即使有无法访问的语句也不会产生任何(编译)错误,但是method3会产生编译错误。首先仔细阅读代码并提供答案。

    public int method1() {
        if(true) {
            return 1;
        } else {
            return 2;//unreachable statement but doesn't make exception
        }
    }

    public int method2() {
        if(true) {
            return 1;
        } else if (true) {
           return 2;//unreachable statement but doesn't make exception
        } else {
            return 3;//unreachable statement but doesn't make exception
        }
    }

    public int method3() {

        if(true) {
            return 1;
        } else if (true) {
           return 2;//unreachable statement but doesn't make exception
        } else {
            return 3;//unreachable statement but doesn't make exception
        }

        return 3;//unreachable statement but makes exception
    }

java不支持严格编译吗?这个问题背后的原理是什么?

4

2 回答 2

6

该语言通过为 if-then-else 制作特殊情况来允许条件编译。这使得在编译时打开或关闭代码块变得容易。

来自Java 语言规范关于无法访问语句的部分

   As an example, the following statement results in a compile-time error:

          while (false) { x=3; }

   because the statement x=3; is not reachable; but the superficially similar case:

          if (false) { x=3; }

   does not result in a compile-time error. 

和:

   The rationale for this differing treatment is to allow programmers to 
   define "flag variables" such as:

          static final boolean DEBUG = false;

   and then write code such as:

          if (DEBUG) { x=3; }

   The idea is that it should be possible to change the value of DEBUG 
   from false to true or from true to false and then compile the code 
   correctly with no other changes to the program text.
于 2012-10-14T14:27:06.643 回答
0

我会说编译器作者认为第一种情况不值得生成错误,而最后一种情况是。我只能推测他们的想法,但我怀疑虽然他们可以在前两种情况下确定可达性,但不太可能有人会意外编写这样的代码。它更有可能作为调试机制被显式引入。此外,添加评估以检测此类错误(这是一种极端情况)的成本可能不值得。无论如何,这个错误只是烦人,没有帮助。在最后一种情况下,程序员可以很容易地编写这样的代码,而没有意识到最后的语句是不可达的,因此出现了错误。

于 2012-10-14T14:24:08.347 回答