2012-05-02 3 views
0

Когда я использую этот код:Почему я не могу разбить цикл for, используя java.util.Scanner?

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». Что не так с этим кодом?

ответ

8
if (codeEntered == "Q"){ 

Вы должны обычно использовать equals() и не operator== при сравнении объектов. (И String является объектом!)
operator== проверяет идентичности - если оба операнда тот же объект, а equals() проверить, если их содержание составляет друг друга.

попробовать:

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

Этот старый каштан ... – Bohemian

+0

Отличный ответ! Я не сделал этого. Я всегда задавался вопросом о различии между == и foo.equals (""); Благодаря! – Cin316

3

Не сравнивайте строк с использованием ==. Вместо этого используйте метод equals(...) или equalsIgnoreCase(...). Поймите, что == проверяет, являются ли объекты те же, что вас не интересует. Методы, с другой стороны, проверяют, имеют ли две строки одинаковые символы в одном порядке, и это имеет значение здесь. Таким образом, вместо

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

сделать,

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

или,

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

Ваша проблема заключается в том, что вы используете двойной равных == для сравнения строк.

Попробуйте вместо

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

== сравнивает адреса в памяти, которые никогда не будут одинаковыми для строк. Вы всегда должны использовать .equals при сравнении String в Java.

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 считают это плохой практикой.

2

Объекты всегда должны сравниваться с использованием метода equals и примитивов с ==. Пользовательские объекты должны реализовать свой собственный метод equals для проверки равенства объектов. Это правило большого пальца.

Смежные вопросы