Try y Catch

Tipos de datos y excepciones en Java

Jim White

Java Developer

Problemas en Java

  • En las aplicaciones pueden surgir problemas o fallos
    • Por una entrada incorrecta
    • Por errores de código
    • Por circunstancias imprevistas
  • A los problemas o fallos se les llama excepciones
    • Interrumpen el flujo normal de control
  • Java lanza excepciones
Tipos de datos y excepciones en Java

Ejemplo de excepción

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
Tipos de datos y excepciones en Java

Try

  • Envuelve el código que puede generar excepciones con un bloque try
    • "Prueba este código y, si hay un problema, pásalo al bloque catch"
try {
    // Sentencias a ejecutar y vigilar por excepciones
}
Tipos de datos y excepciones en Java

Catch

  • Coloca un bloque catch después de try
    • Actúa como manejador para tratar las excepciones
    • La excepción capturada se pasa a este bloque como parámetro
  • Los bloques try/catch son obligatorios para algunos tipos de excepciones
    • Opcionales para otros
try {
    // Sentencias a ejecutar y vigilar por excepciones
} catch (<Exception type> <variable name>) {
    // Sentencias a ejecutar si ocurre una excepción
}
Tipos de datos y excepciones en Java

Capturar 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
Tipos de datos y excepciones en Java

Varios catch

  • Usa varios bloques catch para manejar distintos tipos de excepciones
  • Cada catch tiene su propio tipo de excepción y variable de excepción
  • Cuando ocurre una excepción, Java revisa los catch en orden hasta encontrar coincidencia
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
Tipos de datos y excepciones en Java

Catch "general"

  • Usa catch (Exception variable){ } como comodín
    • Maneja cualquier excepción no cubierta por los otros catch
try {
    // Código a probar
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Oops - wrong index");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops - String not a number");
} catch (Exception e) { // Maneja todas salvo las dos anteriores
    System.out.println("Pasó algo imprevisto");
}
Tipos de datos y excepciones en Java

Finally

  • El código en el bloque finally siempre se ejecuta
// Cuando ocurre una excepción
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Haciendo limpieza");
}
Oops
Haciendo limpieza

 

// Cuando no se lanza ninguna excepción
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Oops");
} finally {
    System.out.println("Haciendo limpieza");
}
Haciendo limpieza
Tipos de datos y excepciones en Java

Objeto Exception

  • El objeto Exception pasado al bloque catch contiene mucha información
  • Usa sus métodos para saber qué falló
    • .getMessage() para obtener la causa legible
    • .getClass() para obtener la clase o tipo de la excepción
    • .printStackTrace() para mostrar el stack trace (siguiente diapositiva)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Tipos de datos y excepciones en Java

Stack trace de una excepción

  • El stack trace registra el flujo de ejecución hasta el problema
    • Abajo: salida del ejemplo anterior, incluida la traza de pila impresa
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)
Tipos de datos y excepciones en Java

¡Vamos a practicar!

Tipos de datos y excepciones en Java

Preparing Video For Download...