domingo, 18 de maio de 2014

Erros e exceções em Java

Definição de Exceções em java

São várias as possibilidades de um código gerar um erro, por exemplo, se você faz um programa que lê um número informado pelo usuário e o usuário digita uma letra.

Confira este exemplo abaixo:

Se o usuário digitar um número o programa é executado como deveria:


Agora veja o que acontece quando o usuário digita uma letra ao invés de um número:


Quando não tratamos este erro o programa simplesmente para de funcionar e podemos ver no console que uma Exception é gerada: InputMismatchException.

A documentação da classe Scanner diz que o método nestInt( ) lança esta Exception se o próximo valor não corresponde a um número inteiro.

Nesta documentação você também pode conferir várias outras Exception que os métodos da classe Scanner podem lançar. Mas o que é uma Exception?

A Exception é uma subclasse Throwable que por sua vez é uma subclasse de Object. A Exception e suas subclasses representam exceções que podem ocorrer em um programa e desta maneira podemos captura-las e trata-las. Exceções como vimos no exemplo em que um método espera um número inteiro e o usuário digita uma letra.

Sendo assim, uma exceção é uma ocorrência que altera o fluxo do programa. As exceções podem ocorrer por falhas de hardware, exaustão de recursos e erros.

“Todas as classes de exceção do java herdam direta ou indiretamente da classe Exception, formando uma hierarquia de herança. Você pode estender essa hierarquia com suas próprias classes de exceção.”  (DEITEL & DEITEL. Java – como programar. 8a Edição, Bookman, 2012)

Ou seja, você pode criar suas próprias classes de exceção aplicando o conceito de herança da classe Exception.

Veja a hierarquia de exceções em java:



Exceções verificadas e não verificadas

Toda exceção verificada deriva da classe Exception.

As não verificadas ou não-checadas derivam da class RuntimeException.

Throwable – é o pai de todas as exceções.

Error – não são exceções e sim erros que jamais poderiam ter acontecido. Ex.: estouro da memória.

Exception- as classes que deveriam aqui, lançam exceções e não erros de programação.

Exemplo: tentar abrir um arquivo que não existe. Então é lançado uma exceção verificada, porque a classe de leitura de arquivos deriva de Exception.

RuntimeException – são exceções que indicam erros de programas (não de lógica, pois senão não passaria pelo compilador). Esse tipo de exceção é conhecido como não verificada. Sendo assim, não é requisito declarar uma cláusula try{} e catch{}. Ex.: tentar converter “dois” em “2”.

Alguns exemplos de exceções já definidas no pacote java.lang incluem:

ArithmeticException: indica situações de erros em processamento aritmético, tal como uma divisão inteira por 0. A divisão de um valor real por 0 não gera uma exceção (o resultado é o valor infinito);

NumberFormatException: indica que tentou-se a conversão de uma String para um formato numérico, mas seu conteúdo não representava adequadamente um número para aquele formato. É uma subclasse de IllegalArgumentException;

IndexOutOfBounds: indica a tentativa de acesso a um elemento de um agregado aquém ou além dos limites válidos. É a superclasse de ArrayIndexOutOfBoundsException, para arranjos, e de StringIndexOutOfBounds, para strings;

NullPointerException: indica que a aplicação tentou usar uma referência a um objeto que não foi ainda definida;

ClassNotFoundException: indica que a máquina virtual Java tentou carregar uma classe mas não foi possível encontrá-la durante a execução da aplicação.

Além disso, outros pacotes especificam suas exceções, referentes às suas funcionalidades. Por exemplo, no pacote java.io define-se IOException, que indica a ocorrência de algum tipo de erro em operações de entrada e saída. É a superclasse para condições de exceção mais específicas desse pacote, tais como EOFException (fim de arquivo ou stream), FileNotFoundException (arquivo especificado não foi encontrado) e InterruptedIOException (operação de entrada ou saída foi interrompida).

Uma exceção contém pelo menos uma string que a descreve, que pode ser obtida pela aplicação do método getMessage(), mas pode eventualmente conter outras informações. Por exemplo, InterruptedIOException inclui um atributo público do tipo inteiro, bytesTransferred, para indicar quantos bytes foram transferidos antes da interrupção da operação ocorrer. Outra informação que pode sempre ser obtida de uma exceção é a seqüência de métodos no momento da exceção, obtenível a partir do método printStackTrace().

Agora veremos abaixo a estrutura de como tratar um erro ou exceção:

try - é usada para indicar um bloco de código que possa ocorrer uma exceção.

catch – serve para manipular as exceções, ou seja, tratar o erro.

finally – sempre será executado depois do bloco try/catch. O importante é saber que esse bloco sempre será executado (exceto nos casos de encerramento da jvm System.exit()).

Veja abaixo as combinações válidas e inválidas para o uso do try{}, cacth{} e finally{} (isso é questão de certificação).

Combinações válidas:

try{}
catch{}
try{}
finally{}
try{}
catch{}
finally{}

Inválidas não Compila:

try{}
catch{}
finally{}
try{}
finally{}
catch{}

As palavras try e catch servem para informar a JVM o que fazer quando ocorrer uma exceção.

Os blocos catch devem aparecer após o try (isso é um requisito); entre os blocos não podem possuir nenhuma instrução.

Quando uma exceção é identificada no try{} o restante do código não é executado e não há um retorno para o término do código.

Exercício de tratamento de exceção:

Voltando ao exercício que iniciamos no inicio do texto, vejamos como poderíamos tratar a exceção para o usuário que digita uma letra ao invés de um número:


No bloco try { } colocamos todo o nosso código anterior, principalmente a parte que pode gerar a exceção. Já no bloco catch temos a impressão da Exception e uma mensagem para o usuário explicando que o mesmo deve informar um número.

Perceba que agora o programa não para de rodar quando o usuário digita uma letra. O que acontece é que a Exception é capturada, impressa e uma mensagem para o usuário o alerta para o erro.

Você pode aprender mais sobre tratamento de exceções no vídeo a seguir:


E para testar o que aprendeu vamos a um exercício:


Uma ArithmeticException é lançada na ocorrência de algum erro matemático, como por exemplo a divisão por zero. Faça um programa que lê dois números e mostre o resultado da divisão destes. Realize o tratamento para a exceção ArithmeticException.

Bibliografia

Livro:

DEITEL & DEITEL. Java – como programar. 8a Edição, Bookman, 2012

Site:

Java – Blog Camilo Lopes

DEVMEDIA

DEVMEDIA
http://www.devmedia.com.br/trabalhando-com-excecoes-em-java/27601


Grupo:

Eduardo Tanaka
Rodrigo Rocillo
Vanks Estevão
Vitório Lima


Nenhum comentário:

Postar um comentário