报错信息:
Exception in thread "main" java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:592) at java.lang.Integer.parseInt(Integer.java:615) at Main.main(Main.java:11)
分析:
这个异常通常表示尝试将一个空字符串或者不能转换为数字的字符串转换为整数。在你的代码中,这个异常可能是由于 split()
方法产生的空字符串元素导致的,尝试将空字符串转换为整数时抛出异常。
出现了前面提到的异常。这是因为 Scanner.nextLine()
方法在读取完第一个整数后,读取到输入行中的换行符,然后将其读取为一个空字符串,导致数组中的第一个元素为空字符串。当 Integer.parseInt()
方法尝试将空字符串转换为整数时,抛出 NumberFormatException
异常。
为了解决这个问题,你可以在调用 Scanner.nextInt()
后添加一个额外的 Scanner.nextLine()
方法调用,以消耗输入行中的换行符。这样,在下一次调用 Scanner.nextLine()
方法时,它将读取到输入行中的第二行,而不是空字符串。
修改之后的代码:
import java.util.*;
class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine(); // 消耗输入行中的换行符
String[] scores = new String[n];
scores = sc.nextLine().split(" ");
int target = sc.nextInt();
int count = 0;
for(String score : scores){
if(target == Integer.parseInt(score)){
count++;
}
}
System.out.print(count);
}
}
在这段代码中,当使用 Scanner.nextInt()
方法读取第一个整数后,输入流中可能会留下一个换行符('\n'
)的字符,这是因为你按下回车键以确认第一个整数。当你尝试使用 Scanner.nextLine()
方法读取第二行输入时,它会读取输入行中留下的那个换行符('\n'
)字符,并将其解释为一个空字符串。因此,如果你直接调用 Scanner.nextLine().split(" ")
方法来拆分第二行输入,数组的第一个元素可能会是一个空字符串。
为了避免这个问题,可以在调用 Scanner.nextInt()
方法后,再调用一个额外的 Scanner.nextLine()
方法,以消耗掉那个换行符字符。这样,Scanner.nextLine()
方法就会从输入流中读取下一行,而不是解释留在输入流中的换行符字符。这个额外的 Scanner.nextLine()
调用不会将任何文本添加到数组中。它只是用来清除输入流中留下的那个换行符字符。