有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java例外。util。NoSuchElementException:在java中找不到行。util。扫描仪。nextLine(Scanner.java:1585)

我一次又一次地提示用户输入,直到用户类型退出,在这种情况下,数据对象将被设置为null,并将离开循环。在大多数情况下,这段代码都是有效的,但有时我会在以下行中得到一个NoTouchElementException:。这往往发生在几个循环之后,而不是第一次通过。如果我在while循环的范围内声明reader变量,那么它将在第二个循环中失败

主要工作(有时抛出异常)

int level = 1;  
Scanner reader;
String selection = null;

while (true) {
    if (data.done) {
        level--;
    }

    data.done = false;
    System.out.println(getSubmenu(level, data));

    reader = new Scanner(System.in);

    if (level <6) {
        selection = reader.nextLine();
    } else {
        level = 4;
    }

    if (validSelection(selection)) {
        level = getLevel(level, selection);
        data = getData(level, data, selection);
    } else {
        System.out.println("Invalid entry");
    }

    if (data == null) {
        System.out.println("Level "+ level + "selection " + selection);
        break; // exit command was typed
    }
}
reader.close();

备用(在第二个循环中引发异常)

int level = 1;  
String selection = null;

while (true) {
    if (data.done) {
        level--;
    }

    data.done = false;
    System.out.println(getSubmenu(level, data));

    Scanner reader = new Scanner(System.in);

    if (level <6) {
        selection = reader.nextLine();
    } else {
        level = 4;
    }

    if (validSelection(selection)) {
        level = getLevel(level, selection);
        data = getData(level, data, selection);
    } else {
        System.out.println("Invalid entry");
    }

    if (data == null) {
        System.out.println("Level "+ level + "selection " + selection);
        break; // exit command was typed
    }
    reader.close();
}

堆栈跟踪

java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at org.functional.utils.Menu.run(ServerScripts.java:61)
at org.functional.utils.ServerScripts.main(ServerScripts.java:18)

我错过了什么


共 (1) 个答案

  1. # 1 楼答案

    在代码开头分配Scanner,而不是每次通过循环:

    int level = 1;  
    Scanner reader = new Scanner(System.in);
    String selection = null;
    
    while (true) {
        if (data.done) {
            level ;
        }
    
        data.done = false;
        System.out.println(getSubmenu(level, data));
    
        if (level <6) {
            selection = reader.nextLine();
        } else {
            level = 4;
        }
    
        if (validSelection(selection)) {
            level = getLevel(level, selection);
            data = getData(level, data, selection);
        } else {
            System.out.println("Invalid entry");
        }
    
        if (data == null) {
            System.out.println("Level "+ level + "selection " + selection);
            break; // exit command was typed
        }
    }
    reader.close();
    

    按照您的方式,在下一次循环迭代中,您创建的每个Scanner都是孤立的。没有一家被关闭。当从所有这些垃圾Scanner对象中消耗一些内部资源时,最有可能出现异常