繁体   English   中英

在循环中正确使用java.util.scanner吗?

[英]Correct use of java.util.scanner in a loop?

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)处找不到线。家用处的MainMenu。(MainMenu.java:26)处没有线。 .java:7)

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

您在MainMenu构造函数中拥有完整的代码,在其中通过调用menuIn.close();关闭扫描仪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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM