如何在未定义数组长度的 java 中获取输入?

How to take input in java where array length is not defined?

提问人:lsr 提问时间:7/6/2022 最后编辑:Topacolsr 更新时间:7/6/2022 访问量:279

问:

我的输入是这样的格式:

1 2 3 4 5 6
Alice

数组长度未知。 我是这样编码的:

import java.util.*;
public class Main
{
    public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        int i=0;
        while(sc.hasNext()){
            arr.add(sc.nextInt());
        }
        String player = sc.nextLine();
    }
}

但是我收到这个错误。

Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at Main.main(Main.java:17)

提前致谢。

数组列表 java.util.scanner inputMismatchException

评论

3赞 Jon Skeet 7/6/2022
提示:你是否通过代码进行了调试?它能走多远?您预计何时返回 false?hasNextLine()
0赞 lsr 7/6/2022
即使在阅读 6 之后,它也是一个无限循环。如何走出这个圈子?while
0赞 Jon Skeet 7/6/2022
我建议只阅读第一行作为一个整体,然后将其拆分为空格并分别解析每个部分。 很难“正确”使用。Scanner
0赞 lsr 7/6/2022
感谢您的回复 Jon Skeet。接受此类输入的最有效方法是什么?

答:

2赞 Kaan 7/6/2022 #1

您看到的原因是因为您在语句中提供了输入“Alice”,并且扫描程序告诉您它不知道如何将输入转换为 int(这是 nextInt() 的返回类型)。java.util.InputMismatchExceptionsc.nextInt()java.lang.String

下面是一个非常简单的示例,它重现了相同的行为:

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();

如果运行这两行并输入非整数,例如“d”,则会引发异常:

d
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at a91.main(a91.java:6)

要修复它,您需要替换为可以容忍非数字输入的东西,可能是 nextLine()。这是一个(非常)简单的例子,展示了它是如何工作的。请注意,这只是突出显示您正在询问的行为,即:如何解决。与原始程序一样,没有循环终止 - 它将永远运行(直到您退出程序)。nextInt()InputMismatchException

Scanner sc = new Scanner(System.in);
int x = sc.nextInt();

while (sc.hasNext()) {
    String s = sc.nextLine();
    System.out.println("got this: " + s);
}

1 2 3 4 5 6
got this:  2 3 4 5 6
Alice
got this: Alice

评论

0赞 lsr 7/6/2022
感谢您的回复。我想知道有没有办法终止循环。我尝试使用,但也没有帮助。接受这些输入的最佳方式是什么?sc.close()
0赞 Kaan 7/6/2022
回复:“接受这些输入的最佳方式是什么?”——你读过我的答案吗?回复:“我想知道有没有办法终止循环”——你发布的问题中在哪里提到过?如果你的问题是“我如何退出循环”,那么整个事情应该重写,使问题清晰,并删除任何关于数据类型、输入不匹配等的内容
0赞 lsr 7/6/2022
感谢您的详细回答@Kaan您的方法解决了我的问题。我只是想进一步知道是否有办法停止无限循环?否则我的疑问已经解决了。
0赞 Kaan 7/6/2022
“你的方法解决了我的问题”——好的,太好了。当有人发布解决您的问题的答案时,您应该投票并接受答案 _ 这让每个人都知道问题已得到解决。
0赞 Kaan 7/6/2022
若要退出循环,可以添加代码来检查特定值(可能是字符串“exit”),然后在看到该值时中断循环(使用 )。break
1赞 WJS 7/6/2022 #2

您应该使用 to 检查整数输入。一旦没有更多的整数,那么就用它来读取播放器。hasNextIntnext()

List<Integer> arr = new ArrayList<>();
Scanner sc = new Scanner(System.in);

while(sc.hasNextInt()){
    arr.add(sc.nextInt());
}
String player = sc.next();

arr.forEach(System.out::println);
System.out.println(player);

支持的示例输入

10 20 30 40 50 60 70
Alice

10 20 30 40
50 60 70 Alice

10 20 30
40
50
60 70 Alice

10 20 30
40 50
60 70
Alice

输出

10
20
30
40
50
60
70
Alice