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
相关产品推荐
相关产品推荐

