【问题标题】:Is there a difference in removing the curly braces from If statements in java从 java 中的 If 语句中删除花括号是否有区别
【发布时间】:2026-02-13 20:20:03
【问题描述】:

在观看 newbostons 的基本 java 教程时,他教我们做这样的 if 语句。(注意花括号)

if("pie"== "pie"){
    System.out.println("Hurrah!");
}

所以我试着去掉花括号

if("pie"== "pie")
    System.out.println("Hurrah!");

它仍然有效!由于我是java新手,我不知道为什么会这样。而且我想知道删除(或添加)花括号是否有任何好处/坏处。

【问题讨论】:

  • 不要将字符串与 Java 中的== 进行比较;始终使用.equals()
  • 为了让您更惊喜,您也可以将所有内容写在同一行!
  • 我对否决票很好奇。对于学习编程/Java的人来说似乎是一个明智的问题
  • 我认为有很多人投反对票是因为他们认为问题“太简单”/“太明显”......忘记了他们曾经也是初学者。但就声誉而言,1 次赞成 == 5 次反对。
  • @Bhushan 我想你的意思是“同意”而不是“agry”?

标签: java if-statement curly-braces


【解决方案1】:

对于单个语句,它将保持不变,但如果您想在 if 块中组合多个语句,则必须使用花括号。

if("pie"== "pie"){
    System.out.println("Hurrah!");
    System.out.println("Hurrah!2");
}

if("pie"== "pie")
    System.out.println("Hurrah!"); //without braces only this statement will fall under if
    System.out.println("Hurrah!2"); //not this one

你应该看到:Blocks in Java

块是一组零个或多个平衡括号之间的语句 并且可以在任何允许使用单个语句的地方使用。以下 例如,BlockDemo,说明了块的使用:

class BlockDemo {
     public static void main(String[] args) {
          boolean condition = true;
          if (condition) { // begin block 1
               System.out.println("Condition is true.");
          } // end block one
          else { // begin block 2
               System.out.println("Condition is false.");
          } // end block 2
     }
}

(来自上述链接的示例)

【讨论】:

  • 无论如何,总是使用大括号是一个非常好的做法。查看imperialviolet.org/2014/02/22/applebug.html 以获取一些证据(虽然它是在 C 中,但在这种情况下并不重要)
  • 该链接中的代码未显示因缺少大括号而导致的错误。它显示了一个人两次离开同一行。无论大括号是否存在,都可能发生这种情况。
【解决方案2】:

不,绝对没有区别:一对花括号将多个语句组合成一个语句; ifwhilefor 等期望单个语句;如果只需要保护一个语句,则不需要大括号。

但是,许多软件商店坚持使用大括号,即使是单个语句。原因是这样的错误:

if (x > 20)
    x -= 7;
    y -= 8;

上述陈述具有误导性:缩进使您相信两个分配都受到保护,而实际上只有第一个分配受到保护。原因是 Java 中的空格无关紧要:缩进语句不会改变它在整个程序流程中的位置。像上面这样的错误很难发现,所以首先采用规则来防止它们是个好主意。

