You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
    }
}

关键修改说明

  1. 全局复用Scanner:仅初始化一个Scanner实例,避免重复创建资源,程序结束时统一关闭。
  2. 正确读取输入选项:用scanner.nextLine()读取用户输入的字符串,再与"1"/"2"做比较,确保分支逻辑能正常触发。
  3. 支持小数输入:将输入类型改为double,覆盖更多实际转换场景。
  4. 优化输出格式:用printf格式化输出,保留两位小数提升可读性,同时修复了litToGal的输出空格问题。
  5. 处理换行符残留:调用nextDouble()后用nextLine()清除输入缓冲区的换行符,避免后续读取操作出现异常。

内容的提问来源于stack exchange,提问作者arivvid27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:07:10