提问人:Veerand 提问时间:7/4/2022 最后编辑:Mark RotteveelVeerand 更新时间:7/4/2022 访问量:77
Java 的 Scanner 有问题,可能是 .close() 函数
Java having problems with Scanner, probably .close() function
问:
我想做一个简单的循环,只有当用户选择退出时才会结束。我在使用 Scanner 时遇到了问题,我无法真正确定它,但我认为它可能是 .close() 函数。我试图将 .close() 几乎放在任何地方,但错误仍然存在。我还试图删除 .close(),但即使我选择了 Quit,它也会继续循环。
import java.util.Scanner;
public class CipherServiceTest {
static String keysquare;
public static void main(String args[]) {
System.setProperty("key.square","alpha"); //default key.square
keysquare = System.getProperty("key.square");
WhatToDo();
}
static void WhatToDo() {
int choice=0, datatype=0;
Scanner scan = new Scanner(System.in);
CipherServiceImpl cs = new CipherServiceImpl();
System.out.println("1. Encrypt a file");
System.out.println("2. Decrypt a file");
System.out.println("3. Quit");
System.out.print("What do you want to do(1/2/3): ");
choice = scan.nextInt();
while(choice != 3) {
System.out.println("1. Alpha");
System.out.println("2. Binary");
System.out.print("Choose data type(1/2): ");
datatype = scan.nextInt();
if (choice==1) {
if (datatype == 1) {
System.setProperty("key.square","alpha"); //default key.square
keysquare = System.getProperty("key.square");
cs.encrypt( );
}
else if (datatype ==2) {
System.setProperty("key.square","binary");
keysquare = System.getProperty("key.square");
cs.encrypt();
}
else {
System.out.println("Wrong Input");
//main(null);
}
}
else if (choice==2) {
if (datatype == 1) {
System.setProperty("key.square","alpha"); //default key.square
keysquare = System.getProperty("key.square");
cs.decrypt();
}
else if (datatype == 2) {
System.setProperty("key.square","binary");
keysquare = System.getProperty("key.square");
cs.decrypt();
}
else {
System.out.println("Wrong Input");
//main(null);
}
}
else{
System.out.println("Wrong Input");
//main(null);
}
//scan1.close();
main(null);
}
scan.close();
}
}
这就是控制台中发生的情况。当我选择退出时,会出现错误。我尝试选择退出作为第一个选项,它确实有效,但问题出现在第二个循环中。
1. Encrypt a file
2. Decrypt a file
3. Quit
What do you want to do(1/2/3): 1
1. Alpha
2. Binary
Choose data type(1/2): 1
Open the message file
laih wdi
Open the key file
tae
1. Encrypt a file
2. Decrypt a file
3. Quit
What do you want to do(1/2/3): 3
1. Alpha
2. Binary
Choose data type(1/2): Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
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 CipherServiceTest.WhatToDo(CipherServiceTest.java:27)
at CipherServiceTest.main(CipherServiceTest.java:9)
答:
0赞
year
7/4/2022
#1
您的第二个循环将扫描仪关闭在第一个循环中,仅使用一个扫描仪
评论
1赞
Chaosfire
7/4/2022
#2
问题的根源是.不要那样做,你的程序会重新开始,你已经设法做了一些类似隐藏递归的事情,流程变得一团糟。只需使用 while 循环即可。使用调试器逐步执行代码,以更好地了解实际发生的情况及其发生的原因。main(null);
此外,根据经验,不要关闭扫描仪或任何从 .这也会关闭基础流,并且您不想关闭 。这会导致您看到的异常,尽管这不是根本问题。System.in
System.in
评论
0赞
Veerand
7/4/2022
啊,好吧,所以使用 main() 可以进行递归。我明白了,谢谢。
评论