有关Java选择结构的新“坑”

    xiaoxiao2022-07-13  150

    最近在实践中发现了一个问题,分享一下

    众所周知,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总不加括号是对的吗? 我仍所知甚少,但是我希望能以一颗认真虔诚的心对待编程,希望你也是

    最新回复(0)