Try och Catch

Datatyper och undantag i Java

Jim White

Java Developer

Problem i Java

  • Problem kan uppstå i applikationer
    • På grund av felaktig inmatning
    • På grund av kodfel
    • På grund av oförutsedda omständigheter
  • Problem kallas undantag (exceptions)
    • Avbryter det normala kontrollflödet
  • Java kastar undantag
Datatyper och undantag i Java

Exempel på undantag

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
Datatyper och undantag i Java

Try

  • Omge undantagsgenererande kod med ett try-block
    • "Prova den här koden och om något går fel, skicka det till catch-blocket"
try {
    // Statements to be executed and watched for exceptions
}
Datatyper och undantag i Java

Catch

  • Placera ett catch-block efter try
    • Fungerar som en hanterare för undantaget
    • Det fångade undantaget skickas in i blocket som en parameter
  • try/catch-block krävs för vissa typer av undantag
    • Valfritt för andra
try {
    // Statements to be executed and watched for exceptions
} catch (<Exception type> <variable name>) {
    // Statements to execute if an exception has occurred
}
Datatyper och undantag i Java

Fånga 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
Datatyper och undantag i Java

Flera catch-block

  • Använd flera catch-block för att hantera olika typer av undantag
  • Varje catch får sin egen undantagstyp och undantags­variabel
  • När ett undantag inträffar kontrollerar Java catch-blocken i ordning tills en matchning hittas
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
Datatyper och undantag i Java

Catch-all

  • Använd catch (Exception variable){ } som ett generellt fall
    • Hanterar alla undantag som inte fångas av de andra catch-blocken
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");
}
Datatyper och undantag i Java

Finally

  • Kod i finally-blocket körs alltid
// 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
Datatyper och undantag i Java

Undantagsobjektet

  • Objektet Exception som skickas in i catch-blocket innehåller rik information
  • Använd metoder på objektet för att ta reda på mer om vad som gick fel
    • .getMessage() för att få en läsbar beskrivning av orsaken
    • .getClass() för att hämta undantagsklassens namn eller typ
    • .printStackTrace() för att visa stackspårningen (nästa bild)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Datatyper och undantag i Java

Stackspårning för undantag

  • Stackspårningen visar körningsflödet fram till problemet
    • Nedan: utdata från föregående kodexempel – inklusive den utskrivna stackspårningen
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)
Datatyper och undantag i Java

Nu kör vi en övning!

Datatyper och undantag i Java

Preparing Video For Download...