try catch dla dwoch liczb

0

Tytul moze nie oddaje tego o co chcialbym spytac ale do rzeczy: zastanawialem sie czy daloby sie zrobic taki program uzywajac tylko try catch bez ifów, w ktorym uzytkownik moze wprowadzic tylko liczbę 1 lub 2, w innym przypadku nadal bedzie wyswietlany komunikat Wpisz 1 lub 2.. doszedlem do czegos takiego:

Scanner klaw=new Scanner(System.in); 
       int a;
       boolean OK;
       do   {
            try {   
                OK=true; 
                System.out.print("Wpisz 1 lub 2 "); 
                a=klaw.nextDouble();
                System.out.println();
                }
            catch (mismatchException ex) {OK=false;klaw.nextLine();}
            
            }
       while (!OK);

doszedlem do momentu, ze jesli ktos wpisze cos innego niz liczba, to wlasnie ten komunikat bedzie sie powtarzal dotad, dopoki nie wpisze liczby, tyle ze tą liczbą moze byc nawet 1000, a ja chcę, żeby program ,,obsługiwał'' tylko 1 lub 2. rozumiecie nie? ;p to jak mógłbym dać taki warunek? bez ifów jeśli się da

3

W javie konstrukcja try - catch w zupełności wystarcza do zaimplementowania wszystkich innych rozgałęzień - if, while, for, itd.
Oczywiście to pomysł tylko dobry do zabawy.

0

Chyba wystarczy zmienić while na

while (!OK || (a == 1 || a==2))
0

Możesz obsłużyć ten przypadek wyrażeniem regularnym. Kod będzie wyglądał normalnie, czytelnie. Każdy czytając Twój kod się kapnie o co Ci chodziło.
Jak już Ci "if" tak bardzo przeszkadza wypakuj logikę warunku do prywatnej metody - zwiększysz w ten sposób czytelność.
Próbujesz strzelać do muchy z czołgu. Naprawdę if to nie jest nic złego - przynajmniej w takim przypadku.

1
public class Main {
    private static final Set<Integer> available = Set.of(1, 2);

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int input;
        do {
            System.out.println("Wpisz 1 lub 2");
            input = scanner.nextInt();
        } while (isIncorrectInput(input));
        scanner.close();
        System.out.printf("Wpisałeś %d - WELL DONE", input);
    }

    private static boolean isIncorrectInput(final int input) {
        return !available.contains(input);
    }
}
0
dawid.wiklo4 napisał(a):

Jak już Ci "if" tak bardzo przeszkadza wypakuj logikę warunku do prywatnej metody - zwiększysz w ten sposób czytelność.

Próbujesz strzelać do muchy z czołgu. Naprawdę if to nie jest nic złego - przynajmniej w takim przypadku.

Mnie nie przeszkadza, ale po prostu się zastanawialem czy tak mozna bez instrukcji warunkowych. dziekuje za odpowiedzi, poprobuje kod Korgesa. a jakby to try catch z np ifami wygladalo?

0

@stn617: W poście wyżej niestety walnąłem się w warunku logicznym i już nie mogę edytować. Poprawny kod:

   Scanner klaw = new Scanner(System.in);
        double a = - 1;
        boolean OK;
        do
        {
            try
            {
                OK = true;
                System.out.print("Wpisz 1 lub 2 ");
                a = klaw.nextDouble();
                System.out.println();
            }
            catch (InputMismatchException ex)
            {
                OK = false;
                klaw.nextLine();
            }
        }
        while (! OK || (a != 1 && a != 2));
        System.out.println("Wpisałes poprawna wartość");

Spójrz na while i zobacz, że on dokładnie robi to co chcesz. Przykład @Korges jest poprawny, aczkolwiek brakuje mu try-catch bo wywali się jeżeli podasz przykładowo 'a'.
Oczywiście mój kod też jest mocno średni, ale bardzo blisko mu do Twojego przykładu.

0
public class Main {
    private static final Set<Integer> available = Set.of(1, 2);

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number;
        do {
            System.out.println("Wpisz 1 lub 2");
            while (!scanner.hasNextInt()) {
                String input = scanner.next();
                System.out.printf("\"%s\" to nie liczba.\n", input);
            }
            number = scanner.nextInt();
        } while (isIncorrectNumber(number));
        scanner.close();
        System.out.printf("Wpisałeś %d - WELL DONE", number);
    }

    private static boolean isIncorrectNumber(int number) {
        return !available.contains(input);
    }
}

Nie przesadzałbym z blokami try catch. Lepiej ich nie stosować jak nie ma potrzeby.

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