代码之家  ›  专栏  ›  技术社区  ›  tariqalr

带有try-catch块的无限循环的编译和返回值

  •  0
  • tariqalr  · 技术社区  · 1 年前

    我在尝试文件I/O时遇到了这个问题。此方法编译:

    public static int testMethod1() {
            try {
                while (true);
            } catch (Exception e) {
                return 0;
            }
            
        }
    

    虽然这两个没有:

    public static int testMethod2() {
            try {
                while (true) { break; }
            } catch (Exception e) {
                return 0;
            }
            
        }
    
    public static int testMethod3() {
            try {
                while (true) {
                    if (false) {
                        break;                  
                    }
                }
            } catch (Exception e) {
                return 0;
            }
            
        }
    

    我无法理解这一点。第一种方法在逻辑上等同于第三种方法。编译器到底在做什么?

    2 回复  |  直到 1 年前
        1
  •  3
  •   f1sh    1 年前

    第一种方法在逻辑上等同于第三种方法

    事实并非如此。这个 if(false) 确实会有所不同。编译器在编译时不会对此进行求值,因此代码可能会到达 break ,在这种情况下,您不会返回任何内容(就像在第二个片段中一样),这是实际的编译错误。

    有关的更多信息 if(false) ,看一看 the JLS ,在底部一直表示:

    这种不同处理的基本原理是允许程序员定义“标志变量”,例如: static final boolean DEBUG = false; 然后编写代码,例如: if (DEBUG) { x=3; }