Java 的 Scanner 有问题,可能是 .close() 函数

Java having problems with Scanner, probably .close() function

提问人:Veerand 提问时间:7/4/2022 最后编辑:Mark RotteveelVeerand 更新时间:7/4/2022 访问量:77

问:

我想做一个简单的循环,只有当用户选择退出时才会结束。我在使用 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)
Java 循环 java.util.scanner

评论

0赞 tgdavies 7/4/2022
完全不要关闭扫描仪。
0赞 Veerand 7/4/2022
但是当我这样做时,在第二个循环中,即使我选择了退出,它仍然通过 while 循环
0赞 tgdavies 7/4/2022
使用调试器单步执行代码。

答:

0赞 year 7/4/2022 #1

您的第二个循环将扫描仪关闭在第一个循环中,仅使用一个扫描仪

评论

0赞 Community 7/4/2022
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 Chaosfire 7/4/2022 #2

问题的根源是.不要那样做,你的程序会重新开始,你已经设法做了一些类似隐藏递归的事情,流程变得一团糟。只需使用 while 循环即可。使用调试器逐步执行代码,以更好地了解实际发生的情况及其发生的原因。main(null);

此外,根据经验,不要关闭扫描仪或任何从 .这也会关闭基础流,并且您不想关闭 。这会导致您看到的异常,尽管这不是根本问题。System.inSystem.in

评论

0赞 Veerand 7/4/2022
啊,好吧,所以使用 main() 可以进行递归。我明白了,谢谢。