in.nextLine(); - o co chodzi?

in.nextLine(); - o co chodzi?
Awgwa
  • Rejestracja:około 11 lat
  • Ostatnio:około 10 lat
  • Postów:21
0

Cześć, co dokładnie robi metoda nextLine();? Mam taki kod:

Kopiuj
import java.util.InputMismatchException;
import java.util.Scanner;

public class Dzielenie
{

	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		boolean isNotCorrect = true;
		do
		{
			try
			{
				System.out.println("Wprowadź licznik");
				int l = in.nextInt();

				System.out.println("Wprowadź mianownik");
				int m = in.nextInt();

				System.out.println(l + " / " + m + " = " + l / m);

				isNotCorrect = false;
			} 
			catch (InputMismatchException ime)
			{
				// ime.printStackTrace();
				System.err.println("Złe dane wejściowe");
				in.nextLine();
				System.out.println("Wprowadź dane ponownie");
			}
			catch (ArithmeticException ae)
			{
				// ae.printStackTrace();
				System.err.println("Dzielenie przez zero");
				System.out.println("Wprowadź dane ponownie");
			}
		}
		while (isNotCorrect);

		in.close();
	}

}

i nie rozumiem tej części:

Kopiuj

catch (InputMismatchException ime)
			{
				// ime.printStackTrace();
				System.err.println("Złe dane wejściowe");
				in.nextLine();
				System.out.println("Wprowadź dane ponownie");
			}

dlaczego in.nextLine(); przerwało w tym wypadku błędne wykonywanie się programu a in.nextInt(); nie?

miej95
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:78
0

Nie bardzo rozumiem pytanie. Generalnie kod pobierania danych i operowania na nich jest w pętli która zakończy się dopiero gdy nie wystąpi żaden wyjątek. Jeśli takowy wystąpi, program łapie go i informuje Cię o tym. Funkcja nextLine() jest funkcją zwracającą zmienną typu String, oraz przesuwająca "aktualną linię czytaną" na następną. Jak dla mnie jest ona tu nie potrzebna i można się jej pozbyć. Program po ponownym wykonywaniu tego co w try{} "przesunie" aktualny czytany element na koleją liczbę.

PS podobno BufferedReader jest szybszy od Scannera z tym że on to co "czyta" przetwarza na String, więc do twojego programu wymagane było by jeszcze Parsowanie.

edytowany 1x, ostatnio: miej95
0

W sumie to ta linia sprawia ze aplikacja czeka na enter od usera.

miej95
  • Rejestracja:około 11 lat
  • Ostatnio:około 8 lat
  • Postów:78
0

Masz racje. Ale w sumie nie bardzo tu potrzebne

bogdans
Nie masz racji, jest absolutnie niezbędne.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

@mućka, ta linia raczej sprawia, że z bufora klawiatury zostaną usunięte błędne dane. Bez tego wiersza (in.nextLine()), program, po wpisaniu, niepoprawnych danych wchodzi w nieskończoną pętlę.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Awgwa
Właśnie o to mi chodziło, ale dlaczego pętla nie jest nieskończona jeśli pomylimy się wpisując np. '0' w mianowniku? To działa w ten sposób tylko przy wpisaniu liter. I dlaczego bufor nie zostanie zresetowany po zastosowaniu (in.nextInt()), czy tylko komenda (in.nextLine()) go resetuje?
bogdans
nextInt() oznacza odczytaj z bufora liczbę całkowitą, ale jej tam nie ma, więc nextInt() niczego nie czyta, nextLine() oznacza odczytaj z bufora kolejną linię, i to czytanie się powiedzie, co do zera, to odpowiedź jest oczywista, nextInt() wczyta zero i tym samym opróżni bufor klawiatury

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.