Gå til innhold

[Løst]If setning oppfører seg snodig


Anbefalte innlegg

Jeg har laget en egen funksjon som returnerer en boolean utifra om brukeren angir "yes" eller "no" i konsollet, men min if setning tolker dette helt tullete.

Det som skal skje:

- Brukeren skriver inn "yes", funksjonen tolker dette som true

- Brukeren skriver inn "no", funksjonen tolker dette som false

- Brukeren skriver inn noe helt annet, funksjonen tolker dette som false

 

Det som skjer:

- Brukeren skriver inn "yes", funksjonen tolker dette som noe helt annet, dermed false

- Brukeren skriver inn "no", funksjonen tolker dette som noe helt annet, dermed false

- Brukeren skriver inn noe helt annet, funksjonen tolker dette som noe helt annet, dermed false

 

Her er koden som kaller funksjonen:

boolean numsPresent = false;
numsPresent = readBool();

 

Her er funksjonen:

private static boolean readBool()
{
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	try 
	{
		String s = br.readLine();
		if (s == "yes")
			return true;
		else if (s == "no")
			return false;
		else
		{
			System.out.println("\nYou entered something weird, so i take that as a big fat NO!");
			return false;
		}
	}
	catch (Exception ex) { System.out.println(ex); return false; }
}

Lenke til kommentar
Videoannonse
Annonse
if (s == "yes")
  return true;
else if (s == "no")
  return false;

== gjør ikke det du tror den gjør. Stringer er objekter og == sammenligner objekt-likhet, altså om referansene peker til samme objekt. Det gjør de ikke.

 

Det du vil er å bruke equals(), eller muligens equalsIgnoreCase()

 

if (s.equals("yes")) return true;
// osv...

Lenke til kommentar

Hvilken versjon av java kompilerer du med? == for å sammenligne strings har vel vært gyldig en stund nå? (1.5, 1.6?).

 

Kompilerte et lite testprogram for å verifisere, og jo, det funket å bruke ==.

 

Edit: Jeg er forøvrig helt enig i at .equals() er det "rette" måten å gjøre det på!

Endret av Sokkalf™
Lenke til kommentar

Nja, == gir warnings i NetBeans ihvertfall. :)

 

Vel, testet måten du gjorde det på, og det funker ikke her heller.

 

String y = "yes";

 

Og deretter : (y == "yes") gir true, men når jeg prøvde å lese inn strengen med readLine, så fungerte det ikke.

 

Litt usikker på hvorfor, men kanskje noen som er litt klokere enn meg kan svare på det. :)

 

Edit: http://www.devdaily.com/java/edu/qanda/pjq...tml#comment-474

 

Ser ut som jeg har blitt lurt av java-compileren, .equals er definitivt og i alle tilfeller måten å gjøre det på. :)

Endret av Sokkalf™
Lenke til kommentar
String y = "yes";

 

Og deretter : (y == "yes") gir true, men når jeg prøvde å lese inn strengen med readLine, så fungerte det ikke.

Grunnen til at det fungerer i det ene tilfellet og ikke det andre har med en liten detalj som heter string interning å gjøre. Alle literale strenger i .java-filene dine opprettes som statiske String-objekter i en String-pool. Dvs at om du har flere "yes"-literaler i .java-filene dine så vil alle disse referere til samme "yes"-objekt i intern-poolen.

 

Men når du kaller readLine() lages et nytt String-objekt. == vil derfor gi false, ettersom dette nye String-objektet ikke er det samme som det som ligger i intern-poolen.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...