在Java中,去掉if语句中的花括号是否有区别?

54

在观看thenewboston的基础Java教程时,他教我们要像这样写if语句。(请注意大括号)

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

所以我尝试去掉大括号

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

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


27
在Java中不要使用==比较字符串;应始终使用.equals() - Jesper
8
为了更让您惊叹,您也可以将所有内容写在同一行上! - Azmi Kamis
21
我对这些负评很好奇。对于一个正在学习编程/Java的人来说,这似乎是一个合理的问题。 - matt freake
8
我认为有很多人会因为认为一个问题太简单或太明显而给它点踩,他们忘记了自己曾经也是初学者。但在声望方面,1个赞同等于5个点踩。 - Stephen C
3
@Bhushan,我想你的意思是“同意”而不是“生气”吧? - user735977
显示剩余7条评论
17个回答

52

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

(以上链接中的示例)


3
无论如何,始终使用花括号是一种非常好的实践方法。请参阅 https://www.imperialviolet.org/2014/02/22/applebug.html 了解一些证据(尽管它是关于 C 语言的,但在这种情况下并不重要)。 - MrTJ
该链接中的代码并没有显示由于缺少大括号而引起的错误。它显示了一个人将同一行两次输入。无论大括号是否存在,这种情况都可能发生。 - omikes

7
不,完全没有区别:一对花括号可以将多个语句合并为一个;ifwhilefor等都只期望单个语句;如果你只需要保护一个语句,那么就不需要花括号。
然而,许多软件公司坚持即使只有一个语句也要使用花括号。原因是这样的错误:
if (x > 20)
    x -= 7;
    y -= 8;

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


5

正如@rajesh所说,当主体只有一个语句时,括号是可选的。

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

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

第二个打印语句“Tricked you”并不在if语句中,只是由于缩进的原因看起来像是在其中。
然而,这只是一个风格问题,并不是普遍认可的,对于一名有能力的程序员来说,需要能够阅读两种形式。

5

它确实有一个缺点。目前提到的答案是正确的。但是从安全角度来看,它存在一些缺点。作为一个支付团队的成员,安全是一个更强大的因素,促使这样的决策。假设你有以下代码:

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

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

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

假设你修复了问题并部署了这段代码(也许审阅者和你认为这不会引起问题,因为它不在“Prod”条件内)。神奇的是,你的生产日志现在打印出可以被所有能够看到日志的人员查看的客户信用卡信息。万一其中有人(带着恶意的)获取了这些数据,后果不堪设想。

因此,缺少括号和粗心编码往往会导致安全信息的泄露。这也被CERT-软件工程研究所,卡内基梅隆大学列为JAVA的漏洞。


4

花括号通常用于表示一组语句。如果没有花括号,只有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() 方法。这个例子仍然有效,因为它将一个常量字符串与自身进行比较,这总是为真。

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

另一个缺点是在嵌套条件语句中出现悬挂else的问题。 - GStav

2
如果在if后面只有一条语句,则花括号不是必需的。
现在,如果您有一块代码需要归属于if条件下,则需要使用花括号。
对于循环也适用。

2

如果只有一句话,情况就相同。但如果有多个句子,你需要使用 { } 语法。


2

不过,真正的危险在于稍后编辑代码。像这样的内容进行编辑相对容易:

if (someCondition) 
    // do something 

to

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

我认为只有当 someCondition 为真时,“执行其他重要操作”才会运行。缩进可能会误导 :-)

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


1
我的看法是,在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 语句,但如果您选择像我经常那样规避规则,那么这是您应该注意的事项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接