You are on page 1of 16

Excees

Componentes robustos Problemas comuns Sistemas de tratamento de excees Tratando excees Classes de excees Disparando excees Criando novas classes de excees

Programao OO usando Java - Prof. Luciana Porcher Nedel

Componentes robustos
Componentes podem ter problemas durante a execuo e reagir como:
terminar o programa; retornar um valor de erro indicando falha; retornar e ignorar o problema; chamar uma funo para tratar o erro, etc...

Problemas: erros e excees


representam situaes anormais (excees) ou invlidas (erros) durante o processo de execuo

Componentes robustos: tentam sanar os problemas


Programao OO usando Java - Prof. Luciana Porcher Nedel

Problemas comuns
Os problemas mais comumente encontrados: falha na aquisio de um recurso (new, open..) tentativa de fazer algo impossvel (diviso por zero, ndice invlido..) outras condies invlidas (lista vazia, overflow...)

classe objeto.metodo() dados mtodo()

Programao OO usando Java - Prof. Luciana Porcher Nedel

Hiptese: ignorar excees


Exemplo: public class Zero { public static void main ( String[] args){ int numerador = 10; int denominador = 0; System.out.println(numerador/denominador); } // main } // Zero execuo: java.lang.ArithmeticException: / by zero at Zero.main(Zero.java:xx) xx: nmero da linha do arquivo onde ocorreu o erro
Programao OO usando Java - Prof. Luciana Porcher Nedel

Sistemas de tratamento de excees


Antecipao de problemas pelo programador Situaes de erro podem ser revertidas Soluo ideal: tratamento de problemas separado do cdigo normal Mecanismo: sistemas de tratamento de excees
um sistema de tratamento de excees deve ser capaz de: detectar e sinalizar (disparar), capturar e tratar uma exceo (ativar tratador)

Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
Dado o seguinte enunciado: Escreva um programa em JAVA que recebe dois strings, S1 e S2 e um nmero N pela linha de comando e imprima:
Os N primeiros caracteres do String S1 separados por um -; Os N primeiros caracteres do String S1 de traz para diante; Os N primeiros caracteres do String S2 separados por um -; Os N primeiros caracteres do String S2 de traz para diante.

Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
Verifique se o programa a seguir corresponde a uma boa soluo: public class TestaExceptions{
class ImpString { public static void impSep(String str,int n){ String aux = ""; for(int i=0; i<n; i++){ aux = aux + str.charAt(i); if (i < n-1) aux = aux + '-'; } System.out.println(aux); } public static void impInv(String str,int n){ String aux = ""; for(int i=n-1; i>=0; i--) aux = aux + str.charAt(i); System.out.println(aux); } }
Programao OO usando Java - Prof. Luciana Porcher Nedel

static public void main(String args[]){ String s1,s2; int n; s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n); } }

Tratando excees
A soluo anterior est correta se:
O usurio informar os 3 parmetros na linha de comando; O terceiro parmetro for um nmero; O valor de N for menor ou igual ao comprimento dos strings informados;

O TRATAMENTO DE SITUAES DE ERRO FUNDAMENTAL EM APLICAES REAIS !!


Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
Exemplo:
Entrada: Teste excees 4 Sada: T-e-s-t tseT e-x-c-e ecxe Entrada: Teste Teste Teste Sada: java.lang.NumberFormatException: Teste Entrada: Teste excees 10 Sada: java.lang.StringIndexOutOfBoundsException: String index out of range: 5

Entrada: Teste Sada: java.lang.ArrayIndexOutOfBoundsException: 1

Programao OO usando Java - Prof. Luciana Porcher Nedel

Soluo convencional para o tratamento das situaes de erro: acrescentou 14 linhas executveis
public class TestaExceptions{ static public boolean intOk(String s){ for(int i=0; i<s.length(); i++) if (Character.isDigit(s.charAt(i)) == false) return(false); return(true); } public static void main(String args[]){ String s1,s2; int n; if (args.length != 3){ System.out.println("Sintaxe: <string> <string> <int>"); System.exit(0); } if (intOk(args[2]) == false){ System.out.println("O terceiro parmetro deve ser um inteiro"); System.exit(0); } (continua...)
Programao OO usando Java - Prof. Luciana Porcher Nedel

Soluo convencional para o tratamento das situaes de erro: acrescentou 14 linhas executveis
(...continua) s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); if (n < s1.length()){ ImpString.impSep(s1,n); ImpString.impInv(s1,n); } else System.out.println("O valor de n maior que o tamanho de S1"); if (n < s2.length()){ ImpString.impSep(s2,n); ImpString.impInv(s2,n); } else System.out.println("O valor de n maior que o tamanho de S2"); } }
Programao OO usando Java - Prof. Luciana Porcher Nedel

Um bloco try deve agrupar sentenas que tenham afinidade


Exemplo 2: Acrescentou 8 linhas executveis em relao a soluo original try{
public class TestaExceptions{ static public void main(String args[]){ String s1=""; } String s2=""; catch(Exception e){ int n=0; System.out.println("O valor de N maior que S1 ou S2"); try{ System.exit(0); s1 = args[0]; } s2 = args[1]; } n = Integer.parseInt(args[2]); } } catch(Exception e){ System.out.println("Sintaxe: <string> <string> <int>"); System.exit(0); }
Programao OO usando Java - Prof. Luciana Porcher Nedel

ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n);

