Wyjątki - Exceptions
Mechanizm obsługi wyjątków służy do opanowania sytuacji, w których wystąpi błąd wynikający z nieprawidłowej implementacji kodu lub podania nieprawidłowych danych przez użytkownika.
Przykład, w którym wprowadzenie danej tekstowej zamiast liczby spowoduje wystąpienie wyjątku:
import java.util.Scanner;
public class ExceptionTestProgram0 {
public static void main( String[] args ) throws Exception {
Scanner scanner = new Scanner( System.in );
System.out.print( "Podaj wartość całkowitą: " );
System.out.println( "Podana wartość: " + scanner.nextInt() );
}
}
Po wpisaniu np. pojedynczej litery wystąpi wyjątek java.util.InputMismatchException.
Przykład ciekawszy, w którym użytkownik może podać indeks tablicy spoza dozwolonego zakresu (tablica ma tylko 3 elementy). Tym razem mogą wystąpić różne rodzaje wyjątków:
import java.util.Scanner;
public class ExceptionTestProgram1 {
public static void main( String[] args ){
int tablica[] = { 11, 22, 33 };
Scanner inputScanner = new Scanner( System.in );
int index = -1;
System.out.println("Podaj indeks tablicy: ");
index = inputScanner.nextInt(); // read subsequent characters until the string is convertable to int value - then omit following characters
System.out.println( tablica[index] ); // display the value of tablica[index]
}
}
Jeśli użytkownik wprowadzi wartość spoza dozwolonego zakresu (czyli < 0 lub > 2), wówczas pojawi się następujący błąd:
Podaj indeks tablicy:
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at ExceptionTestProgram1.main(ExceptionTestProgram1.java:13)
Moglibyśmy próbować radzić sobie np. tak:
if( index>=0 && index<tablica.length )
System.out.println( tablica[index] );
else
System.out.println( "Nieprawidłowa wartość." );
Ale co stanie się, jeśli użytkownik zamiast liczby poda literę?
Czas na zastosowanie obsługi wyjątków za pomocą bloku try{} catch( … )
try {
System.out.println( tablica[index] );
} catch ( ArrayIndexOutOfBoundsException e ) {
System.out.println( "Nieprawidłowa wartość." );
}
można także spróbować przechwycić ogólniejszy wyjątek IndexOutOfBoundsException...
Wygląda to może mniej czytelnie niż rozwiązanie z instrukcją if, ale trzeba zauważyć, że użyteczność rośnie wraz z rozbudową kodu w bloku try{ } oraz rosnącą ilością sytuacji wyjątkowych, które mogą nastąpić.