【问题标题】:Java code not waiting for input at scanner [duplicate]Java代码不等待扫描仪输入[重复]
【发布时间】:2014-04-02 02:30:13
【问题描述】:

我正在使用 Eclipse 和 JDK 8 创建一个用 Java 编写的程序。我使用以下代码创建了一个 ScannerScanner input = new Scanner(System.in);

然后我使用代码String command = "no"; 创建了一个String

我计划在我的代码中使用这个字符串来控制while 循环,以及while 循环中的switch。循环以:while(command = "no") 开始,在while 循环中,我使用之前创建的Scanner 让用户定义Stringint 的值,在执行代码时,作品。之后(但仍在while循环内,我将command = input.nextLine();,后跟input.close();放在下一行,设置command字符串的值,并关闭Scanner。但是当我执行代码,它似乎跳过了那个,以及我直接放在后面的switch(它也应该由command字符串控制),然后在while循环之后继续编码,即使@987654341 @ 仍设置为“否”,这应该会使 while 循环重新开始。

如何让代码暂停并等待在command = input.nextLine(); 输入内容,以及如何让switch 正常工作?

这是完整的代码:

`import java.util.Scanner;

class Human {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        String name = this.name;
        return name;
    }

    public int getAge() {
        int age = this.age;
        return age;
    }
}

public class Asdfghjkl {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);

        String command = "no";

        int age;
        String name;

        while(command == "no") {
            System.out.println("Welcome to HUMAN CREATOR");
            System.out.println("What is the human's name?");
            name = input.nextLine();
            System.out.println("Okay, its name is " + name + ".");

            System.out.println("What about its age?");
            age = input.nextInt();
            System.out.println(name + " is " + age + " years old.");
            System.out.println("Is this correct?");
            command = input.nextLine();

            switch (command) {
            case ("yes"):
                System.out.println("Great! Lets make the human!");
                Human h1 = new Human();
                h1.setAge(age);
                h1.setName(name);

            case ("no"):
                System.out.println("Okay, lets start again.");
            }
        }
        System.out.println("qwerty");
            input.close();
    }
}

【问题讨论】:

  • 你使用的是 java 6 还是 java 7?
  • @HovercraftFullOfEels 只回答了我一半的问题……我该如何解决scanner 不起作用的问题?我尝试了.equals 而不是==,但它似乎没有用
  • @newuser:看起来它必须是 7,否则它不应该编译。
  • @HovercraftFullOfEels 只回答了我的一半问题......我该如何解决scanner 不起作用的问题?我尝试了.equals 而不是==,但它似乎没有用
  • 用户:您似乎正在关闭 Scanner 变量、输入、while 循环的 inside,在您完成使用它之前问题,为什么?在while循环之后关闭它不是更有意义吗,以便它在循环的每次迭代中仍然可用?

标签: java while-loop switch-statement java.util.scanner


【解决方案1】:

改变你的:

age = input.nextInt();

给一个:

age = Integer.parseInt(input.nextLine());

“nextInt()”无法正常工作的原因是它在队列中留下了一个空白空间,该空间在下一个“nextLine()”被挑选出来

此外,在比较两个字符串时,您应该始终使用 .equals("some string")。

我希望这能修复你的错误:)

正如“Hovercraft Full Of Eels”所指出的,如果您确实需要重复 while 循环,扫描仪将被关闭,因此会导致错误。

【讨论】:

    【解决方案2】:
    while(command.equals("no"))
    

    而不是

    while(command == "no")
    

    还有case ("yes"):末尾没有break;语句,所以它也会继续下一个案例。

    Scanner#nextInt 方法不会读取您输入的最后一个换行符 - here

    【讨论】:

    【解决方案3】:

    while(command == "no") 也不会像您期望的那样工作,因为您测试字符串的相等性。执行此操作时,您需要使用 .equals 来测试字符串值是否相等。

    所以使用:

    while(command.equals("no"))

    【讨论】:

    • 不幸的是,这并没有解决任何问题......
    【解决方案4】:

    您似乎还关闭了 Scanner 变量、输入、inside while 循环,然后再使用它。

    while(!command.equalsIgnoreCase("yes")) {
        System.out.println("Welcome to HUMAN CREATOR");
        System.out.println("What is the human's name?");
        name = input.nextLine();
        System.out.println("Okay, its name is " + name + ".");
    
        System.out.println("What about its age?");
        age = input.nextInt();
        System.out.println(name + " is " + age + " years old.");
        System.out.println("Is this correct?");
        command = input.nextLine();
        input.close();   // !! ************ here *****
    
        switch (command) {
        case ("yes"):
            System.out.println("Great! Lets make the human!");
            Human h1 = new Human();
            h1.setAge(age);
            h1.setName(name);
    
        case ("no"):
            System.out.println("Okay, lets start again.");
        }
    }
    

    在while循环之后关闭它不是更有意义吗,以便它在循环的每次迭代中仍然可用?

    在获得input.nextInt() 后,还要添加一个额外的input.nextLine(); 以捕获行尾标记:

    age = input.nextInt();
    input.nextLine();
    

    【讨论】:

      【解决方案5】:

      试试这个:while(command.equals("no"))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多