Java中如何避免NZEC错误?输入读取问题求助
SPOJ NZEC错误修复:输入读取问题解决
问题描述
本地Eclipse中运行代码时控制台可正常读取输入,但提交至SPOJ后抛出NZEC错误,具体报错信息如下:
Exception in thread "main" java.lang.NumberFormatException: null
at java.base/java.lang.Long.parseLong(Long.java:662)
at java.base/java.lang.Long.valueOf(Long.java:1151)
at Main.main(Main.java:11)
输入格式要求:第一行是测试用例数,后续每行对应一个输入数值,需输出其下一个最近回文数(示例输入:
2 123 41
示例输出:
131 44
)
错误原因分析
核心问题在于重复创建BufferedReader实例:
- 代码中每次读取输入时都新建
BufferedReader(new InputStreamReader(System.in)),而System.in是全局唯一的输入流,多次创建Reader会导致流读取位置混乱,甚至在后续读取时返回null(当流被提前耗尽时),触发NumberFormatException。 - 另外,输出时混用
System.out.print和System.out.println,可能导致输出格式不符合SPOJ要求,间接引发NZEC错误。
修复方案
- 复用单个BufferedReader实例:全程只创建一次BufferedReader,所有输入读取都通过该实例完成,避免流读取冲突。
- 统一输出格式:所有结果都用
System.out.println输出,保证每行一个结果,符合SPOJ的输出规范。 - 增加空行处理:读取输入时跳过空行,避免因输入中的空行导致转换失败。
修复后的完整代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class NextPalindrome_SPOJ { public static void main(String[] args) throws IOException { // 只创建一次BufferedReader,复用读取所有输入 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 读取测试用例数,先处理空行 String tLine; while ((tLine = reader.readLine()) != null && tLine.trim().isEmpty()); int t = Integer.parseInt(tLine.trim()); while (t-- > 0) { // 读取每行输入,跳过空行 String numLine; while ((numLine = reader.readLine()) != null && numLine.trim().isEmpty()); if (numLine == null) break; // 防止意外的输入结束 long n = Long.parseLong(numLine.trim()); if (n < 9) { System.out.println(n + 1); } else { while (true) { n++; String numStr = String.valueOf(n); if (numStr.equals(new StringBuilder(numStr).reverse().toString())) { break; } } System.out.println(n); } } reader.close(); } }
关键优化点说明
- 单个BufferedReader实例确保输入流读取的连续性,不会出现读取到
null的情况。 - 增加空行跳过逻辑,兼容输入中可能存在的空白行,避免转换异常。
- 统一使用
println输出,保证每个结果单独占一行,符合SPOJ的输出格式要求。
内容的提问来源于stack exchange,提问作者Dhyan Prasad
相关产品推荐
相关产品推荐

