Você está na página 1de 3

1

Diferena entre Checked e Unchecked Exceptions


em Java
O tratamento de excees indispensvel para tornar uma aplicao robusta, isso porque o usurio no quer
ver um StackTrace na sua tela, mas sim uma mensagem bem escrita apontando que apenas ocorreu um erro.
Para nos situarmos um pouco mais na importncia desse tipo de tratamento podemos citar o prprio Sistema
Operacional Windows. Voc sabe porque a famosa tela azul da morte azul ? Porque foi comprovado
cientificamente, que o azul transparece calma ao usurio, deixando o mesmo mais tranquilo. Imagine se a
tela azul da morte fosse vermelha ? Tente pensar no pnico que causaria a apresentao desta tela.
Enfim, toda e qualquer aplicao est sujeita a falhas, e por conta disso, toda e qualquer aplicao tambm
precisa de tratamento dessas falhas.
O objetivo deste artigo mostrar um pouco mais sobre o tratamento de excees em Java, mais
especificamente para exemplificar a diferena entre excees Checked e Unchecked.
Checked e Unchecked Exceptions
A principal pergunta do desenvolvedor neste ponto : Essa exceo checked ou unchecked ? A minha
exceo checked ou unchecked ? Como tornar uma exceo checked ou unchecked ? Enfim, todas essas
perguntas sero respondidas ao longo deste artigo.
Resumidamente as excees Checked so aquelas no qual voc obrigado a trat-la, seja com um bloco try-
catch ou mesmo com um throws (relanando a mesma para outro local). Por outro lado, quando voc tem
excees do tipo Unchecked no obrigatrio o tratamento da mesma, voc pode tratar apenas se quiser, se
sentir que necessrio para o bom funcionamento da sua aplicao.
Checked exceptions so utilizadas para erros recuperveis enquanto que Unchecked exceptions so
utilizadas para erros irrecuperveis. Significa dizer que quando voc sabe que seu erro pode ser tratado, voc
utiliza Checked Exceptions, caso contrrio utilize Unchecked Exceptions.
Para ilustrar isso, imagine que voc criou uma Exception chamada
ValorPagamentoMenorTaxaEmbarqueException, isso significa que quando o valor do pagamento for
menor que a taxa de embarque voc lanar uma Exception e tratar da forma que achar melhor, por
exemplo: Pedindo para o usurio aumentar o valor do pagamento. Essas so as Checked Exceptions, voc
sabe que o erro poder ocorrer e j sabe como corrigi-lo caso ocorra.
Por outro lado, imagine um NullPointerException inesperado na sua aplicao. Esse erro no pode ser
tratado, o erro ocorreu e pronto, voc deve apenas mostrar uma mensagem ao usurio dizendo que o erro
ocorreu, mas nada poder ser feito para corrigi-lo, se no reiniciar todo o processamento. Essas so as
Unchecked Exceptions, que geralmente so filhas de RuntimeException, isso porque estas so excees que
ocorrem em tempo de execuo (runtime) e no em tempo de design.
Quando voc cria um bloco de cdigo que exige que voc use try-catch ou throws, estar em frente a uma
tpica Checked Exception, diferente das RuntimeExceptions que s ocorrem em tempo de execuo e so
inesperadas. As Unchecked Exceptions pelo fato de no serem obrigatoriamente tratadas, automaticamente
relanam suas excees, ou seja, possuem throws implcito no mtodo que as criou.
2

Problemas
Ocorre em alguns casos, que este padro no bem aplicado, como o caso da API JDBC. Veja na listagem
1 o uso errado deste padro:
Listagem 1: JDBC utilizando excees de forma errnia
try {
PreparedStatement stmt = con.prepareStatement(query);
// ...
} catch (SQLException e) {

throw new AcessoADadosException("Problema na criao do Statement", e);

}
Voc deve estar familiarizado em sempre ter que fazer o try-catch ou throws ao usar a API JDBC, tratando
uma SQLException. Mas se voc parar para pensar, a SQLException uma exceo muito genrica e que na
maioria das vezes irrecupervel. Imagine por exemplo se o seu banco de dados queimou, como voc ir
recuperar isso ? No h como, apenas poder mostrar uma mensagem ao usurio.
Na listagem 1, transformamos a suposta Checked SQLException em uma Unchecked Exception atravs
do AcessoADadosException que apenas retornar uma mensagem com o erro e nada mais poder ser feito.
Acostume-se com essa falta de padronizao, pois poder encontrar muitos cdigos aplicados Checked no
lugar de Unchecked e vice-versa, mas conhecendo o conceito de ambos, voc poder facilmente realizar as
transformaes necessrias.
Exemplo Prtico
Para finalizarmos esse assunto, vamos aplicar os conceitos do artigo a um exemplo prtico, onde teremos a
seguinte situao: Nosso mtodo tentar escrever um arquivo em uma pasta A, porm caso ocorre algum
erro de IOException ( um Checked Exception) ns tentaremos gravar na Pasta Alternativa. Porque isso ?
Imagine que a pasta A no computador do usurio pode estar sem permisso de escrita, e para no perdemos
o arquivo vamos gravar na pasta Alternativa que sabemos que sempre ter permisso de escrita em qualquer
dos casos. Depois podemos pegar todos os arquivos que ficaram na pasta alternativa e coloc-los na pasta B
manualmente, porm no perderemos o processamento.
Na listagem 2 voc ver o cdigo do caso descrito acima.
Listagem 2: Exemplo real de um Checked Exception
private void criaArquivo(String pathAlternativo) {
File arquivo = null;
try {

SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");

if (pathAlternativo.equals(""))
arquivo = new File("/home/admin/Documentos/arquivo_" +
fmt.format(new Date()) );
else
arquivo = new File(pathAlternativo+"arquivo_" +
fmt.format(new Date()) );

BufferedWriter writer = new BufferedWriter(new
FileWriter(arquivo));
writer.write("Linha 001");
writer.close();
3

} catch (IOException e ) {
if (arquivo != null){
if (arquivo.exists()){
arquivo.delete();
criaArquivo("/home/admin/PathAlternativo/");
}
}
}
}
Poderiamos at melhorar um pouco o cdigo acima colocando 1 Exception genrico, assim qualquer coisa
que no fosse um IOException poderiamos tratar como um Unchecked Exception, pois seria um erro
irrecupervel e nada poderamos fazer.
CONCLUSO
muito provvel que a maioria dos profissionais no conheam a real utilizao do conceito descrito neste
artigo, isso porque por muita das vezes este passa despercebido e sem uma utilidade visvel. Porm com o
aprendizado deste, fica muito mais fcil entender a real aplicao (baseada nas boas prticas de
programao) das exceptions.