Tratando excees
Os mtodos Java geram uma exceo quando, por uma razo qualquer, falham. O controle, ento, passa imediatamente ao gestor de excees apropriado. try
{ // cdigo que pode gerar exceo } catch (Exception e) { // cdigo que trata exceo } finally { // tratamento geral }
Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
O comando try/catch/finally suporta o tratamento de excees:
no bloco try esto colocados os comandos que podem provocar o lanamento de uma exceo essas excees so capturadas em um ou mais comandos catch, colocados aps o bloco try o comando finally contm cdigo a ser executado, independente de outros comandos. opcional, mas quando presente, sempre executado
Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
Um programa JAVA deve tratar, na medida do possvel, todas as excees que puderem ser geradas de maneira que o programa no seja interrompido de forma anormal. Todas as excees so derivadas da classe Exception. Uma vez lanada, uma exceo procura por uma clusula catch capaz de referenci-la e trat-la. Se no houver, o programa ir parar com erro.
Programao OO usando Java - Prof. Luciana Porcher Nedel

Tratando excees
Uma clusula catch pode referenciar qualquer exceo do tipo que declara ou derivadas. No caso do exemplo anterior, as clusulas catch poderiam interceptar qualquer exceo. Deve-se evitar tratar apenas as excees mais genricas porque as mensagens de erro tornam-se genricas demais. Um nico bloco try pode ter vrias clusulas catch. A ordem em que as clusulas catch aparecem, importa. Por esta razo, as excees mais genricas devem ser tratadas aps as mais especficas.
Programao OO usando Java - Prof. Luciana Porcher Nedel

Observe o trecho inicial do exemplo anterior re-escrito para tratar as excees especficas:
public class TestaExceptions{ static public void main(String args[]){ String s1=""; String s2=""; int n=0; try{ s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n); } catch(NumberFormatException e){ System.out.println("O terceiro argumento deve ser um int"); } catch(IndexOutOfBoundsException e){ System.out.println("Sintaxe: <string> <string> <int>"); } catch(Exception e){ System.out.println("O valor de N maior que S1 ou S2"); } } }
Programao OO usando Java - Prof. Luciana Porcher Nedel

Observe que a ordem das clusulas catch, importa !!!

Classes de excees
Excees so objetos, instncias de alguma sub-classe de java.lang.Throwable
podem conter dados podem definir mtodos

Um dos dados um String inicializado em tempo de criao do objeto, consultado por


Throwable.getMessage()

Throwable tem duas sub-classes: Error e Exception.


Exceptions podem ser capturadas e tratadas Errors correspondem a problemas mais graves, que no devem ser capturadas
Programao OO usando Java - Prof. Luciana Porcher Nedel

O finally
A clusula finally utilizada para forar a execuo de um bloco de cdigo Pode ser utilizada com ou sem o bloco catch A clusula finally executada nas seguintes condies:
fim normal do mtodo devido a uma instruo return ou break caso uma exceo tenha sido gerada
Programao OO usando Java - Prof. Luciana Porcher Nedel

Uso do bloco finally


