Professional Documents
Culture Documents
Componentes robustos Problemas comuns Sistemas de tratamento de excees Tratando excees Classes de excees Disparando excees Criando novas classes de excees
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 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...)
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.
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;
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
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
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
Classes de excees
Excees so objetos, instncias de alguma sub-classe de java.lang.Throwable
podem conter dados podem definir mtodos
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
10
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.
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.
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
13
(continua...)
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