从java中的If语句中删除花括号是否有区别

42 java if-statement curly-braces

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

if("pie"== "pie"){
    System.out.println("Hurrah!");
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试去除花括号

if("pie"== "pie")
    System.out.println("Hurrah!");
Run Code Online (Sandbox Code Playgroud)

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

Hab*_*bib 37

对于单个语句,它将保持不变,但如果要在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
Run Code Online (Sandbox Code Playgroud)

您应该看到: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
     }
}
Run Code Online (Sandbox Code Playgroud)

(例子来自上面的链接)

  • 无论如何,始终使用大括号是一个非常好的做法。看看 https://www.imperialviolet.org/2014/02/22/applebug.html 以获得一些证据(虽然它是在 C 中,但在这种情况下并不重要) (3认同)

das*_*ght 5

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

但是,许多软件商店甚至坚持要求只用括号即可。原因是这样的错误:

if (x > 20)
    x -= 7;
    y -= 8;
Run Code Online (Sandbox Code Playgroud)

上面的陈述是令人误解的:缩进使您相信这两个分配都受到保护,而实际上只有第一个是受保护的。这样做的原因是Java中的空格不重要:缩进一条语句不会改变其在程序整体流程中的位置。上面的错误很难发现,因此采用规则来防止它们是一个好主意。


drq*_*ver 5

正如@rajesh所说,当主体是单个陈述时,大括号是可选的.

话虽如此,一些编码样式建议使用大括号,因为您(或跟随您的程序员)在您稍后更改代码时不太可能出错.

if("pie"== "pie")
    System.out.println("Hurrah!");
    System.out.println("Tricked you");
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

它确实有一个缺点。到目前为止提到的答案都是正确的。但从安全角度来看,它也存在一些缺点。由于在支付团队工作过,安全性是促使此类决策的一个更重要的因素。假设您有以下代码:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
Run Code Online (Sandbox Code Playgroud)

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

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )
Run Code Online (Sandbox Code Playgroud)

假设您修复了问题并部署了此代码(也许审阅者&您认为这不会导致问题,因为它不在“Prod”条件内)。神奇的是,您的生产日志现在可以打印客户信用卡信息,所有可以查看日志的人员都可以看到这些信息。上帝保佑他们中的任何一个(怀着恶意)获得这些数据。

因此,不加括号和稍不小心的编码通常会导致安全信息的泄露。它还被CMU 软件工程研究所 CERT归类为 JAVA 漏洞。