• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Obsługa wyjątku w javie- problem z przykładem

Object Storage Arubacloud
0 głosów
101 wizyt
pytanie zadane 24 sierpnia 2017 w Java przez Rubeus024 Obywatel (1,680 p.)

Z góry uprzedzam, że dopiero rozpoczynam temat wyjątków w Javie i chciałem poćwiczyć ich używanie na przykładowym kodzie. Program, który wykonałem, wczytuje parametry wielu równań kwadratowych, pakuje te wartości do obiektów QuadraticFormula, po kolei dodaje je do listy w ramach pętli for, na końcu wyświetla wszystko na konsoli. stworzyłem klasę Console i posiada metodę start(). Jej rola polega tylko na wczytaniu liczb przez użytkownika, a potem zwraca obiekt klasy QuadraticFormula.

Gdy użytkownik wpiszę literę, metoda zwraca obiekt z wyzerowanym parametrem b i c, i powinienem wpisywać kolejne parametry w ramach pętli. Dzieje się inaczej:

Podaj parametr a
3
Podaj parametr b
4
Podaj parametr c
5
Podaj parametr a
s
Podałeś błędną wartość parametru
Podaj parametr a
Podałeś błędną wartośc parametru
Podaj parametr a
Podałeś błędną wartość parametru
QuadraticFormula{a=3.0, b=4.0, c=5.0, delta=-44.0} Lack of solution
QuadraticFormula{a=1.0, b=0.0, c=0.0, delta=0.0} x is equal: 0.0
QuadraticFormula{a=1.0, b=0.0, c=0.0, delta=0.0} x is equal: 0.0
QuadraticFormula{a=1.0, b=0.0, c=0.0, delta=0.0} x is equal: 0.0

Pytanie dlaczego tak się dzieje? Czemu przez resztę pętli nie pyta użytkownika o liczby? Ma ktoś pomysł żeby rozwiązać to w inny, lepszy sposób? Czy wyrażenie try-catch w ogóle ma tu sens? I jeszcze jedno pytanie. Skoro bez względu na to, czy dam throws InputMismatchException czy nie, konsola i tak wychwytuje ten wyjątek. Po co więc to w ogóle dodawać? Z góry dzięki za odpowiedż.

Kod poniżej:

package DefaultPackage;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Exceptions {
    public static void main(String[] args) {
        List<QuadraticFormula> list=new ArrayList<>(10);
        Console console=new Console();


        for(int i=0;i<4;i++){
            list.add(console.start());
        }
        for(QuadraticFormula e:list) {
            System.out.print(e);
            e.solve();
        }
    }
}


class QuadraticFormula{

    private double a,b,c;
    private double delta;

    public QuadraticFormula(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.delta=b*b-4*a*c;
        //System.out.println("Delta wynosi: "+delta);
    }
    public void solve() {
        if (delta > 1) {
            double x1 = (-b - Math.sqrt(delta)) / (2 * a);
            double x2 = (-b + Math.sqrt(delta)) / (2 * a);
            System.out.println(" x1 is equal: " + x1 + ", x2 is equal: " + x2);
        } else if (delta == 0) {
            double x = (-b + Math.sqrt(delta)) / (2 * a);
            System.out.println(" x is equal: " + x);
        }
        else System.out.println(" Lack of solution");
    }

    @Override
    public String toString() {
        return "QuadraticFormula{" +
                "a=" + a +
                ", b=" + b +
                ", c=" + c +
                ", delta=" + delta +
                '}';
    }
}

class Console{
    private Scanner in;

    public Console() {
        this.in = new Scanner(System.in);
    }

    public QuadraticFormula start() {
        try {

            System.out.println("Podaj parametr a");
            double a = in.nextInt();
            System.out.println("Podaj parametr b");
            double b = in.nextInt();
            System.out.println("Podaj parametr c");
            double c = in.nextInt();
            return new QuadraticFormula(a,b,c);
        }
        catch(InputMismatchException e){
            System.out.println("Podałeś błędną wartość parametru");
            return new QuadraticFormula(1,0,0);
        }

    }

}

 

2 odpowiedzi

+1 głos
odpowiedź 24 sierpnia 2017 przez Aleksander Januszews Gaduła (3,790 p.)
wybrane 24 sierpnia 2017 przez Rubeus024
 
Najlepsza
...
catch(InputMismatchException e){
            System.out.println("Podałeś błędną wartość parametru");
            in.nextLine();
            return new QuadraticFormula(1,0,0);
        }
...

 

Dzieje się tak, ponieważ in.nextInt(), nextDouble itd. nie pobierają znaku następnej linii (\n). Jeżeli wyrzuci wyjątek (czyli zostanie podana nie-liczba) i nie przejdziesz do następnej linii to w buforze Scanner'a pozostanie ta „nie-liczba” ('s' w tym przypadku). Aby tego uniknąć trzeba załączyć przejście do nastepnej linii.

 

Na StackOverflow jest to dobrze wytłumaczone: tutaj

 

 

+1 głos
odpowiedź 24 sierpnia 2017 przez Aisekai Nałogowiec (42,190 p.)
Na szybko,  powinno być if(delta>0) zamiast if(delta>1). Jakbyś dodał in.nextLine() przed returnem w catch?

Podobne pytania

0 głosów
0 odpowiedzi 173 wizyt
pytanie zadane 9 lipca 2017 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 454 wizyt
pytanie zadane 25 października 2017 w Java przez fusemul Użytkownik (710 p.)
+1 głos
1 odpowiedź 135 wizyt
pytanie zadane 2 maja 2016 w Java przez Daniel Koczorowski Nowicjusz (160 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...