在 IntelliJ 上运行代码时,我没有收到错误消息。但是,当我尝试交付我正在分配的代码时,两个测试用例都获得了NFE。我删除了所有代码,只让以下代码运行测试用例。这里的某个地方必须是NumberFormatException
。
public class Search {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
int[] list = new int[n];
String [] tokens = sc.nextLine().trim().split(" ");
for (int i=0; i<tokens.length;i++){
list[i]=Integer.parseInt(tokens[i]);
}
}
}
我阅读了有关双精度空格的信息,并用System.out.println(Arrays.asList(tokens).contains(""));
进行了检查
输出为假,因此这不是一个选择。如您所见,我已经在使用trim()
。
多谢您的协助。
路易斯
Eddit: 好吧,这里有些鱼。我添加了
System.out.println(Arrays.asList(tokens).contains(""));
System.out.println(Arrays.toString(tokens));
提交给我的代码,并将其交给测试用例。尽管IntelliJ会传递false和后面的整数数组,但测试用例将输出: 真正 [] 。 因此,你们都是对的,我只是错误地认为测试用例中的输入与作业中给出的示例输入类似。
Edit2:
好的! 我想到了。测试用例的输入与我的测试输入中的格式完全不同,看起来像这样:
10
8 8 9 12 110 111 117 186 298 321
2
8 13
我假设我包含的sc.nextLine()跳过了我创建列表所需的整数。 因此,实际的问题不是多余的空格或其他任何东西,仅仅是我通过使用sc.nextLine()超越了想要的输入。 给出我所需提示的答案,甚至我都不认为这是安德罗尼库斯提出的。 还是要感谢其他人。
答案 0 :(得分:2)
如果您知道将有一个整数作为输入,并且您不担心解析,为什么不使用它呢?
int input = sc.nextInt();
在解决方案中,您必须这样做:
Arrays.stream(sc.nextLine().trim().split(" ")).filter(s -> !s.matches("\\s")).toArray(String[]::new);
\\ or simplier
sc.nextLine().trim().split("\\s+")
答案 1 :(得分:2)
有许多可能的原因:
tokens
中有一个非数字-例如。 9 1! 3 x 3
... 9 3
您应该能够通过数字格式异常的文本来分辨。例如,在多个空格的情况下,您将获得:
线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“”
对于非数字(例如“ a”),您将得到:
线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“ a”
当然,有很多可能的解决方案,具体取决于遇到无效输入时要执行的操作(您会忽略它吗?抛出特殊异常?尝试去除非数字?)
当您知道输入由空格分隔,但是不知道有多少空格时,可以在split
命令中使用正则表达式来定位多个空格:
str.split("\\s+"); // splits on one or more whitespace including tabs, newlines, etc.
然后,要处理令牌列表中的非数字,可以在for循环中添加支票:
for(int i = 0; i < tokens.length; i++) {
if(tokens[i].matches("\\d+")) {
list[i] = Integer.parseInt(tokens[i]);
} else {
// Handle error case for non-digit input
}
}
答案 2 :(得分:0)
请为此修改您的代码:
select t.*
from t
where t.lvl = (select max(t2.lvl) from t t2 where t2.kid = t.kid);
控制台输入:
public class Example {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter the size of the array : ");
int n = sc.nextInt();
sc.nextLine();
int[] list = new int[n];
System.out.println("Enter a string : ");
/** This regex will work for string having more than one space. */
String trimmedToken = sc.nextLine().replaceAll("\\s+", " ");
String[] tokens = trimmedToken.split(" ");
for (int i = 0; i < tokens.length; i++) {
list[i] = Integer.parseInt(tokens[i]);
System.out.println(list[i]);
}
sc.close();
}
}
输出:
Enter the size of the array :
5
Enter a string :
1 2 3 4 5