Anda di halaman 1dari 33

Excees

Linguagens e Tcnicas de Programao II Prof.: Jlio Conway FAMINAS - BH

O que uma excepo


Uma excepo um evento que ocorre durante a execuo de um programa que interfere no fluxo normal das instrues deste programa. Em Java, a ocorrncia de erros durante a execuo de um programa no significa necessariamente que o programa termina. A linguagem possui um mecanismo para indicar partes crticas num programa e recuperar eventuais erros ocorridos nestas partes, sem parar a execuo do programa. Este mecanismo designado por Exceo (Exception). Uma Exceo um sinal gerado pela mquina virtual de Java em tempo de execuo do programa, que comunicado ao programa indicando a ocorrncia de um erro recupervel.

Prof.Jlio Conway - LTPII

Tratamento de Excees

O objetivo do Tratamento de Excees a implementao de aplicativos robustos e tolerantes a falhas.

Prof.Jlio Conway - LTPII

Erro e Exceo em Java


Indica um erro grave e as vezes impossvel de ser tratado.

Indicam problemas decorrentes do projeto ou implementao. Ex.: ndice excede os limites de um vetor.

Prof.Jlio Conway - LTPII

Excees Verificadas

excees que so verificadas pelo compilador derivam de Exception

Prof.Jlio Conway - LTPII

Excees no Verificadas

excees que no so verificadas pelo compilador derivam de RunTimeException

Prof.Jlio Conway - LTPII

Erro e Excepo em Java


Erro

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.

Prof.Jlio Conway - LTPII

O que ocasiona uma Excepo

Muitos tipos de erros podem provocar uma excepo, como por exemplo:
Tentar acessar uma tabela fora de seus limites, Tentar abrir um arquivo inexistente,

Tentar ler um arquivo para alm do fim deste,


Tentar abrir uma URL inexistente, Tentar dividir por zero, Tentar calcular a raiz quadrada de um nmero negativo.

Prof.Jlio Conway - LTPII

Beneficios do uso de Excees


O uso de excees no diminui o esforo necessrio para se detectar,

reportar e manipular erros.


O uso de excees permite a separao do cdigo fonte regular do

cdigo responsvel pelo tratamento das situaes anmalas podem acontecer no programa.

que

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.

Prof.Jlio Conway - LTPII

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.

Prof.Jlio Conway - LTPII

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 catch finally throw throws

try {

// Trecho crtico do programa }


catch(Tipo de Exceo1 e1-referncia para a exceco1) { }

// Tratamento da e1 do tipo Excepo1

catch(catch(Tipo de Exceo2 e2-referncia para a exceco1) { }

// Tratamento da e2 do tipo Excepo2

.. finally { }

// o bloco opcional // se existe executado sempre

Prof.Jlio Conway - LTPII

Tratamento de Excees Clusulas try catch


try
O cdigo do programa tal como seria escrito mesmo que garantidamente

no pudesse gerar qualquer erro, colocado neste bloco.

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.

Prof.Jlio Conway - LTPII

Tratamento de Excees Clusula finally


finally
O cdigo aqui colocado ser sempre executado caso surja ou no uma exceo em try. Este cdigo pode ser utilizado para liberar recursos previamente alocados: fechar arquivos, liberar conexo com Bando de Dados, etc.. Se foi detectada excepo em try se existe uma clusula catch local ao mtodo, ento o bloco catch executado, e s depois o bloco finally. se no existe catch local para a excepo ocorrida, executado o bloco finally e, caso exista, a clusula catch externa ao mtodo que primeiro for encontrada (por exemplo no mtodo invocador). Se a forma de sada do bloco try, for return, continue ou break, quer exista ou no catch, o bloco finally de imediato executado.

Prof.Jlio Conway - LTPII

Lanamento explcito de Excees


(throw e throws)
Torna-se por vezes necessrio no cdigo de um dado mtodo, "lanar" explicitamente uma exceo, ou seja, alertar explicitamente para uma situao de erro entretanto ocorrida na execuo de tal cdigo.

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:

Localmente o tratamento de tal excepo numa clusula catch.


Declare explicitamente que pode lanar tal excepo embora no a trate localmente. Neste ltimo caso, no cabealho do mtodo devem ser explicitamente declaradas todas as excepes que podem ser lanadas atravs de uma clusula throws.

Prof.Jlio Conway - LTPII

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();

Programa que l dois inteiros

System.out.println(num1+ " / " + num2 + " = "+ divide(num1,num2)); } }


Quando num2 igual a 0, causa o seguinte erro:

java.lang.ArithmeticException: / by zero at Ex1.divide(exemplo1.java:5) at Ex1.main(exemplo1.java:15) o programa termina abruptamente

Prof.Jlio Conway - LTPII

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 !

Excepo capturada no main

Prof.Jlio Conway - LTPII

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:

Excepo capturada no divide

No possivel divisao por 0 Finished executing

Prof.Jlio Conway - LTPII

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

(com captura e lanamento de Exceo no divide e tratamento no main) Ex4{

Excepo capturada no divide

Prof.Jlio Conway - LTPII

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

Excepo capturada no divide

Prof.Jlio Conway - LTPII

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

Modelo das Excees


Modelo baseado em trs operaes:

Declarao das excees


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).

Prof.Jlio Conway - LTPII

