gpt4 book ai didi

java - 扫描仪连续循环

转载 作者:行者123 更新时间:2023-11-29 06:56:11 24 4
gpt4 key购买 nike

为什么我的 inputScanner 在第一次输入后没有阻塞?它进入一个连续的循环。忽略此代码的其他细节。

public class Test {
public static void main(String[] args) {

boolean finished;

do {
Scanner inputScanner = new Scanner(System.in);
finished = inputScanner.hasNext("exit");
boolean validNumber = inputScanner.hasNextDouble();
if (validNumber) {
double number = inputScanner.nextDouble();

System.out.print(number);
} else if (!finished) {
System.out.println("Please try again.");
}
inputScanner.close();
} while (!finished);
}
}

编辑: 在之前的一篇与此相关的帖子中,提到“因此,如果您稍后要使用 System.in,请不要关闭它(如果它已关闭,我们可以'重新打开它并从中读取任何数据,因此异常)”。为什么会这样?

最佳答案

Why isn't my inputScanner blocking after the first input?

因为每次进入循环时都会创建一个新的 Scanner,所以第一次迭代与第二次及以后的迭代中的对象不同

public class Test {
public static void main(String[] args) {

boolean finished;

do {
Scanner inputScanner = new Scanner(System.in); //Here you're making a new instance of inputScanner each time you come to this line after the do-while loop ends.
finished = inputScanner.hasNext("exit");
boolean validNumber = inputScanner.hasNextDouble();
if (validNumber) {
double number = inputScanner.nextDouble();

System.out.print(number);
} else if (!finished) {
System.out.println("Please try again.");
}
inputScanner.close();
} while (!finished);
}
}

如果您希望它被“阻止”或“关闭”,则将此行移到 do { 行之前。

Scanner inputScanner = new Scanner(System.in);

第二个问题:

So if you are going use System.in later don't close it (if it is closed, we can't reopen it and read any data from it, hence exception)

来自 Oracle's docs :

"Attempting to perform search operations after a scanner has been closed will result in an IllegalStateException"

这就像试图让死人做某事一样,就像僵尸一样! (Java 讨厌僵尸!)D:

但是你没有得到那个 IllegalStateException 因为正如我在回答你的第一个问题时所说的那样,每次你进入 do-while 循环。

编辑

为什么不能重新打开它?同样来自 Oracle 的文档:

When a Scanner is closed, it will close its input source if the source implements the Closeable interface.

因此 inputScanner.close() 关闭 System.in.

并且由于 OutputStream 关​​闭的一般契约(Contract)(在 this answer 的帮助下):

public void close() throws IOException --> 关闭此输入流并释放与此流关联的任何系统资源。 close 的一般契约是关闭输入流。关闭的流无法执行输入操作并且无法重新打开。

关于java - 扫描仪连续循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33552505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com