为什么我不能使用java.util.Scanner打破for循环?

时间:2012-05-02 22:56:28

标签: java for-loop java.util.scanner break

当我使用此代码时:

Scanner scan = new Scanner(System.in);
String codeEntered = "";
for ( ; ; ){
        System.out.print("Enter Code or Press Q to Quit:\n");
        codeEntered = scan.nextLine();
        if (codeEntered == "Q"){
            break;
        }
        //Do stuff here.

}
System.out.println("Goodbye!");

即使输入“Q”,我也无法摆脱for循环。这段代码有什么问题?

5 个答案:

答案 0 :(得分:8)

if (codeEntered == "Q"){

比较对象时,通常应使用equals()而不是operator==。 (而String是一个对象!)
operator==检查身份 - 如果两个操作数相同的对象,而equals()检查其内容是否等于彼此。

尝试:

if ("Q".equals(codeEntered)){

答案 1 :(得分:3)

不要使用==比较字符串。请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象是否相同而不是您感兴趣的。另一方面,这些方法检查两个字符串是否具有相同顺序的相同字符,并且这才是最重要的。而不是

if (fu == "bar") {
  // do something
}

做,

if ("bar".equals(fu)) {
  // do something
}

,或者

if ("bar".equalsIgnoreCase(fu)) {
  // do something
}

答案 2 :(得分:2)

您的问题是您使用双等于==来比较字符串。

试试这个

if(codeEntered.equals("Q")) {
     break;
}

==比较内存中的地址,这对于字符串来说永远不会相同。在Java中进行字符串比较时,应始终使用.equals。

答案 3 :(得分:2)

使用equals()方法。

if (codeEntered.equals("Q")){
        break;
}

equals()方法比较String对象中的字符。 ==运算符比较两个对象引用以查看它们是否引用同一实例。

例如,

String hello = new String("hello");
在这种情况下,

hello创建一个合并的实例(请参阅intern),new String(...)创建一个非池化的实例。

尝试System.out.println(("hello" == "hello") + "," + (new String("hello") == "hello") + "," + (new String("hello") == new String("hello")));

您应该看到true,false,false


new String("hello");(如上例所示)

并没有真正做任何有用的事情。它只是创建另一个由相同数组,偏移量和长度作为s支持的实例。很少有理由这样做,因此被大多数Java程序员认为是不好的做法。

答案 4 :(得分:2)

应始终使用equals方法和基元与==比较对象。自定义对象应该实现自己的equals方法来检查对象的相等性。这是拇指规则。