在观看关于基本 java 的 newbostons 教程时,他教我们做这样的 if 语句。(注意花括号)
if("pie"== "pie"){
System.out.println("Hurrah!");
}
所以我试着去掉花括号
if("pie"== "pie")
System.out.println("Hurrah!");
它仍然有效!由于我是java新手,我不知道为什么会这样。而且我想知道删除(或添加)花括号是否有任何好处/坏处。
在观看关于基本 java 的 newbostons 教程时,他教我们做这样的 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
,只是因为缩进而看起来像它。
然而,这只是一个风格点,并没有被普遍接受,当然一个称职的程序员需要能够阅读这两种形式。
它确实有一个缺点。到目前为止提到的答案是正确的。但是从事物的安全角度来看,它也有一些缺点。在支付团队工作后,安全性是推动此类决策的一个更强大的因素。假设您有以下代码:
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 中的漏洞。
花括号通常用于有一个语句块。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
. 此示例仍然有效,因为它正在将一个常量字符串与其自身进行比较,这始终是正确的。
这是一个风格问题,适用于多种语言,包括 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
则大括号不是强制性的。
现在,如果您有一段代码需要符合if
条件,那么您需要使用大括号。
这也适用loops
于
如果句子数量等于 1,则相同。如果有多个,则需要 { } 语法
没有,但真正的危险发生在以后编辑代码时。编辑以下内容相对容易:
if (someCondition)
// do something
到
if (someCondition)
// do something
// do something else important
并认为“做其他重要的事情”只会在 someCondition 为真时运行。缩进误导:-)
有了括号,这种危险就不存在了。
我的两分钱。在没有花括号的 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
,但是如果您像我经常做的那样选择规避规则,那么您当然应该警惕这一点。
而且我想知道删除(或添加)花括号是否有任何好处/坏处?
总是添加它们的好处是您可以稍后简单地扩展代码块,而无需添加它们。假设你有:
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("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 中的多个语句一起使用会触发错误。