Capturando uma Exception com try e catch

Fique preparado para diversas perguntas no exame que incluam o controle de fluxo como parte do seu código, até mesmo aquelas que não estiverem ali analisando especificamente seu conhecimento sobre o assunto.

A especificação de Java estabelece que “uma exceção será lançada quando restrições semânticas forem violadas”, o que implica que exceção é lançada em situações que são não possíveis ou em violações sérias do comportamento admissível do sistema.

Então, precisamos de um modo de informar a JVM que código efetuar quando determinada exceção acontecer. Para fazer isso, usam-se as palavras-chave try e catch.

package br.com.devmedia;



import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;



public class ExceptionTratamento {



/**

* @param args

*/

public static void main(String[] args) {

try{

BufferedReader buffer = new BufferedReader(new FileReader("teste.txt"));

}catch (IOException e) {

System.out.println("Arquivo não encontrado "+ "teste.txt");

}



}



}

Um dos grandes benefícios da utilização da manipulação de exceções é que o código de manipulação de alguma exceção específica, que possa acontecer na região controlada, precisa ser escrito apenas uma única vez.

Bloco (finally)

O bloco finally vai definir o código que sempre será executado em algum local, após do bloco try, se uma exceção for ou não lançada.

Mesmo se acontecer uma instrução return no bloco try, o bloco finally será executado depois dessa instrução. Esse é o ponto ideal para fechar os arquivos, executar qualquer outra rotina de limpeza que seu código necessitar ou liberar os soquetes de rede.

Iremos avaliar o exemplo abaixo.

package br.com.devmedia;

public class X {

static X x1;

static X x2;

static int divisao(int a, int b){

return a/b;

}

/**

* @param args

*/

public static void main(String[] args) {

try{

System.out.println("Try sendo executado.");

x1 = new X();

x2 = new X();

dividir(7,0);

System.out.println("Esse ponto nunca será "+ "execultado");

}catch (ArithmeticException e) {

System.out.println("Catch sendo executado.");

}finally{

System.out.println("Finally sendo executado!");

}

}

}

Saída:
Try sendo executado.
Catch sendo executado.
Finally sendo executado!

O bloco finally não é obrigatório. Além disso, já que o compilador não determina nem mesmo cláusulas catch, em algumas situações você poderá se encontrar com um bloco try seguido imediatamente por um finally.

Veja o exemplo a seguir, de um try sem um catch, mas com um finally. A exceção é lançada, mas mesmo assim o bloco finally é efetuado.

package br.com.devmedia;

public class Y {

static Y a1;

static Y a2;

static int dividir(int a, int b){

return a/b;

}

/**

* @param args

*/

public static void main(String[] args) {

try{

System.out.println("Try em execução.");

a1 = new Y();

a2 = new Y();

dividir(4,0);

System.out.println("Esse local não será executado");

}finally{

System.out.println("Finally sendo executado!");

}

}

}

Saída:
Try em execucução.
Exception in thread "main" Finally sendo executado!
t1 está sujeito ao coletor de lixo
t2 está sujeito ao coletor de lixo
java.lang.ArithmeticException: / by zero
at br.com.devmedia.Y.dividir(Y.java:10)
at br.com.devmedia.Y.main(Y.java:21)

Não é considerado correto utilizar uma cláusula try sem um catch ou finally. Um try individual causa erro de compilação. Qualquer cláusula catch deve vir imediatamente após o try. Qualquer finally precisa vir imediatamente após a última cláusula catch, ou deve seguir logo após o try, na inexistência de catch.

Na continuação desse artigo trataremos um pouco mais de Exception, suas definições e sua API.


Leia todos artigos da série