English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriais Básicos de Java

Java controle de fluxo

Java array

Java orientação a objetos (I)

Java orientação a objetos (II)

Java orientação a objetos (III)

Tratamento de Exceções Java

Java lista (List)

Java fila (Queue)

Java conjuntos Map

Java conjuntos Set

Java entrada e saída (I/O)

Java Reader/Writer

Outros tópicos do Java

Java captura e lida com múltiplas exceções

Neste tutorial, vamos aprender, com exemplos, como lidar com múltiplas exceções no Java.

em Java 7Antes disso, mesmo que houvesse código redundante, tínhamos que escrever vários códigos de tratamento de exceções para diferentes tipos de exceções.

Vamos dar um exemplo.

Exemplo1:多个捕获块

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    } catch (ArithmeticException e) {
      System.out.println(e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    } 
  }
}

Saída de Dados

/ por zero

Neste exemplo podem ocorrer duas exceções:

  • ArithmeticException -  porque tentamos dividir um número por zero.

  • ArrayIndexOutOfBoundsException -  porque já declaramos um novo array de inteiros, o limite do array é de 0 a9e tentamos atribuir para o índice10atribuir um valor.

Nós imprimimos a mensagem de exceção em dois blocos catch, ou seja, código repetido.

A associação do operador de atribuição (=) é da direita para a esquerda, portanto, primeiro ArithmeticException com a mensagem / por zero começou a lançar.

Tratar várias exceções no bloco catch

No Java SE 7e versões mais recentes, agora podemos capturar vários tipos de exceções em um único bloco catch.

Cada tipo de exceção que pode ser tratada pelo bloco catch é separado por um pipe (|).

Sua sintaxe é:

try {
  // código
} catch (TipoDeExceção1 | tipoDeExceção2 ex) { 
  // bloco catch
}

Exemplo2:单个catch块中捕获多个异常

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Saída de Dados

/ por zero

Capturar várias exceções em um único bloco catch pode reduzir a repetição de código e aumentar a eficiência.

O código byte gerado ao compilar o programa será menor do que o programa com vários blocos catch, pois não há código redundante.

Atenção:Se um bloco catch lidar com várias exceções, o parâmetro catch é implicitamente final. Isso significa que não podemos atribuir qualquer valor para capturar o parâmetro.

捕获基本异常

Quando capturamos várias exceções em um único bloco catch, essa regra se generaliza para a regra especializada.

Isso significa que, se houver uma hierarquia de exceções no bloco catch, podemos capturar apenas a exceção básica e não várias exceções especializadas.

Vamos dar um exemplo.

Exemplo3:仅捕获基本异常类

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }
}

Saída de Dados

/ por zero

Sabemos que todas as classes de exceção são subclasses da classe Exception. Portanto, não precisamos capturar várias exceções especializadas, mas apenas a classe Exception.

Se já especificou a classe básica de exceção no bloco catch, não use subclasses de exceção no mesmo bloco catch. Caso contrário, teremos um erro de compilação.

Vamos dar um exemplo.

Exemplo4Capturar a classe base de exceções e subclasses

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10]= 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Saída de Dados

Main.java:6: erro: Alternativas em um multi-A declaração catch não pode ser relacionada por subclassing

Neste exemplo, ArithmeticException e ArrayIndexOutOfBoundsException são subclasses da classe Exception. Portanto, lançamos um erro de compilação.