Powrót poprzez break;

0

Witam ponownie,

dziś zmagam się z takim problemem,
Prosty programik:

Podaj liczbę, potem wyświetla ją w konsoli.
Podasz literę - wyrzuci Exception, po czym wróci na początek kodu i poprosi o podanie poprawnej wartości aż do skutku.
Napisałem takie coś (kod z pominięciem class i main...) :

		

                 Scanner jLiczba = new Scanner(System.in);
                 int liczba;

                back: 
		{
				
		System.out.print("Podaj liczbę: ");
		
		try 
		{
			liczba = jLiczba.nextInt();
			System.out.println("Wpisana liczba: " + liczba);
		}
		
		catch (Exception e) 
		{ 
			System.out.println("Musisz podać liczbę a nie literę!");
			break back;
		}

		}
		
		System.out.println("Dalszy kod...");

Wpisując literę a nie liczbę zamiast wrócić do back, program wykonuje się dalej.
Wg. tego co przeczytałem, powinien wrócić do bloku back; nie? :/

Jakieś sugestię?

0
  1. break służy do przerywania pętli lub do obsługi switcha. Ani jednego, ani drugiego u Ciebie nie ma.
  2. Umiesz wyświetlać polskie litery na konsoli? Jeśli nie, to ich nie używaj.
  3. Użytkownik, który wpisze 9999999999999999999999 zdziwi się jak zobaczy komunikat Musisz podać liczbę a nie literę!
0

@Masif to co ty chcesz zrobić to zwykłe brzydkie goto którego absolutnie nie wolno używać. Użyj tam normalnej pętli i nie kombinuj.

0

Wiem, wiem, pracuje nad poprawną wersją. Jak tylko to napisze to wkleję. Początki są trudne w tym obiektowym języku.

0

Ok, siedzę już dłuższy czas przy tym (banalnym jak dla was zapewne) problemie, otóż:

import java.util.*;


public class Testy
{
    public static void main(String[] args) 
    {

        int liczba;
    
        Scanner czytajLiczbe = new Scanner(System.in);
        boolean tak = false;

       do {

    	   try {
        	System.out.print("Podaj liczbę: ");      
    		liczba = czytajLiczbe.nextInt();
            System.out.print("Podana liczba: " + liczba);	

            
        } catch (InputMismatchException a) {
        	System.out.println("To nie jest liczba!"); 
        	tak = true;

        }
    	              
       } while (tak);
        
    }


}

Na pozór (dla mnie) wygląda to tak,

Program czeka aż napiszę jakiś int, gdy piszę np. 8 to pętla się kończy i wychodzę z pętli.

Gdy nacisnę np. literę T to pojawia się InputMismatchException i wykonuje się zadanie z catch czyli

System.out.println("To nie jest liczba!"); 

i

boolean tak;

zamieniam na true, by powrócić do początku pętli i jeszcze raz zapytać o wprowadzenie znaku z klawiatury.

Wydaje mi się to poprawne, a jednak nie jest, gdyż program zamiast zapytać mnie ponownie o znak z klawiatury, powtarza pętle w nieskończoność pisząc:

Podaj liczbę: To nie jest liczba!

Tak jakby przetrzymywał ten InputMismatchException i ciągle go wykonywał.

Zatem czy cała pętla jest zła czy może jest jakiś sposób by wyzerować/usunąć informację o błędzie?

@bogdans ała ała, nie krzycz... wytłumacz :]

0

Albo wstaw inicjalizacje tak = false; przy poprawnym wykonaniu.
Albo zrób po ludzku.

for(;;) {
    try {
        System.out.print("Podaj liczbę: ");      
        liczba = czytajLiczbe.nextInt();
        System.out.print("Podana liczba: " + liczba);        
        break;
    } 
   catch (InputMismatchException a) {
        System.out.println("Bląd wprowadzenia!"); 
    }
 }
0

Po kompilacji Twojej wersji, program zachowuje się tak samo (po podaniu litery zamiast cyfry), czyli wyświetla się w nieskończoność pętla:
Podaj liczbę: Bląd wprowadzenia!
Podaj liczbę: Bląd wprowadzenia!
Podaj liczbę: Bląd wprowadzenia!
Podaj liczbę: Bląd wprowadzenia!
itd. :/

0

Chcesz wczytać całe linie, więc rób nextLine(), a potem rób np Integer.valueOf(wczytanaLinia)

Nieskończoną pętlę dostałeś, jak się domyślam, dlatego że nextInt() nie przesuwał wskaźnika strumienia przy porażce wczytywania.

0

Brakuje przywrócenia wartości zmiennej logicznej tak jeżeli użytkownik się poprawi i poda poprawne dane za drugim razem. Wypada też napisać użytkownikowi jakiej liczby się od niego oczekuje. Komunikat To nie jest liczba! w odpowiedzi na wpisanie 99999999999999999 jest nie na miejscu.

import java.util.*;
 
public class Testy
{
    public static void main(String[] args) 
    { 
        int liczba; 
        Scanner czytajLiczbe = new Scanner(System.in);
        boolean tak = false;
        do 
        {
            try 
            {
                System.out.print("Podaj liczbe calkowita z przedzialu ["+Integer.MIN_VALUE+","+Integer.MAX_VALUE+"]: ");      
                liczba = Integer.parseInt(czytajLiczbe.next());
                tak = false;
                System.out.print("Podana liczba: " + liczba);        
            } 
            catch (NumberFormatException a) 
            {
                System.out.println("Zla liczba!"); 
                tak = true; 
            }
       } while (tak);
    } 
}
0

Hmm, nie byłem aż tak daleko od rozwiązania, nie znałem tych metod. Za małą wiedzę mam jeszcze.
Zabierając się za to ćwiczenie myślałem, że to będzie pestka, a jednak okazało się, że nie.

Ciekawa ta metoda parseInt();
Wracam do czytania podręcznika.

Teraz działa. Dzięki za poświęcony czas. Dobra lekcja.

1 użytkowników online, w tym zalogowanych: 0, gości: 1