【问题标题】:Why an IF block is allowed inside another IF that doesn't have curly brackets in JAVA [duplicate]为什么在 JAVA 中没有大括号的另一个 IF 中允许使用 IF 块 [重复]
【发布时间】:2013-08-12 04:57:58
【问题描述】:

通常在 JAVA 中,如果 IF 语句没有大括号,则在满足 IF 条件时只能执行一行,但是如果另一个 IF 块(内部 IF)跟在初始 IF 之后,则不会触发错误并且有更多的线路。这怎么可能?

例子

if (true)
if (true)
   System.out.println("true");
else
   System.out.println("false");

【问题讨论】:

标签: java if-statement brackets


【解决方案1】:

没有错误,因为它等于

if (true) {
    if (true) {
       System.out.println("true");
    }
    else
    {
       System.out.println("false");
    }
}

还有一个有效的语法。

但请始终使用{},否则,很难理解if 块的确切结束位置。

【讨论】:

  • +1 我建议您始终使用标准缩进或使用您的 IDE 为您完成。这样即使没有{ } 也可以清楚地看到嵌套
  • if (true) int x=0;整数y=0;等同于 if (true) {int x=0; int y=0;} 并且仍然返回错误。
  • @Alin 你遇到了哪个错误??
  • 如果我在 2 条语句后加上 else 会出现错误,而使用花括号时却没有。如果我没有 if, int y=0;它不会作为 if 块的一部分执行。
  • 我不确定,我的理解是,现在您面临一些局部变量范围问题,而且主要原因之一是始终使用{}
【解决方案2】:

通常在 JAVA 中,如果 IF 语句没有大括号,则在满足 IF 条件时只能执行一行,

更正。没有大括号的if 语句只能有一个在满足条件时执行的语句if 的语法类似于

if (<condition>) <statement>; [else <statement>;]

也就是说,如果有else,它就是if 的一部分。这是一个声明。

没有错误的原因是这里没有歧义。 (好吧,无论如何,不​​是编译器。)由于elseif 的一部分,它与最接近的if 一起使用。所以通过适当的缩进,你有

if (true)
    if (true)
       System.out.println("true");
    else
       System.out.println("false");

【讨论】:

    【解决方案3】:

    那是因为你的外部 if 块确实包含一个语句。

    • 如果内部if 条件为真,则外部if 等价于:

      if (true)
          System.out.println("true");
      
    • 而如果,内if条件如果false,则相当于:

      if (true)
          System.out.println("false");
      

    不过,省略if-else 周围的花括号 或循环确实是个坏主意,特别是使用嵌套块执行此操作可能会变坏。可以做,不代表就应该做。

    要查看没有大括号的嵌套 if 块如何变得丑陋,并且经常导致错误,请考虑这段代码,您认为输出应该是什么?

    boolean b = true;
    boolean b2 = false;
    
    if (b)
        if (true)
           System.out.println("true");
           if (b2)
               System.out.println("Hello");
    else
        System.out.println("false");
    

    【讨论】:

      【解决方案4】:

      将此 IF 语句视为:

          if(true) {
             if(true) {
                 System.out.println("true"); 
             }
             else {
                 System.out.println("false");
             }
          }
      

      如果第一个 IFtrue 它转到下一条语句,这里下一条语句也是 IFtrue 因此它在其中执行语句。如果假设为假,则搜索else 并在else 中执行语句。所以所有语句都被覆盖了,不会发生错误情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多