Gå til innhold

Hva er galt i denne while-løkka?


Anbefalte innlegg

Hei!

 

Når jeg kjører programmet virker det som det hoppes over linje 41: bruker = tastatur.nextLine(); når løkka begynner på andre gjennomkjøring. Istedenfor å prompte for userinput går den rett videre til switch setningen. Alt fungerer normalt ved første gjennomkjøring! Noen som ser hvorfor?

 

import java.util.Scanner;

public class oving5R	{
//Oppgave a) lager metode som søker etter brukergitt navn i en tabell frem til nullpeker
public static boolean finnNavn(String[] navnTab, String navn)	{
		boolean navnTF = false; //true hvis navnet finnes
		int i = 0;
		while (i < navnTab.length && !navnTF && navnTab[i] != null)	{
			if (navn.equals(navnTab[i]))	
				navnTF = true;
			else
				navnTF = false;
			i++;
		}
	return navnTF;
}
//Oppgave c) lager metode som søker etter brukergitt navn i hele tabellen
public static boolean finnNavnR(String[] navnTab, String navn)	{
		boolean navnTF = false; //true hvis navnet finnes
		int i = 0;
		while (i < navnTab.length && !navnTF)	{
			if (navn.equals(navnTab[i]))	
				navnTF = true;
			else
				navnTF = false;
			i++;
		}
	return navnTF;
}
public static void main(String[] args)	{

	String[] nTab = {"harald", "olga", "jonas", "liv", null, "anne", null, "lars", null, null};
	int metodeValg;
	Scanner tastatur = new Scanner(System.in);
	String bruker = "";

	System.out.println("Avslutt med \"ferdig\"");

	while (!bruker.equals("ferdig"))	{								 // <----  HER
		System.out.print("Skriv inn søkenavn: ");
		bruker = tastatur.nextLine();
		if (bruker.equals("ferdig"))
			break;
		System.out.print("Vil du søke med finnNavn[1] eller finnNavnR[2]? ");
		metodeValg = tastatur.nextInt();

		switch (metodeValg)	{
			case 1:
				if (finnNavn(nTab, bruker))
					System.out.println(bruker + " er i tabellen"); 
				else
					System.out.println(bruker + " er ikke i tabellen");	
				break;	
			case 2:
				if (finnNavnR(nTab, bruker))	
					System.out.println(bruker + " er i tabellen"); 
				else
					System.out.println(bruker + " er ikke i tabellen");	
				break;
			default:
				System.out.println(metodeValg + " er ikke et gyldig valg");

		} //slutt switch

	} //slutt whileløkke
}
}

Lenke til kommentar
Videoannonse
Annonse
Når jeg kjører programmet virker det som det hoppes over linje 41: bruker = tastatur.nextLine(); når løkka begynner på andre gjennomkjøring. Istedenfor å prompte for userinput går den rett videre til switch setningen. Alt fungerer normalt ved første gjennomkjøring! Noen som ser hvorfor?

Fordi du bruker tastatur.nextInt() for å lese inn tallet. Da "taes" kun tallet, ikke linjeskiftet etterpå. Ved å i stedet bruke Integer.parseInt(tastatur.nextLine()) , eventuelt med en feilsjekk på om det er en Integer som er inntastet (NumberFormatException hvis ikke), slipper du problemet..

Lenke til kommentar
Når jeg kjører programmet virker det som det hoppes over linje 41: bruker = tastatur.nextLine(); når løkka begynner på andre gjennomkjøring. Istedenfor å prompte for userinput går den rett videre til switch setningen. Alt fungerer normalt ved første gjennomkjøring! Noen som ser hvorfor?

Fordi du bruker tastatur.nextInt() for å lese inn tallet. Da "taes" kun tallet, ikke linjeskiftet etterpå. Ved å i stedet bruke Integer.parseInt(tastatur.nextLine()) , eventuelt med en feilsjekk på om det er en Integer som er inntastet (NumberFormatException hvis ikke), slipper du problemet..

 

 

Supert! Det fungerte utmerket :thumbup:

 

Blir nextLine() hos meg "overskrevet" da? Skjønner fortsatt ikke helt.. gidder du forklare akkurat hva parseInt() gjør? :)

 

Eller bare ha en dobbel tastatur.nextLine()...

 

Dette fungerte også forsåvidt, men så litt mer klønete ut.. :p

 

Takk for hjelpen uansett! :)

Lenke til kommentar
Blir nextLine() hos meg "overskrevet" da?

Ikke helt sikker på om jeg skjønner hva du lurer på, men kan prøve å forklare forskjellen på bruk av nextInt() nextLine() her.. Når du tillater at en bruker å skrive inn noe kan du tenke at det skrevne legges i en kø av tegn. Det normale er at denne køen avslutter med tegnet for linjeskift (i Windows to tegn) som kommer av at brukern avsluttet ved å trykke Enter. "Java" har et leserhode som leser seg bortover i denne køen. Når du bruker nextInt() leser du fra nåværende posisjon til først ikke-tall, stopper der og returnerer tallet. D.v.s. for en linje med bare et tall leser "Java" kun tallet og stopper før linjeskiftet like etter tallet er lest. Når du bruker nextLine() vil "Java" lese t.o.m. først linjeskift og returnere det som var før linjeskiftet. Så når du først brukte nextInt() hadde du fortsatt et linjeskift igjen å lese, og dette linjeskiftet ble lest når du etterpå kalte nextLine() (men siden det bare var et linjeskift var det nextLine() returnerte en tom streng).

 

Håper du forstod litt hva jeg mente :)

Lenke til kommentar

du nå tror jeg at jeg skjønner det! kjempeflott! :)

 

da klarte jeg faktisk å løse problemet med bare å slenge inn en tastatur.nextLine() etter tastatur.nextInt() i min originale kode. Tror jeg skal være litt forsiktig med å bruke kall jeg ikke skal ha lært om enda.. hehe :p

 

Tusen takk for hjelpen! :)

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...