[英]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
}
}
(上面鏈接中的例子)
不,絕對沒有區別:一對花括號將多個語句合並為一個; if
、 while
、 for
等期望一個語句; 如果只需要保護一個語句,則不需要大括號。
但是,許多軟件商店甚至堅持要對單個語句使用大括號。 原因是這樣的錯誤:
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.