Tratamento de Excees
Indicam problemas decorrentes do projeto ou implementao. Ex.: ndice excede os limites de um vetor.
Excees Verificadas
Excees no Verificadas
Excepo
Um Erro (Error) em Java corresponde a uma situao para a qual nenhuma recuperao j possvel.
Descreve erros internos e a exausto de recursos durante a execuo do programa. Pouco se pode fazer se um erro interno desses ocorrer, alm de notificar o utilizador e tentar finalizar o programa adequadamente. Essas situaes so bastante raras.
Uma Exceo (Exception) corresponde a uma situao para a qual a recuperao possvel. um sinal gerado (lanado) pela mquina virtual de Java em tempo de execuo do programa, indicando a ocorrncia de um erro recupervel. A captura e o tratamento de Excees contribui para a proclamada robustez do cdigo dos programas Java, a par da tipificao dos dados e o modelo de memria sem apontadores.
Muitos tipos de erros podem provocar uma excepo, como por exemplo:
Tentar acessar uma tabela fora de seus limites, Tentar abrir um arquivo inexistente,
cdigo responsvel pelo tratamento das situaes anmalas podem acontecer no programa.
que
Separao entre o tratamento de erros e o algoritmo. Propagao dos erros atravs da pilha de execuo dos
Lanamento de Exceo
Quando ocorre um erro recupervel dentro de um mtodo, este cria um objeto da classe Exception e passa este objeto para o sistema de execuo do Java (runtime) - lana uma Exceo.
Este objeto contm informaes sobre a exceo (seu tipo e o estado do programa quando o erro ocorreu). A partir deste momento, o sistema de execuo do Java responsabiliza-se por encontrar o cdigo que trate o erro ocorrido. O sistema passa a procurar o cdigo capaz de tratar a exceo. A lista de candidatos para este tratamento vem da pilha de chamadas de mtodos que antecederam o mtodo que lanou a exceo. O sistema de execuo do Java percorre a pilha de chamadas, e comea com o prprio mtodo onde ocorreu o erro, na busca de um mtodo que possua um gestor de Exceo (catch) adequado.
Prof.Jlio Conway - LTPII
Captura de Exceo
Se a exceo no for tratada e chegar funo main, o programa ser interrompido com uma mensagem de erro.
Um gestor de excepo considerado adequado quando a excepo que ele manipula do mesmo tipo da excepo lanada.
Quando ele encontrado, recebe o controle do programa para que possa tratar o erro ocorrido. Em outras palavras, diz-se que ele capturou a exceo (catch the exception). Se nenhum dos mtodos pesquisados pelo sistema de execuo possui um gestor de excees adequado, ento o programa Java em questo abruptamente encerrado.
Tratamento de Excees
A linguagem Java permite a descrio de situaes de exceo de uma forma normalizada atravs da utilizao de 5 palavras chave correspondentes a clusulas especiais, a saber:
try {
.. finally { }
Num bloco try passaremos a ter a possibilidade de detectar a ocorrncia de alguns possveis erros no cdigo.
catch(Identificador_da_excepo var_exc1)
aqui escrito o cdigo de tratamento da exceo identificada na clusula catch. var_exc1 instncia da exceo que foi gerada (e que pode ser usada).
Podemos ter inmeras clusulas catch para o mesmo bloco try, cada uma correspondendo a uma classe de exceo diferente.
Qualquer mtodo tem a possibilidade de o fazer usando a clusula throw e criando uma
instncia de uma dada excepo usando new. A linguagem Java requer que qualquer mtodo que possa provocar a ocorrncia de uma excepo normal, faa:
Exemplo1
(sem tratamento de Exceo)
class Ex1{ e calcula a sua diviso public static int divide(int a, int b) { return a/b; } public static void main(String[] args) { int num1, num2; System.out.println("Introduza o primeiro nmero"); num1=Le.umInt(); System.out.println("Introduza o segundo nmero"); num2=Le.umInt();
Exemplo2
(com tratamento de Exceo no main)
class Ex2{ public static int divide(int a, int b) { Programa que l dois inteiros return a/b; e calcula a sua diviso } public static void main(String[] args) { int num1, num2; System.out.println("Introduza o primeiro nmero"); num1=Le.umInt(); System.out.println("Introduza o segundo nmero"); num2=Le.umInt(); try { System.out.println(num1+ " / " + num2 + " = "+ divide(num1,num2)); } catch (ArithmeticException e) { System.out.println("No possivel divisao por 0 "); } Quando num2 igual a 0, aparece a seguinte }} mensagem:
No possivel divisao por 0 Finished executing Quando executado o programa no termina, mais robusto !
Exemplo3
(com captura de Exceo no divide)
class Ex3{ public static int divide(int a, int b) { Programa que l dois inteiros try{ e calcula a sua diviso return a/b; } catch (ArithmeticException e) { System.out.println("No possivel divisao por 0 "); return -1; // no boa soluo } } public static void main(String[] args) { int num1, num2; System.out.println("Introduza o primeiro nmero"); num1=Le.umInt(); System.out.println("Introduza o segundo nmero"); num2=Le.umInt(); int res = divide(num1,num2); if (res!=-1)System.out.println(num1+ " / " + num2 + " = "+ res); } }
Quando num2 igual a 0, aparece a seguinte mensagem:
Exemplo4
class public static int divide(int a, int b) throws ArithmeticException { try{ No obrigatrio para return a/b; RunTimeException } catch (ArithmeticException e){ System.out.print("Erro: "); throw e; } } public static void main(String[] args) { int num1, num2; System.out.println("Introduza o primeiro nmero"); num1=Le.umInt(); System.out.println("Introduza o segundo nmero"); num2=Le.umInt(); try { System.out.println(num1+ " / " + num2 + " = "+ divide(num1,num2)); } catch (ArithmeticException e) { System.out.println("No possivel " + e.getMessage()); } } }
Quando num2 igual a 0, aparece a seguinte mensagem: Erro: No possivel / by zero Finished executing
Exemplo5
(com lanamento de Excepo no divide e tratamento no main)
class Ex4{ public static int divide(int a, int b) { if (b==0) throw new ArithmeticException("Valor nulo!"); return a/b; } public static void main(String[] args) { int num1, num2; System.out.println("Introduza o primeiro nmero"); num1=Le.umInt(); System.out.println("Introduza o segundo nmero"); num2=Le.umInt(); try { System.out.println(num1+ " / " + num2 + " = "+ divide(num1,num2)); } catch (ArithmeticException e) { System.out.println("No possivel " + e.getMessage()); }
}}
Quando num2 igual a 0, aparece a seguinte mensagem: No possivel Valor nulo! Finished executing
Exemplo
class Exemplo{ public static void main (String[] args){ String codigo; char zona; int distrito, valido = 0; System.out.print ("Codigo do Produto (XXX para sair): "); codigo = Le.umaString(); while (!codigo.equals ("XXX")) { try { zona = codigo.charAt(2); distrito = Integer.parseInt(codigo.substring(3,5)); System.out.println ("Distrito " +distrito); valido++; } catch (StringIndexOutOfBoundsException exception) { System.out.println ("comprimento errado: " + codigo); } catch (NumberFormatException exception) { System.out.println ("Distrito no numrico: " + codigo); } System.out.print (" Codigo do Produto (XXX para sair): "); codigo = Le.umaString(); } System.out.println ("Codigos validos: " + valido); }}
Prof.Jlio Conway - LTPII
Indicao ao compilador o que pode dar errado durante a execuo de um mtodo. Consiste na declarao das excees que podem ocorrer durante a execuo de um mtodo Sintaxe: public void meuMetodo() throws IOException, ArithmeticException ;
Lanamento de excees
Um mtodo poder lanar as excees que declarar (exceto: RuntimeException ou Error) Lanamento explicito Sintaxe1: throw new TheException ou Sintaxe2: TheException e = new TheException (); throw e; Lanamento Implcito
Captura de excepes
ponto do cdigo para o qual o controlo do programa transferido quando a exceo lanada (try, catch, finally).
NoSuchElementException
ClassNotFoundException ArithmeticException CloneNotSupportedException Object
ArrayStoreException
IllegalAccessException Throwable ClassCastException InstantiationException Exception
IllegalArgumentException
InterruptedException IllegalMonitorStateException NoSuchMethodException IndexOutOfBoundsException RunTimeException NegativeArraySizeException java.awt AWTException
NullPointerException
java.io IOException SecurityException
Este programa faz a leitura de uma sequncia de Palavras e armazenamento de cada uma na posio de uma tabela cujo ndice introduzido pelo utilizador (sem validao prvia).
Cria uma tabela de inteiros dinamicamente. L do teclado um conjunto de valores inteiros. Coloca cada valor lido na tabela.
Independente de outras excepes que possam ocorrer na execuo, uma classe pode forar o lanamento de excepes ou relanar uma determinada excepo, para que possa ser tratada em diferentes nveis. No mtodo elementoEm o lanamento da excepo explcita (ou programada) atravs do uso da instruo throw.
} catch( ArrayIndexOutOfBoundsException e) // trata localmente a excepo. { if ( index >= s.length) { System.out.println("\nErro, indice ilegal. uso de indice 0"); index = 0; return s[index]; } Nesta variante do mtodo elementoEm a excepo capturada. else feito o tratamento do caso de tentativa do uso de um ndice superior a throw e;
dimenso da tabela.
Nesta situao o ndice posto a 0. Para que seja possvel o tratamento de ndices negativos, no mtodo main, a excepo novamente lanada, atravs do uso de throw.
do cdigo responsvel pelo tratamento das situaes de erro que podem acontecer no programa.
Relativamente ao uso da instruo if possui as seguintes
vantagens:
Separao entre o tratamento de erros e o algoritmo. Propagao dos erros atravs da pilha de execuo dos mtodos. Diviso por grupos de erros organizados em hierarquia.
Exerccio
Desenvolver uma interface grfica que gere diversas excees, conforme modelo abaixo:
Testando Excees Diviso por Zero Limite de Vetor Excedido Raiz de nmero negativo Ponteiro Nulo (Null Pointer) Overflow Arquivo Inexistente
Obs: A cada clique no RadioButton, a exceo correspondente deve gerar sua mensagem de erro.