簡體   English   中英

從java中的If語句中刪除大括號有區別嗎

[英]Is there a difference in removing the curly braces from If statements in java

在看newbostons關於java基礎的教程時,他教我們做這樣的if語句。(注意花括號)

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

所以我試着去掉花括號

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

它仍然有效! 由於我是 Java 新手,我不知道為什么會這樣。 我想知道刪除(或添加)花括號是否有任何好處/壞處。

對於單個語句,它將保持不變,但如果要在 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
     }
}

(上面鏈接中的例子)

不,絕對沒有區別:一對花括號將多個語句合並為一個; ifwhilefor等期望一個語句; 如果只需要保護一個語句,則不需要大括號。

但是,許多軟件商店甚至堅持要對單個語句使用大括號。 原因是這樣的錯誤:

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

上述陳述具有誤導性:縮進使您相信兩個賦值都受到保護,而實際上只有第一個是受保護的。 這樣做的原因是 Java 中的空白是微不足道的:縮進語句不會改變它在整個程序流程中的位置。 像上面這樣的錯誤很難發現,因此首先采用規則來防止它們是一個好主意。

正如@rajesh 所說,當主體是單個語句時,大括號是可選的。

話雖如此,某些編碼風格建議即使對於單語句情況也保留大括號,因為您(或跟隨您的程序員)以后更改代碼時出錯的可能性較小。

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

第二個打印, Tricked you ,實際上不在if ,它只是因為縮進而看起來像。

然而,這只是一個風格點,並沒有被普遍接受,當然一個有能力的程序員需要能夠閱讀這兩種形式。

這是一個適用於多種語言的風格問題,包括 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);

它確實有一個缺點 到目前為止提到的答案是正確的。 但是從事物的安全角度來看,它有一些缺點。 在支付團隊工作后,安全性是推動此類決策的一個更強大的因素。 假設您有以下代碼:

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

現在假設您的代碼由於某些內部問題而無法正常工作。 你想檢查輸入。 因此,您進行以下更改:

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

假設您解決了問題並部署了此代碼(也許審閱者並且您認為這不會導致問題,因為它不在“Prod”條件內)。 神奇的是,您的生產日志現在會打印客戶信用卡信息,所有可以查看日志的人員都可以看到這些信息。 上帝保佑他們中的任何一個人(懷着惡意)獲得了這些數據。

因此,不給大括號和一點粗心的編碼通常會導致安全信息的破壞。 它也被CERT - 軟件工程學院,CMU歸類為 JAVA 中的一個漏洞。

如果if之后只有一個語句,則大括號不是強制性的。

現在,如果您有一段代碼需要符合if條件,那么您需要使用大括號。

這也適用於loops

花括號通常用於包含語句塊。 如果沒有大括號,則在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()方法。 這個例子仍然有效,因為它正在將一個常量字符串與其自身進行比較,這總是正確的。

不,但真正的危險發生在稍后編輯代碼時。 編輯以下內容相對容易:

if (someCondition) 
    // do something 

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

並認為“做其他重要的事情”只會在 someCondition 為真時運行。 縮進會誤導:-)

有了括號,這種危險就不存在了。

如果句子數等於 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!");

即使在這種情況下,自動制表符設置也應該表明else指向哪個if語句,但是如果您像我經常做的那樣選擇繞過規則,您當然應該警惕。

我想知道刪除(或添加)花括號是否有任何好處/壞處?

始終添加它們的優點是您可以稍后簡單地擴展代碼塊,而無需添加它們。 假設你有:

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

然后,如果要添加額外的代碼行,則需要確保添加大括號:

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

如果它們已經存在,只需將光標放在行尾,按回車鍵並開始添加新代碼。

對於單行,在技術上沒有區別,但是許多代碼約定建議甚至強制要求它們始終存在。 甚至還有一個CheckStyle 規則

對於單個語句不是問題

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

在 if 需要大括號之后的兩個或多個語句

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

也使用 .equals() 進行比較而不是 ==。

不,它們之間沒有區別,只有一個語句來響應if 如果要添加第二條語句以響應if ,則需要大括號。

如果在 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");
   }

僅當您想在條件下執行一堆代碼時才使用花括號。 如果你不使用大括號,那么它只會在 if 條件之后執行第一條語句。 其余行(在第一個語句下方)不會被視為 if 部分。

如果在此 if 語句中添加花括號:

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

然后就不能用了。

所以我認為在某些情況下它確實很重要。

如果 if-then 中只有一個語句,則可以省略 {} 大括號。 但是,我傾向於始終將它們包含為最佳編碼實踐,因為忘記將它們與 if-then 中的多個語句一起使用會觸發錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM