为什么Scanner不能在Java中正确读取输入?

时间:2012-10-04 00:29:31

标签: java loops while-loop java.util.scanner equality

  

可能重复:
  How do I compare strings in Java?

我写了一个程序,将“掷骰子”并告诉你需要多少转才能获得yahtzee。这有效,但当它要求你再次出现时有一个问题。它会继续给我一个“无效输入”,实际上我输入的东西应该退出循环。这是我的代码,循环从第24-34行开始,但我会把它全部放在以前它是一个问题。

import java.util.Scanner;
import java.util.Random;

public class Yahtzee {

public static void main(String[] args){

    int d[] = {0,0,0,0,0};
    int x = 0;
    Scanner s = new Scanner(System.in);
    Random r = new Random();

    while (1!=0){
        d[0] = r.nextInt(6);
        d[1] = r.nextInt(6);
        d[2] = r.nextInt(6);
        d[3] = r.nextInt(6);
        d[4] = r.nextInt(6);
        x+=1;

        if (d[0]==d[1] && d[0]==d[2] && d[0]==d[3] && d[0]==d[4]) {
            System.out.println("You got yahtzee, every dice showed " + Integer.toString(d[0]));
            System.out.println("It only took " + Integer.toString(x) + " turns");
            while (1!=3) {
                System.out.print("Go again? y/n: ");
                String ans = s.nextLine();
                if (ans.toLowerCase()=="n"){
                    System.exit(0);
                } else if (ans.toLowerCase()=="y") {
                    break;
                } else {
                    System.out.println("Invalid input!");
                }
            }

        }   
    }   
}   
}

老实说,我无法弄清楚这一点,尽管它可能非常明显。问题在哪里?

3 个答案:

答案 0 :(得分:3)

使用.equals来比较字符串,而不是等于运算符==

if (ans.toLowerCase().equals("n")){
    System.exit(0);
} else if (ans.toLowerCase().equals("y")) {

等于运算符仅检查它们的内存位置是否相等,在这种情况下不是。

答案 1 :(得分:1)

使用String.equals检查字符串内容。 ==运算符依赖于引用相等性,因此前2个if语句表达式永远不会是true。你可以:

if (ans.toLowerCase().equals("n")) {
   System.exit(0);
} else if (ans.toLowerCase().equals("y")) {
   break;
} else {
   System.out.println("Invalid input!");
}

答案 2 :(得分:0)

以前的两个答案都是正确的,你必须使用String类'.equals方法。

程序中的==运算符实际上是比较2个String对象引用而不是字符串的内容。

对于刚开始使用Java的人来说,这是一个非常常见的错误。

有关详细信息,请参阅此处:http://www.java-samples.com/showtutorial.php?tutorialid=221