• 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

0 głosów
142 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 214 wizyt
pytanie zadane 9 lipca 2017 w Java przez Jonki Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 537 wizyt
pytanie zadane 25 października 2017 w Java przez fusemul Użytkownik (710 p.)
+1 głos
1 odpowiedź 188 wizyt
pytanie zadane 2 maja 2016 w Java przez Daniel Koczorowski Nowicjusz (160 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...