53

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

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

所以我试着去掉花括号

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

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

4

17 回答 17

47

对于单个语句,它将保持不变,但如果您想在 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

你应该看到: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
     }
}

(来自上述链接的示例)

于 2013-04-03T12:10:17.347 回答
7

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

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

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

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

于 2013-04-03T12:10:47.597 回答
5

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

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

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

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

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

于 2013-04-03T12:13:10.767 回答
5

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

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 中的漏洞。

于 2015-12-03T08:21:32.863 回答
3

花括号通常用于有一个语句块。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对象,请.equals()使用String. 此示例仍然有效,因为它正在将一个常量字符串与其自身进行比较,这始终是正确的。

于 2013-04-03T12:10:39.003 回答
3

这是一个风格问题,适用于多种语言,包括 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);
于 2013-04-03T12:14:01.477 回答
2

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

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

这也适用loops

于 2013-04-03T12:10:13.637 回答
2

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

于 2013-04-03T12:10:41.087 回答
2

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

if (someCondition) 
    // do something 

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

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

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

于 2013-04-03T12:13:36.540 回答
1

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

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

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!");

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

于 2018-02-07T20:37:04.280 回答
0

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

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

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

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

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

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

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

于 2013-04-03T12:11:25.917 回答
0

对于单个语句不是问题

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

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

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

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

于 2013-04-03T12:11:32.743 回答
0

不,它们与响应if. 如果要添加第二条语句以响应if,则需要大括号。

于 2013-04-03T12:13:19.563 回答
0

如果 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");
   }
于 2013-04-03T12:18:23.553 回答
0

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

于 2015-11-27T17:52:34.227 回答
0

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

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

然后它不会再工作了。

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

于 2017-12-11T16:43:29.690 回答
-1

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

于 2020-04-12T14:10:02.357 回答