Classificao das Excees


RuntimeException IOException Ocorre porque houve um erro de Tentar ler alm do final de um programao. Por exemplo: arquivo Converso explcita de tipo (cast) Acesso a elemento de uma tabela alm dos limites . Acesso de ponteiro nulo Tentar abrir uma URL incorreta Tentar encontrar um objeto Class atravs de uma string que no denota uma classe existente.

Prof.Jlio Conway - LTPII

Classes de Excepo em Java


java.util java.lang EmptyStackException

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

Prof.Jlio Conway - LTPII

Excees mais comuns


ArithmeticException Indica situaes de erros em processamento aritmtico, tal como uma diviso inteira por 0. ArrayIndexOutOfBoundsException indica a tentativa de acesso a um elemento de um arranjo fora de seus limites -- ou o ndice era negativo ou era maior ou igual ao tamanho do arranjo. NullPointerException indica que a aplicao tentou usar null onde uma referncia a um objeto era necessria IOException indica a ocorrncia de algum tipo de erro em operaes de entrada e sada NumberFormatException indica que tentou-se a converso de uma string para um formato numrico, mas seu contedo no representava adequadamente um nmero para aquele formato. ArrayStoreException Indica tentativa de armazenamento de um objeto no vlido numa tabela IndexOutOfBoundsException Indica tentativa de usar um ndice fora dos limite de uma tabela NegativeArraySizeException Indica tentativa de criar uma tabela com dimenso negativa NumberFormatException indica que tentou-se a converso de uma string para um formato numrico, mas seu contedo no representava adequadamente um nmero para aquele formato. StringIndexOutOfBoundsException Indica tentativa de usar um ndice numa string fora dos limite destas

Prof.Jlio Conway - LTPII

Declarao explicita de Excees Exemplo6 - uso de throws


class LePalavras {
public static void copiaPalavra(String [] tabPal, String palavra) throws ArrayIndexOutOfBoundsException, NumberFormatException { int index; System.out.print("Introduza um Indice :"); index = Integer.valueOf(Le.umaString().trim()).intValue(); tabPal[index]= palavra; }

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).

Prof.Jlio Conway - LTPII

Declarao explicita de Excees Exemplo6 - uso de throws


public static void main(String args[]) { int index, cont=0; final int MAX_PALAVRAS=5; String palavra = "" ; String[] tabPal = new String[MAX_PALAVRAS]; // Tabela de Palavras do{ try { System.out.print("\nIntroduza uma Palavra :"); palavra = Le.umaString(); copiaPalavra(tabPal, palavra); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("Erro! indice ilegal"); } catch (NumberFormatException e) { System.out.println("Erro! esperado um inteiro"); } cont++; } while (cont<MAX_PALAVRAS); System.out.println("Fim.."); } } Prof.Jlio Conway - LTPII

Lanamento de Excees por um mtodo Exemplo7 - uso de throw


class LetabInteiros{ static public int [] criaTabInt(int tamanho) { int [] tabInt = new int[tamanho]; for (int i = 0 ; i < tamanho; i++) { System.out.print("\n Introduza " + i +" valor" ); tabInt[i] = Le.umInt(); } return tabInt; }
criaTabInt

Cria uma tabela de inteiros dinamicamente. L do teclado um conjunto de valores inteiros. Coloca cada valor lido na tabela.

Prof.Jlio Conway - LTPII

Lanamento de Excees por um mtodo Exemplo7 - uso de throw (cont.)


public static int elementoEm (int [] s, int index) throws ArrayIndexOutOfBoundsException { if (index < s.length && index > -1) return s[index]; else { ArrayIndexOutOfBoundsException excepcao = new ArrayIndexOutOfBoundsException("erro no mtodo elementoEm.."); throw excepcao; } }

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.

Prof.Jlio Conway - LTPII

Lanamento de Excees por um mtodo Exemplo7 - uso de throw (cont.)


public static void main(String args[]){ int [] tab; int index, valor, tabMax; boolean fim = false; System.out.print("\n Introduza o tamanho da tabela:"); tabMax = Le.umInt(); tab = criaTabInt(tabMax); do{ System.out.print("\n Introduza o indice:"); index = Le.umInt(); try { valor = elementoEm(tab,index); System.out.print("Valor na posicao: " +valor); } catch (ArrayIndexOutOfBoundsException e){ if ( index == -1) Este programa l um conjunto de inteiros para fim = true; else uma tabela, em seguida retorna os valores System.out.println(e); lidos pela indicao do ndice da tabela. } } O programa termina quando o ndice while (!fim); negativo. System.out.println("Fim.."); } }

Prof.Jlio Conway - LTPII

Lanamento de Excees por um mtodo Exemplo8 - uso de throw (cont.)


public static int elementoEm(int [] s, int index) throws ArrayIndexOutOfBoundsException { // retorna valor na posicao index try { return s[index];

Alterao do mtodo elementoEm

} 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.

} // fim catch }// fim mtodo

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.

Prof.Jlio Conway - LTPII

Beneficios do uso de Excees


O uso de excees no diminui o esforo necessrio para

detectar, reportar e manipular erros.


O uso de excees permite a separao do cdigo fonte regular

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.

Prof.Jlio Conway - LTPII

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.

Prof.Jlio Conway - LTPII

Anda mungkin juga menyukai