Try e Catch

Tipos de Dados e Exceções em Java

Jim White

Java Developer

Problemas em Java

  • Problemas podem ocorrer em aplicações
    • Por entrada incorreta
    • Por erros de código
    • Por circunstâncias imprevistas
  • Esses problemas são chamados de exceções
    • Interrompem o fluxo normal de controle
  • Java lança exceções
Tipos de Dados e Exceções em Java

Exemplo de exceção

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 Dados e Exceções em Java

Try

  • Envolva o código que gera exceção com um bloco try
    • "Tente este código e, se houver problema, passe para o catch"
try {
    // Instruções a executar e monitorar por exceções
}
Tipos de Dados e Exceções em Java

Catch

  • Coloque um bloco catch após o try
    • Age como handler para tratar exceções
    • A exceção capturada é passada como parâmetro
  • Blocos try/catch são obrigatórios para alguns tipos
    • Opcionais para outros
try {
    // Instruções a executar e monitorar por exceções
} catch (<Exception type> <variable name>) {
    // Instruções a executar se ocorrer uma exceção
}
Tipos de Dados e Exceções em Java

Capturando 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("Ops - índice incorreto");
}
Ops - índice incorreto
Tipos de Dados e Exceções em Java

Vários Catch

  • Use vários blocos catch para tratar tipos diferentes de exceções
  • Cada catch tem seu próprio tipo e variável de exceção
  • Quando ocorre uma exceção, o Java verifica os catch em ordem até achar um correspondente
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("Ops - índice incorreto");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Ops - String não é número");
}
Ops - String não é número
Tipos de Dados e Exceções em Java

Catch "geral"

  • Use catch (Exception variable){ } como um captura-tudo
    • Trata qualquer exceção não tratada pelos outros catches
try {
    // Código a tentar
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Ops - índice incorreto");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops - String não é número");
} catch (Exception e) { // Trata todas as exceções exceto as duas acima
    System.out.println("Aconteceu algo não previsto");
}
Tipos de Dados e Exceções em Java

Finally

  • O código em finally sempre é executado
// Quando ocorre exceção
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops");
} finally {
    System.out.println("Fazendo limpeza");
}
Ops
Fazendo limpeza

 

// Quando nenhuma exceção é lançada
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops");
} finally {
    System.out.println("Fazendo limpeza");
}
Fazendo limpeza
Tipos de Dados e Exceções em Java

Objeto Exception

  • O objeto Exception passado ao catch traz muitas informações
  • Use métodos do objeto para entender o erro
    • .getMessage() para obter a causa legível
    • .getClass() para obter a classe/tipo da exceção
    • .printStackTrace() para exibir o stack trace (próximo slide)
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 Dados e Exceções em Java

Stack trace da exceção

  • O stack trace registra o fluxo de execução até o problema
    • Abaixo: saída do exemplo anterior — incluindo o stack trace impresso
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 Dados e Exceções em Java

Vamos praticar!

Tipos de Dados e Exceções em Java

Preparing Video For Download...