众所周知,Java的选择结构和循环结构是允许单行不加大括号的 有的资料上会提倡这种模式,因为可以缩减代码的行数 也有的不提倡,认为可能会在后期添加行数很麻烦以及出现意外的错误 下面略举3例加以阐释:
<1>“空悬”的else引发问题
public class Test1 { public static void main(String[] args) { int x = 300; if (x > 100) System.out.println("大于100"); if (x > 400) System.out.println("大于400"); else System.out.println("??"); } }这个程序的输出是什么? 你可能会认为是:
大于100因为会执行外层if不执行内层if,else的缩进对应着外层if… 很抱歉,真实的输出是这样的:
大于100 ??这里就涉及到一个“空悬”的else的“归属问题”了 Java不同于Python,Python是识别缩进的,Java认的是大括号,说的不好听点就是你不缩进写的一坨也许也没事(只要你和你的小伙伴忍受得了) 在没有指示的情况下,JVM会认为else对应着内层的if,所以就得到了“异常”的输出
<2>“空悬”的if引发问题
public class Test2 { public static void main(String[] args) { int x = 200; if (x > 100) x++; else x--; System.out.println(x); } }这个程序特别简单,肯定没问题,输出:
201但是如果我后续加代码成这样:
public class Test2 { public static void main(String[] args) { int x = 200; if (x > 100) x++; if (x > 300) x++; else x--; System.out.println(x); } }输出结果:
200其实就是说else归属于第2个if了,先x++,后x–,就保持了200
这些问题就是说if后接单行代码,后续维护时没注意产生问题
<3>打分号但不换行以为还是一行
public class Test3 { public static void main(String[] args) { int x = 3; if (x > 2) if (x > 3) x++; x+=2; System.out.println(x); } }输出结果:
5这是因为Java以;作为换行符,可能初学者认为自己没换行,实际上程序已经默认你换行了 x+=2;语句的条件已经不在if内了,所以会被执行
举的例子简单的不能再简单了,但是在实际的开发中如果有一点点的错误都可能产生很大的问题,我就体会过,所以建议读者养成良好的习惯,不应该省略的就不要省略 之前看网上写的:程序员总是喜欢假设他们自己是对的 人都希望自己是对的,这点我不否认,但是如果你是一个认真负责的人,就应该做好最坏的假设不是吗? 记得之前看有的学了半年多编程的人写的代码,一个简简单单的问月份算价格的程序 居然有这样的结构:
...... if(x>=4&&x<=11) ...... ...... ...... else ...... ...... ...... ......看了就感觉很迷,寥寥几行的程序中,13月是学了半年编程的人不需要考虑的吗?if总不加括号是对的吗? 我仍所知甚少,但是我希望能以一颗认真虔诚的心对待编程,希望你也是