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ć.