Java 为什么扫描程序无法识别用户输入 [duplicate]

Java Why Scanner doesn't recognise user input [duplicate]

提问人:Edmunds Beks 提问时间:3/27/2022 最后编辑:roksuiEdmunds Beks 更新时间:3/27/2022 访问量:67

问:

我编写了一个函数来接收用户输入。无法得到正确的答案。总是失败。我现在失去了理智。

public String getChoice() {
    Scanner SC = new Scanner(System.in); 
    System.out.print("Ready to play? (Y/N) ");
    String playChoice = SC.next();    // Input Y or N
    playChoice = playChoice.replace("\n", "");
    System.out.println("Input length is: " + playChoice.length());
    System.out.println(playChoice);
    if (playChoice == "N") {
        SC.close();
        return "Success N";
    }
    else if (playChoice == "Y") {
        SC.close();
        return "Success Y";
    }
    SC.close();
    return "Failure"; // Always this one works
}
java java.util.scanner 用户输入

评论


答:

2赞 Bialomazur 3/27/2022 #1

试试这个:

 public String getChoice() {
        Scanner SC = new Scanner(System.in);
        System.out.print("Ready to play? (Y/N) ");
        String playChoice = SC.next();    // Input Y or N
        playChoice = playChoice.replace("\n", "");
        if (playChoice.equals("N")) { // Replace operator '==' with 'equals()' method.
            SC.close();
            return "Success N";
        } else if (playChoice.equals("Y")) { // Same here.
            SC.close();
            return "Success Y";
        }
        SC.close();
        return "Failure"; // Always this one works
    }

代码未按预期工作的原因是运算符比较了 2 个比较对象引用是否指向同一对象。在您的 if 语句中显然不是这种情况,因此这些表达式的计算结果始终为 。==false

另一方面,该方法实际上比较了给定对象的内容,从而提供了所需的结果。equals()

0赞 eternal 3/27/2022 #2

@Bialomazur已经给出了一个解释,这里有一些更简洁的代码和提示。

实际上,关闭扫描仪不是一个好的做法,但如果您决定这样做,您可以在一个地方关闭它,因为您不再使用扫描仪了。 另外,这里的开关看起来更好

public String getChoice() {
    Scanner SC = new Scanner(System.in);
    System.out.print("Ready to play? (Y/N) ");
    String playChoice = SC.next();    // Input Y or N
    playChoice = playChoice.replace("\n", "");
    System.out.println("Input length is: " + playChoice.length());
    System.out.println(playChoice);
    SC.close();
    switch (playChoice) {
        case "Y":
            return "Success Y";
        case "N":
            return "Success N";
        default:
            return "Failure";
    }
}