Java输入输出处理问题:Hackerrank测试用例未通过
问题分析与解决方案
看起来你在处理Scanner输入的时候踩了Java初学者常见的坑!你的代码读取顺序和Scanner方法的特性不匹配,导致无法正确获取输入内容,所以通不过测试用例。
错误原因
你当前的代码先调用了s.nextLine(),这会直接把整行输入(包括整数、双精度数和字符串)全部读走,后面的nextInt()/nextDouble()就没有输入可以读取了,自然会抛出异常或者读取失败。就算你调整顺序先读整数和双精度,也会遇到另一个问题:nextInt()和nextDouble()只会读取对应类型的内容,不会消耗掉输入行末尾的换行符,这时候紧接着调用nextLine()会读取到一个空字符串,而不是你需要的完整文本。
正确的代码实现
这里给你两种可行的方案:
方案1:先读取基本类型,再处理换行符后读取字符串
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner s = new Scanner(System.in); // 先读取整数和双精度浮点数 int i = s.nextInt(); double d = s.nextDouble(); // 消耗掉整数和双精度数后面的换行符,避免后续nextLine读空 s.nextLine(); // 读取包含空格的完整字符串 String str = s.nextLine(); // 按照题目要求的格式输出 System.out.println("String: " + str); System.out.println("Double: " + d); System.out.println("Int: " + i); s.close(); } }
方案2:一次性读取整行,再拆分处理(适合输入格式固定的场景)
如果你确定输入是一行内的三个部分,也可以先读取整行,再拆分解析:
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner s = new Scanner(System.in); String fullLine = s.nextLine(); // 拆分字符串:最多拆成3部分,确保第三个部分保留所有空格 String[] parts = fullLine.split(" ", 3); int i = Integer.parseInt(parts[0]); double d = Double.parseDouble(parts[1]); String str = parts[2]; // 输出结果 System.out.println("String: " + str); System.out.println("Double: " + d); System.out.println("Int: " + i); s.close(); } }
关键知识点提醒
nextInt()/nextDouble():只读取对应类型的数值,会跳过前面的空白,但不会处理末尾的换行符。nextLine():读取从当前位置到换行符的所有内容(包括空格),并且会消耗掉换行符。split(" ", 3):第二个参数3表示最多拆分3部分,这样第三个部分会完整保留原输入中的空格,正好匹配题目要求的字符串输入。
内容的提问来源于stack exchange,提问作者Anurag Chhabra
相关产品推荐
相关产品推荐

