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

Java I/O类型不匹配问题:如何修改代码实现字符串读取与功能修复

看起来你遇到了两个核心问题:一是原程序处理输入时要么没输出,要么触发I/O类型不匹配错误;二是想扩展支持读取字符串(比如商品名称)。我来一步步帮你解决:

一、先修复原数字读取的问题(无输出/类型不匹配错误)

你的程序出现问题大概率是这几个原因:

  • 没正确处理EOF(Ctrl+D),导致循环无法终止,自然没输出;
  • 用户输入非数字时触发InputMismatchException,程序直接崩溃;
  • 最低价格变量初始化不合理,比如默认设为0,会导致负数输入的结果错误。

下面是修复后的代码,附带详细的错误处理:

import java.util.Scanner;
import java.util.InputMismatchException;

public class MinPriceFinder {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Double minPrice = null; // 初始为null,判断是否有有效输入

        System.out.println("请输入商品价格(按Ctrl+D结束输入):");
        while (scanner.hasNext()) { // 循环直到遇到EOF
            try {
                double price = scanner.nextDouble();
                // 第一次输入时初始化minPrice,之后比较更新
                if (minPrice == null || price < minPrice) {
                    minPrice = price;
                }
            } catch (InputMismatchException e) {
                // 捕获非数字输入,提示用户并跳过错误内容
                System.out.println("⚠️ 警告:输入的不是有效数字,已跳过该输入");
                scanner.next(); // 清除错误输入,避免死循环
            }
        }

        // 根据是否有有效输入输出结果
        if (minPrice != null) {
            System.out.println("最低价格:" + minPrice);
        } else {
            System.out.println("没有输入任何有效价格");
        }
        scanner.close();
    }
}

关键改进点:

  • 用scanner.hasNext()判断输入是否存在,直到用户按下Ctrl+D触发EOF,确保循环能正常终止;
  • 捕获InputMismatchException,处理非数字输入的情况,同时用scanner.next()清空错误输入,防止程序卡死;
  • 用null初始化minPrice,避免无有效输入时输出错误值。

二、修改代码支持String读取(商品名称+价格)

如果要读取商品名称(String)和对应价格,我们可以按行读取输入,分割名称和价格字段,同时处理格式错误。下面是实现代码:

import java.util.Scanner;
import java.util.InputMismatchException;

public class MinPriceWithName {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String minPriceItemName = null;
        Double minPrice = null;

        System.out.println("请输入商品名称和价格(格式:名称 价格,按Ctrl+D结束输入):");
        while (scanner.hasNextLine()) { // 按行读取输入
            String line = scanner.nextLine().trim();
            if (line.isEmpty()) continue; // 跳过空行

            // 按任意数量空格分割名称和价格
            String[] inputParts = line.split("\\s+");
            if (inputParts.length != 2) {
                System.out.println("⚠️ 警告:输入格式错误,请遵循「名称 价格」格式,已跳过该输入");
                continue;
            }

            try {
                double price = Double.parseDouble(inputParts[1]);
                // 更新最低价格和对应商品名称
                if (minPrice == null || price < minPrice) {
                    minPrice = price;
                    minPriceItemName = inputParts[0];
                }
            } catch (NumberFormatException e) {
                System.out.println("⚠️ 警告:价格不是有效数字,已跳过该输入");
            }
        }

        // 输出结果
        if (minPrice != null && minPriceItemName != null) {
            System.out.println("最低价格商品:" + minPriceItemName + ",价格:" + minPrice);
        } else {
            System.out.println("没有输入任何有效商品信息");
        }
        scanner.close();
    }
}

关键改进点:

  • 用scanner.hasNextLine()按行读取,适配“名称+价格”的输入格式;
  • 用split("\\s+")分割输入内容,支持多个空格分隔名称和价格;
  • 处理格式错误(比如输入字段不足2个)和价格非数字的情况,提升程序健壮性;
  • 记录最低价格对应的商品名称,输出更完整的结果。

三、测试示例(INPUT/OUTPUT格式)

数字读取测试

INPUT:
15.6
9.2
20.1
(按下Ctrl+D)
OUTPUT:
最低价格:9.2

商品名称+价格测试

INPUT:
牛奶 6.99
面包 4.5
鸡蛋 5.2
(按下Ctrl+D)
OUTPUT:
最低价格商品:面包,价格:4.5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:13:29