2013-03-19 2 views
0

Я нашел странное поведение утверждений в Java (Eclipse). Простой пример: если я выполняю это ...Странное поведение утверждений в Eclipse

public static void main (String[] args) { 
    assert(getA() == "a") : "Invalid"; 
    System.out.println("Assertion successful!"); 
} 

private static String getA() 
{ 
    return "a"; 
} 

... он покажет мне «Утверждение успешно!». как это должно. Однако, если я попробую это ...

public static void main (String[] args) { 
    assert(getA() + "b" == "ab") : "Invalid"; 
    System.out.println("Assertion successful!"); 
} 

private static String getA() 
{ 
    return "a"; 
} 

... У меня есть AssertionError. Почему это утверждение не вернулось?

Примечание:

  • Не забудьте добавить "-EA" Parameter в аргументах VM при тестировании! (Eclipse: enable assertions)
+2

http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java – assylias

+0

Реальный вопрос: почему первый снипп не распечатывает «Invalid»? – sp00m

+1

Это связано с оптимизацией в JVM sp00m, в первом случае буква «a» занимает одно и то же пространство памяти – Cruncher

ответ

6

Вы должны дать

"a".equals(getA()); 

Второй случай

"ab".equals("b".concat(getA())); 

Причина: -== для сравнения объектных ссылок, в то время как equals() используется для сравнения строки значение , что вам нужно. Кроме того, первый сценарий имел тот же строковый литерал «a», следовательно, он возвращал true. Но во втором случае был создан новый экземпляр String для getA()+b, который отличается от буквального «ab».

+0

Ударьте меня к нему lol. Когда вы делаете ==, он сравнивает сравнение объектов с сопоставлением значений строк. Это может привести к странным сравнениям. – Cruncher

+0

Ой, вот и все! Спасибо, это было неловко! : D –

+0

ну, а как насчет этого примера здесь? почему это не удается? http://pastebin.com/ZgA6bTjw –

5

"a" является буквальным на время компиляции, то "a"=="a" вычисляется как true

getA()+"b" создает новый экземпляр String, которая отличается от времени компиляции буквального "ab"