public class TestaExceptions{ static public void main(String args[]){ String s1=""; String s2=""; int n=0; try{ s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n); } catch(NumberFormatException e){ System.out.println("O terceiro argumento deve ser um int"); } catch(IndexOutOfBoundsException e){ System.out.println("Sintaxe: <string> <string> <int>"); } catch (Exception e){ System.out.println("O valor de N maior que S1 ou S2"); } finally{ System.out.println(Sempre passa por aqui !!"); } } }
Programao OO usando Java - Prof. Luciana Porcher Nedel

O bloco finally sempre executado (havendo ou no exceo) !!!

10

Hierarquia de excees pr-definidas: (lanadas automaticamente pelo JAVA)


java.lang.Exception java.lang.ClassNotFoundException java.lang.CloneNotSupportedException java.lang.IllegalAccessException java.lang.InstantiationException java.lang.InterruptedException java.lang.NoSuchFieldException java.lang.NoSuchMethodException java.lang.RuntimeException java.lang.ArithmeticException java.lang.ArrayStoreExceptionclass java.lang.ClassCastException java.lang.IllegalArgumentException java.lang.IllegalThreadStateException java.lang.NumberFormatException java.lang.IllegalMonitorStateException java.lang.IllegalStateException java.lang.IndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException java.lang.StringIndexOutOfBoundsException java.lang.NegativeArraySizeException java.lang.NullPointerException java.lang.SecurityException java.lang.UnsupportedOperationException
Programao OO usando Java - Prof. Luciana Porcher Nedel

Gerando excees
Para forar a ocorrncia de uma exceo, utiliza-se a palavra reservada throw (no singular)
public void metodo1( ) { try { metodo2( ); } catch (IOException e) { System.err.println(e); } } public void metodo2( ) throws IOException { if (problema) throw new IOException( );
Programao OO usando Java - Prof. Luciana Porcher Nedel

11

A exceo interceptada pelo mtodo que chama methodeY() ou pelo sistema, se nenhum mtodo a interceptar.

Programao OO usando Java - Prof. Luciana Porcher Nedel

Gerando excees
public static void impSep(String str,int n) throws InterruptedException { String aux = ""; if (n == 0) throw(new InterruptedException()); for (int i=0; i<n; i++){ aux = aux + str.charAt(i); if (i < n-1) aux = aux + '-'; } System.out.println(aux); }

throw funciona como um desvio para o local que trata a exceo Se throw no estiver localizado dentro de um bloco trycatch, ento a rotina dever declarar que lana determinada exceo.

Programao OO usando Java - Prof. Luciana Porcher Nedel

12

Gerando excees
public static void impSep(String str,int n) throws InterruptedException{ String aux = ""; if (n == 0) throw(new InterruptedException()); for (int i=0; i<n; i++){ aux = aux + str.charAt(i); if (i < n-1) aux = aux + '-'; } System.out.println(aux); }

Desta forma a exceo passada para cima, ou seja, para a rotina chamadora e assim sucessivamente at encontrar um bloco catch adequado ou a rotina main.
Programao OO usando Java - Prof. Luciana Porcher Nedel

Criando suas prprias excees


class MinhaExcecao extends Exception{ private int val; public MinhaExcecao(int n){ super("Minha excecao: valor de val="+n); val = n; } public int getVal(){ return(val); } } class ImpString { public static void impSep(String str,int n) throws MinhaExcecao{ String aux = ""; if (n == 0) throw(new MinhaExcecao(n)); for(int i=0; i<n; i++){ aux = aux + str.charAt(i); if (i < n-1) aux = aux + '-'; } System.out.println(aux); } (continua...)
Programao OO usando Java - Prof. Luciana Porcher Nedel

13

Criando suas prprias excees


(...continua) public static void impInv(String str,int n){ String aux = ""; for(int i=n-1; i>=0; i--) aux = aux + str.charAt(i); System.out.println(aux); } } public class TestaExceptions{ static public void main(String args[]){ String s1=""; String s2=""; int n=0; try{ s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n); }
Programao OO usando Java - Prof. Luciana Porcher Nedel

(continua...)

Criando suas prprias excees


(...continua) catch(NumberFormatException e){ System.out.println("O terceiro argumento deve ser um int"); } catch(IndexOutOfBoundsException e){ System.out.println("Sintaxe: <string> <string> <int>"); } catch(MinhaExcecao e){ System.out.println(e.getMessage()); int x = e.getVal(); } catch(Exception e){ System.out.println("O valor de N maior que S1 ou S2"); } finally{ System.out.println(" obrigado a passar por aqui"); } } }
Programao OO usando Java - Prof. Luciana Porcher Nedel

14

Excees (resumo)
Uma exceo um sinal que indica a ocorrncia de uma condio excepcional, como um erro. Gerar (throw) uma exceo sinalizar a ocorrncia de uma condio excepcional. Capturar (catch) uma exceo permite trat-la, tomando aes necessrias para recuperar a condio correta de execuo. Excees propagam-se na estrutura lxica de blocos de um mtodo e, se no capturadas, propagam-se para o mtodo que a invocou e, sucessivamente, no stack de mtodos. Caso no sejam capturadas, originam erro no main().
Programao OO usando Java - Prof. Luciana Porcher Nedel

Exerccios
1) Faa um programa Java que solicite dois nmeros ao usurio e, em seguida, imprime o resultado da diviso do primeiro pelo segundo. Trate a exceo ArithmeticException. Teste o mtodo getMessage e printStackTrace de Exception e observe o tipo de mensagem. 2) Re-escreva o exerccio 1 de maneira que os nmeros que compem a razo sejam recebidos pela linha de comando. Trate todas as excees necessrias.
Programao OO usando Java - Prof. Luciana Porcher Nedel

15

Exerccios
3) Faa uma rotina que recebe um inteiro n por parmetro e retorne uma referncia para um vetor de n posies de inteiros. Trate a exceo NegativeArraySizeException. 4) Faa um programa que leia 2 strings e compara se o primeiro lexicograficamente maior, menor ou igual ao segundo. Teste NullPointerException para o caso de um dos strings ser nulo. 5) Pesquise o significado das demais excees.
Programao OO usando Java - Prof. Luciana Porcher Nedel

Exerccios
6) Faa um programa que recebe 4 argumentos e os imprime. O programa deve gerar uma exceo especfica caso o nmero de argumentos esteja incorreto. A mensagem exibida, neste caso, deve indicar a quantidade de argumentos passados e a quantidade correta. 7) Desenvolva um mtodo em JAVA que recebe um string como parmetro e verifica se o mesmo composto apenas por caracteres maisculos. O mtodo deve gerar 2 tipos de excees especficas: uma para indicar se existe algum caracter que no uma letra e outra para indicar se alguma das letras no uma maiscula. Para verificar o tipo dos caracteres use os mtodos isLetter e isUpperCase da classe Character (ambos static).
Programao OO usando Java - Prof. Luciana Porcher Nedel

16

You might also like