Multi-catch (Java 7)

Algo chato que tínhamos que fazer nas versões anteriores de Java era o tratamento individual de cada exceção ou utilizar uma classe mais abrangente (Exception, por exemplo) para realizar o tratamento de todas as possíveis exceções. Nessa versão podemos colocar dentro de um único catch, várias Exceptions apenas separando pelo "ou" (pipe "|"). De maneira sucinta, podemos transformar isso:

		try {
			System.out.println(10 / 0);
		} catch (ArithmeticException e) {
			System.out.println("Erro: " + e.getMessage());
		} catch (IllegalArgumentException e) {
			System.out.println("Erro: " + e.getMessage());
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("Erro: " + e.getMessage());
		}

No seguinte código:

		try {
			System.out.println(10 / 0);
		} catch (ArithmeticException | IllegalArgumentException | ArrayIndexOutOfBoundsException e) {
			System.out.println("Erro: " + e.getMessage());
		}

Pontos importantes:

  1. A variável declarada dentro do catch é sempre final. Ou seja, não podemos atribuir valores à ela.
  2. Como nas outras versões do Java, as variáveis dentro do catch precisam ser filhas de Throwable
  3. Se mais de uma variável for declarada, elas não podem ser do mesmo subtipo da outra. Por exemplo: se A está declarada FilhaDeA (extends A) não pode ser declarada no mesmo catch.

Portanto o seguinte código não compila:

		try {
			int a = 0;
			if(a==0) {
				throw new FilhaDeA();
			} else {
				throw new A();
			}
		} catch (FilhaDeA | A e) {
			System.out.println("Erro: " + e.getMessage());
		}

Como FilhaDeA é filha da classe A (extends A), todas as exceções do tipo A (inclusive FilhaDeA) já são capturadas com a declaração de A no catch. Por esse motivo o código não é compilável.

Dessa maneira o tratamento de erros se torna mais simplificado e melhora a legibilidade de código.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6