我正在使用Java进行一些测试来计算菜单驱动的控制台应用程序。
我有这段代码:
public class TestClass {
public static void main(String[] args) {
int option = 99;
do{
System.out.println("1. one");
System.out.println("2. two");
System.out.println("3. three");
System.out.println("0. END");
Scanner scan = new Scanner(System.in);
System.out.println("option : ");
option=Integer.parseInt(scan.next());
scan.close();
switch (option) {
case 0 :
System.exit(0);
break;
case 1 :
caseOne();
break;
case 2 :
caseTwo();
break;
case 3 :
caseThree();
break;
default :
break;
}
} while (option!=0);
}
private static void caseOne(){
System.out.println("Case ONE");
}
private static void caseTwo(){
System.out.println("Case TWO");
}
private static void caseThree(){
System.out.println("Case THREE");
}
}
当我运行它时效果很好。 我选择了一个选项并打印出" CASE X"。
奇怪的行为是DO循环重新开始的时候。 它再次显示菜单,但程序立即终止显示NoSuchElementException异常。 奇怪的是它既没有等我输入数字。
如果删除
scan.close();
声明它确实工作正常但编译器警告我内存泄漏,因为扫描永远不会关闭。
它表现得非常奇怪,因为在第一次通过"即使使用te scan.close(),一切都很好,但是在#34;第二遍"即使我正在创建一个新的Scanner对象,它也会崩溃,所以我认为它至少要求输入。
我真的对此感到困惑。
有什么建议吗?
答案 0 :(得分:0)
如果您要关闭scanner
,它也会关闭包裹input stream
,这样您就可以在完成所有工作后关闭扫描。
scan.close();
将它放在do-while
循环之后。
答案 1 :(得分:0)
这里有更好的方法来实现它
public static void main(String[] args) {
int option = 99;
do{
System.out.println("1. one");
System.out.println("2. two");
System.out.println("3. three");
System.out.println("0. END");
Scanner scan = new Scanner(System.in);
System.out.println("option : ");
option= scan.nextInt();
switch (option) {
case 0 :
System.exit(0);
break;
case 1 :
caseOne();
break;
case 2 :
caseTwo();
break;
case 3 :
caseThree();
break;
default :
scan.close();
break;
}
} while (option!=0);
}