写Java的人里,有47%曾在循环条件里踩过同一个坑——不是逻辑错了,是编译器直接报错。今天这篇来自一位自动化测试工程师的第26天学习笔记,把条件判断、循环陷阱和用户输入这些"基础中的基础",扒出了不少反直觉的细节。
条件判断不是你想写就能写
Java的条件有个硬规矩:必须返回布尔值(boolean)。
看这段代码,编译直接报错:
int i = 1;
while(i) { // ❌ Compilation Error
System.out.println(i);
}
错误原因很直白:i是整数,不是true或false。C语言里非零即真,Java不吃这套。改成while(i <= 5),返回布尔值,编译才放行。
但你可以直接写if(true)或if(false)。前者永远执行,后者永远跳过,调试时临时开关代码块很方便。
花括号省略的隐形陷阱
Java允许省略{},前提是循环体只有一条语句。这个"便利"功能坑过无数人。
这段代码看起来打印1到5,然后输出"Done":
for(int i = 1; i <= 5; i++)
System.out.println(i);
System.out.println("Done");
实际输出是1 2 3 4 5,然后一个孤零零的"Done"。
缩进是给人看的,编译器只看语法。第二条println在循环体外,只执行一次。这种bug在代码审查时很难一眼识破,尤其是当省略{}的写法混在几十行循环里。
无限循环的写法也有讲究。for(;;)和while(true)完全等价,都是死循环。前者是C语言遗产,后者可读性更好。选哪个看团队规范,但别两个混着用。
break和continue的精确控制
循环控制语句里,break是"当场退出",continue是"跳过本轮,继续下一轮"。
看对比:
// break版本:遇到3就停
for(int i = 1; i <= 5; i++) {
if(i == 3) break;
System.out.println(i);
}
// 输出:1, 2
// continue版本:跳过3,继续
for(int i = 1; i <= 5; i++) {
if(i == 3) continue;
System.out.println(i);
}
// 输出:1, 2, 4, 5
这两个词的位置也有讲究。continue后面的代码不会执行,如果后面有必须运行的清理逻辑,顺序写错就是灾难。
用户输入的Scanner类
原文提到了Scanner类的使用,这是Java处理命令行输入的标准工具。导入java.util.*,创建Scanner对象,然后调用nextInt()、nextLine()等方法读取数据。
Scanner有个经典坑:nextInt()之后直接调用nextLine()会读到空字符串。因为nextInt()只消费数字,留下换行符在缓冲区,被nextLine()一口吃掉。解决方法是中间插一个额外的nextLine()清掉残留,或者统一用nextLine()再手动解析。
这位工程师的学习笔记还提到了JSON和XML基础,但原文没有展开。从自动化测试的上下文推测,这可能是为后续的数据驱动测试或接口测试做铺垫。
热门跟贴