为何同一Java代码在VS Code运行正常,HackerRank却报运行时错误?
解决HackerRank Java输出格式化题的运行时错误
错误原因分析
- 循环次数错误:你的循环写的是
for(i=0;i<=3;i++),会执行4次输入读取,但题目要求处理3组输入,多余的一次读取会导致输入耗尽,抛出NoSuchElementException,这就是运行时错误的核心原因。 - 输入读取逻辑问题:
nextInt()读取整数后,缓冲区会残留换行符,后续的nextLine()会读取这个空字符串,导致s1为空,进而引发字符串长度计算异常或后续读取错误。 - 条件判断顺序错误:
x<100的判断在x<10前面,导致所有小于100的数都会进入第一个分支,包括小于10的数,无法正确补两个前导零。 - 空格生成逻辑错误:初始
space是一个空格,再加上j<=15-s1.length()的循环,会生成远超所需的空格,导致字符串总长度超过15位。 - 多余输出内容:题目要求不需要输出
================================分隔线,也不需要额外的换行符(println本身会自动换行),这些多余内容会直接导致答案错误。
修正后的代码(推荐用格式化输出)
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 处理3组输入,循环3次 for (int i = 0; i < 3; i++) { // 用next()读取不含空格的字符串,避免换行符干扰 String s = scanner.next(); int num = scanner.nextInt(); // 直接用格式化语法实现需求,无需手动拼接 System.out.printf("%-15s%03d%n", s, num); } scanner.close(); } }
关键修正点说明
- 循环次数:改为
i < 3,确保只读取3组输入,避免输入耗尽的异常。 - 输入读取:使用
next()读取字符串(题目中字符串不含空格),无需额外调用nextLine()处理换行符。 - 格式化输出:利用
printf的语法快速实现要求:%-15s:左对齐字符串,占15位,不足部分自动补空格%03d:整数占3位,不足部分自动补前导零%n:平台无关的换行符,替代手动添加的\n
- 清理冗余内容:删除了不必要的分隔线和额外换行,完全符合题目输出格式要求。
手动拼接实现(不用printf的版本)
如果需要手动实现拼接逻辑,修正后的代码如下:
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); for (int i = 0; i < 3; i++) { String s = scanner.next(); int num = scanner.nextInt(); // 生成刚好足够的空格:15减去字符串长度 StringBuilder space = new StringBuilder(); int spaceCount = 15 - s.length(); for (int j = 0; j < spaceCount; j++) { space.append(" "); } // 按数值大小补零 String numStr; if (num < 10) { numStr = "00" + num; } else if (num < 100) { numStr = "0" + num; } else { numStr = String.valueOf(num); } System.out.println(s + space + numStr); } scanner.close(); } }
内容的提问来源于stack exchange,提问作者Ebram Shereen
相关产品推荐
相关产品推荐

