Java加仑与升互转程序Scanner输入被跳过,程序终止求助
问题原因及解决方案
核心问题
程序直接终止的根本原因是intro方法里没有正确读取用户输入,且错误地将Scanner对象与字符串进行比较:
- 代码中
"1".equals(galOrLit)是拿字符串和Scanner实例做比较,永远不会相等,导致两个if分支都不会执行。intro方法执行完毕后直接回到main方法,程序随即终止,看起来像是跳过了输入阶段。 - 将Scanner设为final完全无法解决这个问题,final仅保证对象引用不被修改,和输入读取、比较逻辑无关。
其他次要问题
除核心逻辑错误外,代码还有几个可优化的点:
- 每个方法都新建Scanner实例,属于资源浪费,应该全局复用一个Scanner。
- 输入仅接受int类型,实际转换场景中应该支持小数(比如1.5加仑),用double类型处理更合理。
litToGal方法的输出语句缺少空格,会导致格式混乱(例如输出变成5 liters is1.320864373646114 gallons.)。
修正后的代码
import java.util.Scanner; public class Main { // 全局复用一个Scanner对象 private static final Scanner scanner = new Scanner(System.in); private static void intro() { System.out.println("[1] => Gallons to Liters"); System.out.println("[2] => Liters to Gallons"); System.out.print("请输入选择:"); // 读取用户输入的选项字符串 String choice = scanner.nextLine(); if ("1".equals(choice)) { galToLit(); } else if ("2".equals(choice)) { litToGal(); } else { System.out.println("无效选项,请输入1或2"); } } private static void galToLit() { System.out.print("Enter Gallons: "); // 读取支持小数的输入 double input = scanner.nextDouble(); // 消费换行符,避免后续读取异常 scanner.nextLine(); double liters = input * 3.7854; // 格式化输出,保留两位小数更美观 System.out.printf("\n%.2f gallons is %.2f liters.\n", input, liters); } private static void litToGal() { System.out.print("Enter Liters: "); double input = scanner.nextDouble(); scanner.nextLine(); double gallons = input / 3.7854; System.out.printf("\n%.2f liters is %.2f gallons.\n", input, gallons); } public static void main(String[] args) { intro(); // 程序结束后关闭Scanner资源 scanner.close(); } }
关键修改说明
- 全局复用Scanner:仅初始化一个Scanner实例,避免重复创建资源,程序结束时统一关闭。
- 正确读取输入选项:用
scanner.nextLine()读取用户输入的字符串,再与"1"/"2"做比较,确保分支逻辑能正常触发。 - 支持小数输入:将输入类型改为double,覆盖更多实际转换场景。
- 优化输出格式:用
printf格式化输出,保留两位小数提升可读性,同时修复了litToGal的输出空格问题。 - 处理换行符残留:调用
nextDouble()后用nextLine()清除输入缓冲区的换行符,避免后续读取操作出现异常。
内容的提问来源于stack exchange,提问作者arivvid27
相关产品推荐
相关产品推荐

