提问人:brain 提问时间:11/25/2022 更新时间:11/25/2022 访问量:38
使用 Scanner 接收输入时遇到的问题
A problem I encountered while using Scanner to receive input
问:
new Thread(() -> {
while (true){
Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
System.out.println("请输入要输出的文本:");
while (sc.hasNextLine()) {
builder.append(sc.nextLine());
}
System.out.println(builder.toString());
}
}).start();
我想继续在线程中输入,但是当我第一次打印字符串时,程序没有按照我 expected.as 的方式工作 在此处输入图像描述 程序不断重复,但它并没有停止我输入。 你能帮我解决这个问题吗?
我试图用一个关于hasNext()的重载方法改变输入流的终止符。
new Thread(() -> {
while (true){
Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
System.out.println("enter text information:");
while (!sc.hasNext("#")) {
builder.append(sc.nextLine());
}
System.out.println(builder.toString());
}
}).start();
这段代码的结果与我的目标一致,但我不想使用另一个终止符而不是默认终止符。我该怎么办? 请帮帮我,谢谢!
答:
Scanner 类中的 hasNextLine() 方法始终返回 true,因为控制台一直有输入。 在 while look 中添加一个条件以检查输入字符串是否为 null 或空将解决此问题。
new Thread(() -> {
Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
System.out.println("请输入要输出的文本:");
String input;
while ((input = sc.nextLine()) != null && !input.isEmpty()) {
builder.append(input);
}
System.out.println(builder);
}).start();
评论
Scanner
Imagine 返回 false。然后你的内在while循环结束,它打印的内容,然后..循环,因为你把整个东西都包装在一个 .这个循环使另一个 System.in 扫描器并做同样的事情 - 这将给出相同的结果(即:仍然没有另一行)。它会再次返回 false,瞧 - 你会得到你的无限循环。hasNextLine
builder
while (true)
我不知道你想用 outher 循环完成什么 - 你不需要 2 while 循环。外面的应该被删除。除非我遗漏了你打算做的事情,否则从代码或你的问题中都不明显。while (true)
从某种意义上说,你的替代方法“甚至更糟”,如果用户输入了一些空格,然后在任何其他时间都返回,而在其他任何时候都是假的,而不使用他们输入的任何内容。至少,它会永远继续返回 false,直到您通过某些调用实际消耗一些令牌。.hasNext("#")
true
#
.next()
通常,不要使用这些方法。只需调用适当的方法即可。如果你想处理无效的输入(例如,你要求一个,用户输入'hello',或者终止流中的标准),捕获异常并做出相应的反应。act-then-check-after优于check-first。hasX
.next
.nextInt()
评论
Scanner
Scanner