Wyjątki

Wyjątki to sytuacje powodujące błędy w programie często prowadzące do jego zamknięcia.

Przykładowo jeśli za pomocą obiektu typu Scanner i metody nextInt() spróbujemy do zmiennej typu int przypisać liczbę zmiennoprzecinkową lub znak.

Na szczęście w javie jest kilka sposób na obsługę takich wyjątkowych sytuacji dzięki czemu próba przypisania liczby zmiennoprzecinkowej do zmiennej typu int nie musi skończyć się wywaleniem programu.

Metoda pierwsza: blok try catch
Opis działania tej metody mógłby brzmieć następująco: spróbuj przechwycić wyjątek w bloku try i jeśli on faktycznie wystąpi to wywołaj kod z bloku catch.

Przykładowy kod w którym próbujemy przechwycić wyjątek o nazwie InputMismatchException spowodowany próbą przypisania niewłaściwego typu do zmiennej:

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("Podaj liczbę: ");
		int number = 0;
		try {
			number = sc.nextInt();
		} catch(InputMismatchException ex) {
			System.err.println("Podana wartość nie jest liczbą całkowitą");
			ex.printStackTrace();
		}
		System.out.println("Podałeś: " + number);
		sc.close();
	}
}

Metoda druga: blok multi catch
Jeśli kod zawarty w bloku try może potencjalnie spowodować wystąpienie różnych wyjątków to wykorzystanie bloku multi catch pomoże nam obsłużyć je na swój sposób

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int numbers[] = new int[2];
		boolean error = true;
		
		while(error) {
			try {
				System.out.println("Podaj 1 liczbę: ");
				numbers[0] = sc.nextInt();
				sc.nextLine();
				System.out.println("Podaj 2 liczbę: ");
				numbers[1] = sc.nextInt();
				sc.nextLine();
				
				System.out.println("Którą wartość wyświetlić (1 lub 2)? ");
				System.out.println(numbers[sc.nextInt() - 1]);
				error = false;
			} catch(InputMismatchException ex) {
				System.out.println("Nie podałeś liczby całkowitej, spróbuj jeszcze raz: ");
				sc.nextLine();
			} catch(ArrayIndexOutOfBoundsException ex) {
				System.out.println("Miało być 1 lub 2, zacznijmy od nowa: ");
				sc.nextLine();
			}
		}
		sc.close();
	}
}

Od javy w wersji 7 możemy wszystkie rodzaje wyjątków obsłużyć w jednym bloku catch:

try{
//kod z błędami
} catch(InputMismatchException | ArrayIndexOutOfBoundsException ex) {
	//dowolne instrukcje, np.:
	ex.printStackTrace();
}

Z uwagi na to że wyjątki mają hierarchię dziedziczenia począwszy od klasy Throwable, możemy zadeklarować ogólniejszy typ wyjątku w celu obsługi kilku różnych jednocześnie

try{
//kod z błędami
} catch(Exception ex) {
	//dowolne instrukcje, np.:
	ex.printStackTrace();
}

Do powyższych metod możemy dodać jeszcze blok finally który wykona się niezależnie od tego czy wyjątek wystąpił czy też nie.

try {
				System.out.println("Podaj 1 liczbę: ");
				numbers[0] = sc.nextInt();
				sc.nextLine();
				System.out.println("Podaj 2 liczbę: ");
				numbers[1] = sc.nextInt();
				sc.nextLine();
				
				System.out.println("Którą wartość wyświetlić (1 lub 2)? ");
				System.out.println("Wartość: " + numbers[sc.nextInt() - 1]);
				error = false;
			} catch(InputMismatchException ex) {
				System.out.println("Nie podałeś liczby całkowitej, spróbuj jeszcze raz: ");
			} catch(ArrayIndexOutOfBoundsException ex) {
				System.out.println("Miało być 1 lub 2, zacznijmy od nowa: ");
			} finally {
				sc.nextLine();
			}
		}

Instrukcja Throw
Używana często w sytuacji gdy z góry wiemy że dana metoda może wygenerować wyjątek ale np. na obecnym etapie nie chce nam się go obsługiwać.
W sygnaturze takiej metody należy wtedy dodać throws nazwaWyjątku a w ciele metody użyć konstrukcji throw new

public class Numbers {
	private int[] numbers;

	public Numbers() {
		numbers = new int[10];
	}

	public void add(int index, int number) throws ArrayIndexOutOfBoundsException {
		if (index < 0) {
			throw new ArrayIndexOutOfBoundsException("Indeks musi być większy od 0!");
		} else if (index >= numbers.length) {
			throw new ArrayIndexOutOfBoundsException(
					"Indeks musi być mniejszy od rozmiaru tablicy: " + numbers.length);
		}
		numbers[index] = number;
	}

	public int get(int index) throws ArrayIndexOutOfBoundsException {
		if (index < 0 || index >= numbers.length) {
			throw new ArrayIndexOutOfBoundsException(index);
		}
		return numbers[index];
	}
}

Istnieje również możliwość definiowania własnych wyjątków gdyby ktoś chciał. Potrzebne info do znalezienia w sieci.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *