【问题标题】:Correct use of java.util.scanner in a loop?在循环中正确使用 java.util.scanner?
【发布时间】:2023-03-21 19:45:01
【问题描述】:
import java.util.Scanner;

public class MainMenu {

    public MainMenu(){

        int x = 1;
        Scanner menuIn = new Scanner(System.in);

        while ( x == 1 ){

            String pick = "0";

            System.out.println("--==  Household Admin v1.0 ==--");
            System.out.println("(A)dd Resident");
            System.out.println("(R)emove Resident");
            System.out.println("(L)ist Resident(s)");

            System.out.println("pick = " + pick);

            System.out.print("#: ");

            pick = menuIn.nextLine();

            System.out.println("pick = " + pick);

            switch (pick) {
                case "A":
                case "a":
                        Resident.residentList.add( Resident.newResident() );
                        break;
                case "R":
                case "r":
                        break;
                case "L":
                case "l":
                        break;
                case "Q":
                case "q":
                        x = 0;
                        break;
                default:
                        System.out.println("WRONG! Try again.");
                        break;
            }
        }
        menuIn.close();
    }
}

第一次通过循环,一切都按预期工作。第二次通过我得到的循环:

线程“主”java.util.NoSuchElementException 中的异常:未找到行 在 java.util.Scanner.nextLine(Scanner.java:1540) 在 home.MainMenu.(MainMenu.java:26) 在 home.MyFirstGame.main(MyFirstGame.java:7)

我不确定如何“重置”扫描仪对象以便能够再次重复使用它。

【问题讨论】:

  • 不相关,但只需在您的 while 循环中使用 true 作为条件。
  • 我不想这样做,因为我想给一个开关选项退出。
  • 你总是可以使用System.exit(0)
  • 在做pick = menuIn.nextLine();之前检查if(menuIn.hasNextLine())

标签: java


【解决方案1】:

您的整个代码在MainMenu 的构造函数中,您通过调用menuIn.close(); 来关闭扫描仪,这是根本原因。

您似乎正在从MyFirstGame 中的main 方法创建MainMenu 的新实例。现在,如果您在扫描仪对象上调用 .close(),它会关闭底层流。所以你的第一个对象被成功创建。但是当您尝试实例化 MainMenu 的第二个对象时,您会收到此异常,因为 System.in 流已关闭。

理想情况下,您应该使用单个扫描仪对象来读取用户输入。无需每次在构造函数中创建新的扫描仪对象,只需在 main 方法中创建一个扫描仪对象并将其作为参数传递给构造函数。如下所示。

MyFirstGame.main

Scanner menuIn = new Scanner(System.in);
MainMenu mainMenu1= new MainMenu(menuIn);
MainMenu mainMenu2= new MainMenu(menuIn);
//.... and So on

//and close scanner object here once you have created all reaquired object.
menuIn .close();

在你的 MainMenu 中将构造函数更改为

public MainMenu(Scanner menuIn ){    

并从构造函数中删除以下行

//Scanner menuIn = new Scanner(System.in);
//menuIn.close();

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多