【讨论】:

    【解决方案3】:

    正如@rajesh 所说,当正文是单个语句时,大括号是可选的。

    话虽如此,一些编码风格建议即使是单个语句的情况也保留大括号,因为您(或之后的程序员)在以后更改代码时出错的可能性较小。

    if("pie"== "pie")
        System.out.println("Hurrah!");
        System.out.println("Tricked you");
    

    第二个打印,Tricked you,实际上不在if 中,只是看起来像它,因为有缩进。

    但这只是一个风格点,没有被普遍接受,当然一个称职的程序员需要能够阅读这两种形式。

    【讨论】:

      【解决方案4】:

      它确实有一个缺点。到目前为止提到的答案是正确的。但是从事物的安全角度来看,它也有一些缺点。在支付团队工作后,安全性是推动此类决策的一个更强大的因素。假设您有以下代码:

      if( "Prod".equals(stage) )
        callBankFunction ( creditCardInput )
      else
        callMockBankFunction ( creditCardInput )
      

      现在假设您的代码由于某些内部问题而无法正常工作。你想检查输入。因此,您进行以下更改:

      if( "Prod".equals(stage) )
        callBankFunction ( creditCardInput )
      else
        callMockBankFunction ( creditCardInput )
        Logger.log( creditCardInput )
      

      假设您解决了问题并部署了此代码(也许审阅者并且您认为这不会导致问题,因为它不在“Prod”条件之内)。神奇的是,您的生产日志现在打印客户信用卡信息,所有可以看到日志的人员都可以看到这些信息。上帝禁止他们中的任何人(出于恶意)获取这些数据。

      因此,不给予支持和一点粗心的编码通常会导致安全信息的泄露。它也被CERT - Software Engineering Institure, CMU归类为JAVA中的漏洞。

      【讨论】:

        【解决方案5】:

        花括号通常用于包含语句块。如果没有大括号,if() 语句中只会执行第一行。不是以{ 开头并以} 结尾的整个块

        if("pie" == "pie") {
           System.out.println("Executes if pie==pie");
           System.out.println("So does this");
        }
        

        if("pie" == "pie")
           System.out.println("Executes if pie==pie");
        System.out.println("Executes, regardless of if pie is equal to pie");
        

        但是请注意,如果您想比较两个String 对象,请使用String 中的.equals() 方法。此示例仍然有效,因为它正在将一个常量字符串与自身进行比较,这始终是正确的。

        【讨论】:

          【解决方案6】:

          这是一个风格问题,适用于多种语言,包括 Java、C++、C 和 C#。

          当一个代码块只包含一行时,大括号可以省略。这适用于任何控制结构:if、while、for、do-while。

          例如,下面的两个循环是等价的。

          for(int i=0; i<100; i++)
            doSomething(i);
          
          
          
          for(int i=0; i<100; i++) {
            doSomething(i);
          }
          

          省略 {} 的优势: 您的代码可以更简洁 - 意味着更少的行。有些人可能会觉得它更具可读性。

          省略 {} 的缺点: 如果您稍后修改代码并需要在代码块中添加另一行,则最好记住添加那些 {}。如果没有,你写下面的代码:

          for(int i=0; i<100; i++)
            doSomething(i);
            doSomethingElse(i);
          

          这真的相当于:

          for(int i=0; i<100; i++) {
            doSomething(i);
          }
          doSomethingElse(i);
          

          【讨论】:

          • 另一个缺点是在嵌套条件的情况下dangling else 的问题。
          【解决方案7】:

          如果句子数等于 1,则相同。如果有多个,则需要 { } 语法

          【讨论】:

            【解决方案8】:

            没有,但真正的危险发生在以后编辑代码时。编辑如下内容相对容易:

            if (someCondition) 
                // do something 
            

            if (someCondition) 
                // do something
                // do something else important
            

            并认为“做其他重要的事情”只会在 someCondition 为真时运行。缩进误导:-)

            有了括号,这种危险就不存在了。

            【讨论】:

              【解决方案9】:

              如果if 之后只有一个语句,则大括号不是强制性的。

              现在,如果您有一段代码需要符合if 条件,那么您需要使用大括号。

              这也适用于loops

              【讨论】:

                【解决方案10】:

                我的两分钱。在没有花括号的 if 语句之后写两行是我从未见过的错误。也就是说,与你一起工作的人是骨头,他们不会理解你在这里拉的魔术。为您的私人代码保存类似这样的有趣内容,但在专业和课堂环境中按照您的指示去做。

                对此有一个实际的论据,说明了一个可能出现的合理问题。您可能知道,在解析代码时,所有缩进和额外的空格都会从您的代码中删除。当您尝试在多个单行 if 语句之后使用单行 else 语句时,可能会出现问题。例如:

                if("cherry".equals("cherry"))
                    if("pie".equals("pie"))
                        System.out.println("Hurrah!");
                else
                    System.out.println("Rats!");
                

                变得无法区分

                if("cherry".equals("cherry"))
                    if("pie".equals("pie"))
                        System.out.println("Hurrah!");
                    else
                        System.out.println("Rats!");
                

                即使在这种情况下,自动选项卡设置也应该指出else 指向的if 语句,但如果您像我经常做的那样选择规避规则,那么您当然应该警惕这一点。

                【讨论】:

                  【解决方案11】:

                  对于单个语句不是问题

                  if("pie"== "pie")
                  System.out.println("Hurrah!");
                  

                  如果需要大括号,则用于两个或多个语句之后

                  if("pie"== "pie"){
                  System.out.println("Hurrah!");
                  System.out.println("Hi!");
                  }
                  

                  还可以使用 .equals() 进行比较,而不是 ==。

                  【讨论】:

                    【解决方案12】:

                    如果if条件后面只有一条语句就可以了。

                    if("pie"== "pie")
                        System.out.println("Hurrah!");
                        System.out.println("second statement");// this will not print
                    

                    但是这里两个语句都会打印出来

                    if("pie"== "pie")
                    {
                    System.out.println("Hurrah!");
                    System.out.println("second statement");
                    }
                    

                    即使你想打印单个语句,我建议你使用如下所示。

                    if("pie".equals("pie"))
                       {
                           System.out.println("Hurrah!");
                           System.out.println("second statement");
                       }
                    

                    【讨论】:

                    • 你写的第一个例子是错误的。 "second statement" 将无条件打印,即总是打印。
                    【解决方案13】:

                    我想知道删除(或添加)花括号是否有任何好处/坏处?

                    总是添加它们的好处是您可以在以后简单地扩展代码块,而无需添加它们。假设你有:

                    if("pie".equals("pie"))
                        System.out.println("Hurrah!");
                    

                    那么,如果要添加额外的代码行,则需要确保添加大括号:

                    if("pie".equals("pie")) {
                        log.debug("I am here!");
                        System.out.println("Hurrah!");
                    }
                    

                    如果它们已经存在,只需将光标放在行尾,按回车键并开始添加新代码。

                    对于单行,在技术上没有区别,但许多代码约定建议甚至强制要求它们始终存在。甚至还有一个CheckStyle rule

                    【讨论】:

                      【解决方案14】:

                      不,与if 的回复中的一个声明没有区别。如果要添加第二条语句来响应if,则需要大括号。

                      【讨论】:

                        【解决方案15】:

                        只有当你想在条件下执行一堆代码时才使用花括号。如果你不使用大括号,那么它只会在 if 条件之后执行第一条语句。其余行(在第一条语句下方)将不被视为 if 部分。

                        【讨论】:

                          【解决方案16】:

                          如果在这个 if 语句中添加花括号:

                          if(++colorIndex == someColors.length)
                                      colorIndex = 0;
                                  setForeground(currentColor());
                                  repaint();
                          

                          然后就不行了。

                          所以我认为在某些情况下它确实很重要。

                          【讨论】:

                            【解决方案17】:

                            如果 if-then 中有一条语句,则可以省略 {} 花括号。但是,我倾向于始终将它们作为最佳编码实践包括在内,因为忘记在 if-then 中将它们与多个语句一起使用会触发错误。

                            【讨论】:

                            • 这就是这里几乎所有其他答案的意思。除了“触发错误”部分,这并不完全准确。其他语句将被执行。无法保证它们会或不会触发错误。