Kiedy korzystać z try-catch w metodzie, a kiedy throws Exception? Ogólny mechanizm działania

2015-01-29 13:31
0

Witam. Zapoznałem się z kilkoma tutorialami na ten temat, ale dalej nie rozumiem kilku rzeczy.

public
    class Magazyn{

    private Kontener[] tab;
    private int ilosc;
    public Magazyn(){
        tab = new Kontener[5];
        ilosc = 0;
    }

    public void zaladuj(Kontener k) throws Exception{
        if(tab.length <= ilosc)
            throw new Exception("Magazyn jest pełny");
        else{
            tab[ilosc++] = k;
        }
        System.out.println("Zaladowano: "+ilosc+" \t "+k);  
    }

    public Kontener wyladuj() throws Exception{
        if(ilosc == 0)
            throw new Exception("Magazyn jest pusty");
        Kontener k = tab[--ilosc];
        tab[ilosc] = null;  
        System.out.println("Wyladowano: "+ilosc+" \t "+k);
        return k;
    }

    public void add(Kontener k){
        try{
            if(ilosc == 0)
                this.zaladuj(k);
            else{
                if(tab[ilosc-1].getDni() < k.getDni()){
                    Kontener tmp = this.wyladuj();
                    add(k);
                    this.zaladuj(tmp);
                }else
                    this.zaladuj(k);
            }
        }catch(Exception ex){
            System.out.println(ex);
        }
    }   
}
  1. Jeżeli nie obsłużymy wyjątku w metodzie blokiem try-catch tylko napiszemy samo throws xxxException, to musimy to zrobić w metodzie main, tam gdzie chcemy skorzystać z metody wywalającej wyjątek tak? Tzn. musimy przy jej wywołaniu objąć ją blokiem try-catch
  2. Jeżeli tak jak tutaj w mtodzie zaladuj napiszemy throw new Exception to musi być rozumiem napisane throws w metodzie, po czym musi to być obsłużone tak jak w pkt. 1?
  3. Co robi new Exception tworzy nam nasz własny wyjątek?
  4. Co wywali
    catch(Exception ex){
    System.out.println(ex);
    }

    w metodzie add? Co to jest za exception?

  5. Kiedy obsługiwać wyjątek w metodzie tak jak jest to w metodzie add, a kiedy napisać samo throws i zrobić to w miejscu wywołania tej metody??

Mam nadzieję, że chociaż część z moich pytać zrozumiecie i trochę mnie naprowadzicie. Pozdrawiam

`dodanie znaczników i ``` - @furious programming


„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 1x, ostatnio: furious programming, 2015-01-29 13:38

Pozostało 580 znaków

2015-01-29 13:58
gsdfg
2
  1. Tak, gdzieś trzeba obsłużyć wyjątek - ogólnie najlepiej "najwyżej" jak się da
  2. Tak
  3. Tworzy instancje obiektu Exception czyli ogólnego wyjątku. To błąd, nie powinno się tak robić - powinno się stworzyć własną klasę dziedziczącą po Exception i ją rzucać - pozwoli to łapać ten konkretny typ wyjątku
  4. Złapie dowolny wyjątek i wypisze go w formie tekstowej, nie ma tu dużo do gadania - ogólnie to też nie najlepszy przykład obsługi wyjątku
  5. Tak jak pisałem - najlepiej to zrobić "najwyżej" w hierarchii, czyli tam gdzie masz logikę najwyższego rzędu
    Jeżeli już w funkcji wyladuj obsłużyłbyś wyjątek to nie byłbyś w stanie w funkcji add stwierdzić czy funkcja wyladuj zakończyła się pomyślnie - w wyniku tego program tylko wypisałby wyjątek i kontynuował działanie, a dalsze operacje mogłyby już nie mieć w tym momencie sensu lub doprowadzić do rzucania kolejnych wyjątków.

Pozostało 580 znaków

2015-01-29 14:45
0

To mi dużo rozjaśniło, dziekuje bardzo!
A co do punktu 3, to jestem zaskoczony, bo kod ten wziąłem prosto z wykładu, a jego autorem jest oczywiście prowadzący.

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

Rozumiem, że nasz własny wyjątek zgodnie z tym co powiedziałeś powinien wyglądać w ten sposób tak? Zakładam, że wystarczy jeden konstruktor w tym prostym przykładzie. Czyli poprawny zapis by wyglądał tak:

 public void zaladuj(Kontener k) throws Exception{
        if(tab.length <= ilosc)
            throw new CustomException("Magazyn jest pełny");
        else{
            tab[ilosc++] = k;
        }
        System.out.println("Zaladowano: "+ilosc+" \t "+k);    
    }

„Every Pro was once an amateur, every expert was once a beginner.”
edytowany 3x, ostatnio: Fi3rce, 2015-01-29 14:53

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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