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

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

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.
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);    
    }

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