Scanner读取用户输入时跳过nextLine()是因为nextInt()等方法残留换行符,应统一用nextLine()后转换类型,或在nextInt()后加scanner.nextLine()清缓存。

用 Scanner 读取用户输入时为什么程序直接跳过?
常见现象是调用 nextLine() 前用了 nextInt() 或 nextDouble(),导致换行符残留,nextLine() 立刻返回空字符串。
- 根本原因是
nextInt()只读数字,不消费后续的\n;而nextLine()会读取并吃掉这个换行符 - 稳妥做法:统一用
nextLine(),再手动转类型,比如Integer.parseInt(scanner.nextLine()) - 若必须混用,记得在
nextInt()后加一句scanner.nextLine()清掉缓存
如何组织主逻辑避免 main 方法变成“意大利面代码”?
新手常把所有功能(输入、计算、输出)全塞进 main,导致难以调试和复用。
- 把每块职责拆成独立方法:比如
getUserChoice()、calculateSum(int a, int b)、printResult(double result) - 参数和返回值要明确——别传
Scanner进去又传出来,只传需要的数据,Scanner实例保留在main里管理 - 方法名用动宾结构,比如
readStudentName()比getName()更不易歧义
退出机制写成 while (true) + break 安全吗?
可以,但容易漏掉清理或导致控制流混乱。更清晰的做法是用带条件的循环变量。
- 定义布尔变量如
running = true,循环条件为while (running) - 在退出分支里设
running = false,比多层break更易追踪 - 如果涉及资源(如文件、网络),记得在循环外用
try-with-resources包裹Scanner,否则可能泄漏
运行时报 NoClassDefFoundError 或找不到 Main 类?
不是语法错,而是 JVM 找不到入口类——通常发生在编译/运行路径不一致时。
立即学习“Java免费学习笔记(深入)”;
- 确保
.java文件名和public class名完全一致(大小写敏感) - 编译用
javac MyApp.java,运行用java MyApp(不要加.class或.java) - 如果类在包里(比如
package cli;),必须按目录结构存放:cli/MyApp.java,然后在cli的父目录执行java cli.MyApp










