Java 在循环中创建扫描仪对象时,关闭该对象的正确时间是什么?

Java 在循环中创建扫描仪对象时,关闭该对象的正确时间是什么?,java,reference,java.util.scanner,Java,Reference,Java.util.scanner,我正在编写一个程序,要求用户通过在控制台中输入从菜单中进行选择 我不熟悉stackoverflow和java,并且尽可能具体地安全使用它。所以如果你觉得冗长,请原谅 我在提示下用enter“B”测试了代码,情况是第一次迭代很好,但当第二次迭代时,程序不再阻止输入,并在控制台中给出以下错误消息(您可以在带有星号的注释后找到生成错误的位置): 在我删除行reader.close()后,程序运行正常 我认为一个可能的原因可能是: 如果我执行了reader.close(),则我创建的每个扫描仪对象都将被

我正在编写一个程序,要求用户通过在控制台中输入从菜单中进行选择

我不熟悉stackoverflow和java,并且尽可能具体地安全使用它。所以如果你觉得冗长,请原谅

我在提示下用enter“B”测试了代码,情况是第一次迭代很好,但当第二次迭代时,程序不再阻止输入,并在控制台中给出以下错误消息(您可以在带有星号的注释后找到生成错误的位置):

在我删除行
reader.close()
后,程序运行正常

我认为一个可能的原因可能是: 如果我执行了
reader.close()
,则我创建的每个扫描仪对象都将被视为已关闭


如果有人能在这方面帮助我,我将不胜感激。请指出我在提问时是否犯了一些错误。

扫描仪的创建移到循环之外,然后关闭。因此,您可以在每次迭代中重用相同的对象

Scanner reader = new Scanner(System.in);
String choice;
boolean stopAsking = false;
while (!stopAsking) {
    // print menu
    // read data

    choice = reader.next().toUpperCase();

    // switch block with stopAsking = true;
}
reader.close();

您应该在循环之前创建
扫描仪
,以便每次需要获取用户输入时都可以简单地使用相同的对象


另外,
Scanner(System.in)
对象不需要是
close()
d,也不应该是,因为
close()
也将关闭
System.in
流。在使用
扫描仪(System.in)
时,只需忘记
close()
,您就会没事了。有关更多信息,请检查答案。

哦,我忘了指出,如果控件属于
默认值
情况,则
reader.close()
也将呈现相同的错误。您应该在循环之前创建
扫描仪
,这样,每次需要用户输入时,您都可以简单地使用相同的对象。@zenith,谢谢。试过了,效果不错。我只是想了解创建多个具有相同名称的引用变量的对象的结果是什么?以前创建的垃圾是否由垃圾收集自动处理?如果是这种情况,为什么新创建的(也是唯一的)扫描仪对象会导致错误?您不需要(也可能不应该)
close()
a
Scanner(System.in)
。请参阅答案以获得解释。是的,旧的部分只是在某个时候被垃圾收集删除。谢谢,它很有效。但是,我仍然想了解使用相同名称的引用变量创建多个对象的结果是什么?以前创建的垃圾是否由垃圾收集自动处理?如果是这种情况,为什么I.close()一个新创建的(也是唯一的)Scanner对象会导致错误?
Scanner reader = new Scanner(System.in);
String choice;
boolean stopAsking = false;
while (!stopAsking) {
    // print menu
    // read data

    choice = reader.next().toUpperCase();

    // switch block with stopAsking = true;
}
reader.close();