-2

I am using a while loop and an if loop to determine a response and action. For some odd reason it continues to ignore my if statements.

            Boolean _exit = false;
        while (_exit == false){
            System.out.println("\nWould you like another meal?\tYes or No?");
            String answer = scan.next().toLowerCase();
            if (answer == "yes"){
                System.out.println("Reached1");
                _exit = true;
            }
            if (answer == "no"){
                System.out.println("Reached1");
                exit = _exit = true;
            }

Could someone explain what is happening and why it is failing to check the if statements. I've tried scan.nextLine as well. This problem even persisted when I removed of the toLowerCase as it was brought to my attention that it can have an affect on string values, though I did try Locale.English.

Any suggestions?

Pichu
  • 265
  • 2
  • 4
  • 9

2 Answers2

3

Compare Strings with .equals() not == in your if statements:

if (answer.equals("yes")){
            System.out.println("Reached1");
            _exit = true;
        }
        if (answer.equals("no")){
            System.out.println("Reached1");
            exit = _exit = true;
        }
Marco Corona
  • 812
  • 6
  • 12
0

From an other thread:

== tests for reference equality.

.equals() tests for value equality.

Consequently, if you actually want to test whether two strings have the same value you should use .equals() (except in a few situations where you can guarantee that two strings with the same value will be represented by the same object eg: String interning).

== is for testing whether two strings are the same object.

// These two have the same value
new String("test").equals("test") ==> true 

// ... but they are not the same object
new String("test") == "test" ==> false 

// ... neither are these
new String("test") == new String("test") ==> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" ==> true 

// concatenation of string literals happens at compile time resulting in same objects
"test" == "te" + "st"  ==> true

// but .substring() is invoked at runtime, generating distinct objects
"test" == "!test".substring(1) ==> false

It is important to note that == is much cheaper than equals() (a single pointer comparision instead of a loop), thus, in situations where it is applicable (i.e. you can guarantee that you are only dealing with interned strings) it can present an important performance improvement. However, these situations are rare.

Source: How do I compare strings in Java?

Community
  • 1
  • 1
Hegi
  • 193
  • 2
  • 11