CodeChef提交Java题报NoSuchElementException 本地STS运行正常
CodeChef提交Java代码触发运行时错误排查
问题现象
代码在本地STS工作区运行完全正常,提交到CodeChef平台后在读取输入环节抛出运行时异常退出。
错误堆栈
Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Scanner.java:1540) at Codeche.main(Main.java:13)
原提交代码
/* package codechef; // don't place package name! */ import java.util.*; /* Name of the class has to be "Main" only if the class is public. */ class Codechef { public static void main (String[] args) { Scanner in=new Scanner(System.in); String S; int A,B,C; S=in.nextLine(); String arr[]=S.split(" "); A=Integer.parseInt(arr[0]); B=Integer.parseInt(arr[1]); C=Integer.parseInt(arr[2]); if(A>=1 && A<=10 && B>=1 && B<=10 && C>=1 && C<=10) { if(A==B || A==C || B==C) System.out.println("Yes"); else System.out.println("No"); in.close(); } } }
核心问题原因
- 输入读取方式与平台格式不匹配:
in.nextLine()强依赖输入中的换行符作为行结束标记。本地STS是交互输入模式,手动输入后按回车会自动生成换行符,能被正常读取;但CodeChef判题环境是非交互模式,部分测试用例的输入流无结尾换行、或行分隔符格式和交互输入不一致,调用nextLine()时因找不到有效可读取行触发NoSuchElementException。 - 类名不符合平台要求:CodeChef的Java判题规则要求,包含main方法的主类必须命名为
Main,当前代码的类名是Codechef,容易造成类加载、输入流绑定的隐性异常。 - 资源关闭逻辑不完整:原代码仅当三个输入值都落在1-10区间时才会关闭Scanner,其他分支下输入流未正常释放,部分平台环境下会触发读取异常。
适配平台的修改后代码
import java.util.*; // 按照平台要求将主类命名为Main class Main { public static void main (String[] args) { Scanner in = new Scanner(System.in); // 直接按token读取数值,不依赖换行符匹配 int A = in.nextInt(); int B = in.nextInt(); int C = in.nextInt(); // 统一在流程结束后通过finally块关闭资源 try { if(A>=1 && A<=10 && B>=1 && B<=10 && C>=1 && C<=10) { if(A==B || A==C || B==C) System.out.println("Yes"); else System.out.println("No"); } } finally { in.close(); } } }
说明:
nextInt()方法会自动按空白符(空格、换行、制表符)拆分读取输入的数值,不管测试用例的输入是单行空格分隔还是多行换行分隔,都能正确读取,不会触发换行符匹配的异常。
内容的提问来源于stack exchange,提问作者Siddhant Vatsyayan
相关产品推荐
相关产品推荐

