java中的扫描仪问题

java中的扫描仪问题,java,java.util.scanner,Java,Java.util.scanner,我的扫描仪怎么了?我也试着不把它放在一个循环中,但它不起作用。我希望用户输入一个选项,然后将服务器与选项一起打印出来 private static String getLogLocation(){ System.out.print("Please pick one (Dev, UAT, Lab, Sandbox): "); Scanner scan = new Scanner(System.in); String server = null; Boolean br

我的扫描仪怎么了?我也试着不把它放在一个循环中,但它不起作用。我希望用户输入一个选项,然后将服务器与选项一起打印出来

private static String getLogLocation(){
    System.out.print("Please pick one (Dev, UAT, Lab, Sandbox): ");
    Scanner scan = new Scanner(System.in);
    String server = null;
    Boolean breaking = true;
    String choice = scan.nextLine();

    while(scan.hasNext() && breaking){
        if(choice.equals("Dev")){
            server = "CNNDCPV02465.dcld.nndc.kp.org";
            breaking = false;
        }
        if(choice.equals("UAT")){
            server = "CNNDCPV02464.dcld.nndc.kp.org";
            breaking = false;
        }
        if(choice.equals("Lab")){
            server = "CNNDCBIPP242.nndc.kp.org";
            breaking = false;
        }
        if(choice.equals("Sandbox")){
            server = "CNNDCBIPP241.nndc.kp.org";
            breaking = false;
        }
    }
    System.out.println("Server" + server);
    return server;
}

代码中几乎没有问题

在上一个版本中,当存在下一个元素时,您将进行循环,但对于System.in,我们无法知道是否存在下一个元素,因为此流始终处于打开状态,因此有机会获取新数据,方法hasNext将等待新数据,或等待关闭此流的信号 在较新版本的代码中,每次调用此方法时,您都在创建扫描程序包装System.in,稍后您将关闭它,这意味着您也将关闭System.in,一旦关闭,您将无法再次读取它。 所以,不要每次都重新创建扫描仪,而是创建一次并将其传递给您的方法,如

private static String getLogLocation(Scanner scanner){
    ...
    String data = scanner.readLine();
    ...
    //scanner.close(); //DON'T do it in this method!!!
}
现在,关于循环,您可以创建如下内容:

Set<String> correctOptions = new HashSet<>(Arrays.asList("opt1", "opt2"));// and so on
String option = null;
do {
    System.out.print("select option: ");
    option = scanner.nextLine();
} while (!correctOptions.contains(option));
//here you are sure that selected option is correct
//handle it as you want.

它不起作用了怎么不起作用?我怀疑它工作得很好,只是不是您想要的方式。@Pshemo我输入一个输入,然后什么也没发生?即使我按了几次回车键,你的循环也不是循环结束时的无条件中断。您的代码与服务器值无关。按原样,用户按下enter键,代码退出。我去掉了循环,条件语句中仍然没有任何内容@Andreas@Ben不要中断,只需检查server==null。最后一个问题是您没有更新循环中的选项。因为您使用的是包含,所以您应该将correctOptions设置为一个集合。@Andreas是的,如果我们有很多选项,那么使用集合将是一个优化,但是在这个场景中,列表已经足够好了。是的,但是随着列表的增长,集合变得更加重要。最好养成在这样的模式中使用一个的习惯,你永远不必重新思考它。