问题来源
今天写一个很简单的题目,所有自测用例都通过,提交后却直接报错,部分代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
//获取第一行输入的一个正整数
int n = Integer.parseInt(sc.nextLine());
//获取第二行的多个输入项
String[] arr = sc.nextLine().split(" ");
//判断输入长度是否符合要求
if(arr.length == n) {
int count = 0;
int num = 0;
for(int i = 0; i < arr.length; i++) {
//todo
}
System.out.println(count);
System.out.println(num);
}
}
}
}
报错信息如下:
请检查是否存在数组越界等非法访问情况
Exception in thread "main" java.lang.NumberFormatException: For input string: "10 "
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Main.main(Main.java:7)
一开始,我以为是int n = Integer.parseInt(sc.nextLine());
这行代码,将String类型转换成int类型,长度不够导致的,于是将int改为换成long,再次提交,报错依旧。
看报错信息,提示是输入了"10"导致,而自测用例中有输入为"10"的用例,并且能通过,这让人很纳闷。
索性将报错信息中的提示输入拷贝出来,放到测试用例中,然后复现了出来。
原来报错信息中提到的输入是"10 ",即10 + " "的组合体,并不是单纯的数字10。因此才不能将该字符串转换成对应的整数。
解决方法
- 利用String类中的trim()方法,将字符串末尾的空格去掉后再转成对应整数
将原来的
int n = Integer.parseInt(sc.nextLine());
替换成
int n = Integer.parseInt(sc.nextLine().trim());
- 既然报错那行代码的目标是得到一个整型数字,那么就直接获取整型数字,不要再做转换
将原来的
int n = Integer.parseInt(sc.nextLine());
替换成
int n = sc.nextInt();
String newString = sc.nextLine();//此行作用是处理掉输入整数后的换行符
以上两种方法,针对本文遇到的问题,亲测有效。