Try en Catch

Gegevenstypen en uitzonderingen in Java

Jim White

Java Developer

Problemen in Java

  • In apps kunnen problemen optreden
    • Door verkeerde input
    • Door codefouten
    • Door onvoorziene situaties
  • Deze problemen heten exceptions
    • Onderbreken de normale flow
  • Java gooit exceptions
Gegevenstypen en uitzonderingen in Java

Exception-voorbeeld

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
Gegevenstypen en uitzonderingen in Java

Try

  • Omhul code die een exceptie kan geven met een try-blok
    • "Probeer deze code; bij een probleem gaat het naar de catch"
try {
    // Statements om uit te voeren en op excepties te letten
}
Gegevenstypen en uitzonderingen in Java

Catch

  • Plaats een catch-blok na de try
    • Werkt als handler voor excepties
    • De exception wordt als parameter doorgegeven
  • try/catch is vereist voor sommige excepties
    • Optioneel voor andere
try {
    // Statements om uit te voeren en op excepties te letten
} catch (<Exception type> <variable name>) {
    // Statements bij een opgetreden exceptie
}
Gegevenstypen en uitzonderingen in Java

IndexOutOfBoundsException afvangen

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("Oeps - verkeerde index");
}
Oeps - verkeerde index
Gegevenstypen en uitzonderingen in Java

Meerdere catch-blokken

  • Gebruik meerdere catch-blokken voor verschillende excepties
  • Elke catch heeft een eigen exceptietype en variabele
  • Bij een exceptie checkt Java de catch-blokken op volgorde tot er een match is
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("Oeps - verkeerde index");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Oeps - String is geen getal");
}
Oeps - String is geen getal
Gegevenstypen en uitzonderingen in Java

Catch-"all"

  • Gebruik catch (Exception variable){ } als vangnet
    • Handelt elke exceptie af die niet door eerdere catches is afgehandeld
try {
    // Code om te proberen
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oeps - verkeerde index");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oeps - String is geen getal");
} catch (Exception e) { // Handelt alles af behalve de twee hierboven
    System.out.println("Er gebeurde iets onverwachts");
}
Gegevenstypen en uitzonderingen in Java

Finally

  • Code in het finally-blok voert altijd uit
// Als er een exceptie optreedt
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oeps");
} finally {
    System.out.println("Opschonen");
}
Oeps
Opschonen

 

// Als er geen exceptie wordt gegooid
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oeps");
} finally {
    System.out.println("Opschonen");
}
Opschonen
Gegevenstypen en uitzonderingen in Java

Exception-object

  • Het Exception-object in de catch is rijk aan info
  • Gebruik methoden om te zien wat er misging
    • .getMessage() voor de leesbare oorzaak
    • .getClass() voor de exceptieklasse/-typenaam
    • .printStackTrace() om de stacktrace te tonen (volgende slide)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Gegevenstypen en uitzonderingen in Java

Exception stacktrace

  • De stacktrace laat het uitvoeringspad naar het probleem zien
    • Hieronder: output van het vorige codevoorbeeld - inclusief de geprinte stacktrace
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)
Gegevenstypen en uitzonderingen in Java

Laten we oefenen!

Gegevenstypen en uitzonderingen in Java

Preparing Video For Download...