Try i Catch

Typy danych i wyjątki w Javie

Jim White

Java Developer

Problemy w Javie

  • W aplikacjach mogą wystąpić problemy
    • Spowodowane błędnymi danymi wejściowymi
    • Spowodowane błędami w kodzie
    • Spowodowane nieprzewidzianymi okolicznościami
  • Problemy te nazywane są wyjątkami
    • Przerywają normalny przepływ sterowania
  • Java rzuca wyjątki
Typy danych i wyjątki w Javie

Przykład wyjątku

public static void main(String[] args) {
    ArrayList<String> allStars = new ArrayList<String>();
    allStars.add("Mays");
    allStars.add("Aaron");
    allStars.add("Ruth");
    String last = allStars.get(3); // This will cause an exception
    System.out.println(last);
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of 
bounds for length 3
Typy danych i wyjątki w Javie

Try

  • Otocz kod generujący wyjątki blokiem try
    • „Spróbuj wykonać ten kod, a jeśli wystąpi problem, przekaż go do bloku catch"
try {
    // Statements to be executed and watched for exceptions
}
Typy danych i wyjątki w Javie

Catch

  • Umieść blok catch po bloku try
    • Działa jako handler obsługujący wyjątki
    • Przechwycony wyjątek jest przekazywany do tego bloku jako parametr
  • Bloki try/catch są wymagane dla niektórych typów wyjątków
    • Dla innych są opcjonalne
try {
    // Statements to be executed and watched for exceptions
} catch (<Exception type> <variable name>) {
    // Statements to execute if an exception has occurred
}
Typy danych i wyjątki w Javie

Przechwytywanie IndexOutOfBoundsException

try {
  ArrayList<String> allStars = new ArrayList<String>();
  allStars.add("Mays");
  allStars.add("Aaron");
  allStars.add("Ruth");
  String last = allStars.get(3); // Accessing an element that isn't there
  System.out.println(last);
} catch (IndexOutOfBoundsException e) {
  System.out.println("Oops - wrong index");
}
Oops - wrong index
Typy danych i wyjątki w Javie

Wiele bloków Catch

  • Użyj wielu bloków catch do obsługi różnych typów wyjątków
  • Każdy catch ma własny typ wyjątku i zmienną wyjątku
  • Gdy wystąpi wyjątek, Java sprawdza bloki catch po kolei, aż znajdzie dopasowanie
try {
    ArrayList<String> nums 
      = new ArrayList<String>();
    nums.add("one");
    String last = nums.get(0);
    Integer.valueOf(last);
    System.out.println(last);
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oops - wrong index");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Oops - String not a number");
}
Oops - String not a number
Typy danych i wyjątki w Javie

Catch „wszystkiego"

  • Użyj catch (Exception variable){ } jako bloku ogólnego
    • Obsługuje każdy wyjątek nieprzechwycony przez pozostałe bloki catch
try {
    // Code to try
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oops - wrong index");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops - String not a number");
} catch (Exception e) { // Handles all exceptions except the two above
    System.out.println("Something unplanned happened");
}
Typy danych i wyjątki w Javie

Finally

  • Kod w bloku finally zawsze jest wykonywany
// When exception happens
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Doing cleanup");
}
Oops
Doing cleanup

 

// When no exception gets thrown
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Doing cleanup");
}
Doing cleanup
Typy danych i wyjątki w Javie

Obiekt wyjątku

  • Obiekt Exception przekazany do bloku catch zawiera szczegółowe informacje
  • Użyj metod obiektu, aby dowiedzieć się więcej o błędzie
    • .getMessage() — czytelny opis przyczyny
    • .getClass() — klasa lub nazwa typu wyjątku
    • .printStackTrace() — wyświetla stos wywołań (następny slajd)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Typy danych i wyjątki w Javie

Stos wywołań wyjątku

  • Stos wywołań rejestruje przebieg wykonania aż do miejsca błędu
    • Poniżej: wynik z poprzedniego przykładu — wraz z wydrukowanym stosem wywołań
For input string: "one"
java.lang.NumberFormatException: For input string: "one"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:661)
    at java.base/java.lang.Integer.valueOf(Integer.java:988)
    at foo/exceptions.ExceptionExample.main(ExceptionExample.java:7)
Typy danych i wyjątki w Javie

Czas na ćwiczenia!

Typy danych i wyjątki w Javie

Preparing Video For Download...