Gerenciamento de erros com Exceções em Java
-
Upload
flavio-lopes -
Category
Documents
-
view
203 -
download
1
Transcript of Gerenciamento de erros com Exceções em Java
![Page 1: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/1.jpg)
Tratamento de Erros
Gerenciamento de erros com Exceções
em Java
![Page 2: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/2.jpg)
O que é uma exceção ?
O termo “exceção” é uma contração da frase “evento excepcional”Uma exceção é um evento que ocorre durante a execução de um programa que interfere no fluxo normal das instruções deste programa
![Page 3: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/3.jpg)
O que ocasiona uma exceção ? Muitos tipos de erros podem causar uma exceção, como por exemplo:– tentar acessar um array fora de seus
limites, – tentar abrir um arquivo inexistente, – uma falha geral no disco, – tentar abrir uma URL inexistente, – tentar dividir por zero, – tentar calcular a raiz quadrada de um
número inexistente – etc.
![Page 4: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/4.jpg)
Quando ocorre um erro ...
Quando tal erro ocorre dentro de um método, este cria um objeto da classeException e passa este objeto para o sistema de runtime. Este objeto contém informações sobre a exceção, incluindo, por exemplo, seu tipo e o estado do programa quando o erro ocorreu
![Page 5: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/5.jpg)
uma exceção é lançada !
A partir deste momento, o sistema de runtime se responsabiliza por achar algum código que trate o erro ocorrido.Em Java, criar-se um objeto da classeException e passá-lo para o sistema de runtime denomina-se “lançar uma exceção” (throwing an exception)
![Page 6: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/6.jpg)
Quando uma exceção é lançada...O sistema passa a procurar alguém capaz de tratar esta exceçãoA lista de “candidatos” para este tratamento vem da pilha de chamada de métodos que antecederam o método que lançou a exceçãoO sistema de runtime “desmonta” a pilha de chamadas, começando com o próprio método onde ocorreu o erro, buscando um método que possua um “manipulador de exceção” adequado
![Page 7: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/7.jpg)
busca-se um exception handlerUm “exception handler” é considerado adequado quando a exceção que ele manipula é do mesmo tipo da exceção lançada. Quando ele é encontrado, recebe o controle do programa para que possa tratar o erro ocorridoEm outras palavras, diz-se que ele “capturou” a exceção (catch the exception)
![Page 8: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/8.jpg)
Se ele não é encontrado...
Se nenhum dos métodos pesquisados pelo sistema de runtime provê um manipulador de exceções adequado, então o programa Java em questão é abruptamente encerrado.
![Page 9: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/9.jpg)
Principal vantagem da manipulação de erros por exceções
Separação do código para manipulação de erros do código “normal” do programa. Exemplo de algoritmo:
lerArquivo() {
abrir o arquivo;determinar seu tamanho;alocar memória suficiente;ler o arquivo para a memóriafechar o arquivo;
}
![Page 10: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/10.jpg)
Tratamento “complicado” de errostipoErro leArquivo(){
tipoErro códigoErro = 0;abrir arquivo;se (arquivo abriu) então {determinar tamanho do arquivo;se (conseguiu obter tamanho do arquivo) então {alocar memória suficiente;se (conseguiu memória suficiente) então {ler o arquivo para memória;se (leitura falhou) entãocódigoErro = -1;
} senãocódigoErro = -2
}senão códigoErro = -3
fechar o arquivo;se (arquivo não fechou)códigoErro = -4
}senãocódigoErro = -5
retorne códigoErro;}
![Page 11: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/11.jpg)
lerArquivo() {try {abrir o arquivo;determinar seu tamanho;alocar memória suficiente;ler o arquivo para a memóriafechar o arquivo;
} catch (Exceção falhouAbrirArquivo) {fazAlgumaCoisa;
} catch (Exceção falhouDeterminarTamanho) {fazAlgumaCoisa;
} catch (Exceção falhouAlocarMemória) {fazAlgumaCoisa;
} catch (Exceção falhouLerArquivo) {fazAlgumaCoisa;
} catch (Exceção falhouFecharArquivo) {fazAlgumaCoisa;
}}
Tratamento “fácil” de erros
![Page 12: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/12.jpg)
Se bem que...É importante lembrar que as exceções não fazem “mágica”, ou seja, não diminuem o esforço necessário para se detectar, reportar e manipular erros.O que elas permitem é a separação do código fonte regular do código responsável “por se fazer alguma coisa quando algo ruim acontece no programa”
![Page 13: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/13.jpg)
Terminologia das exceções:Exception: uma condição de erro que ocorre durante runtimeThrowing: lançamento de uma exceçãoCatching: capturando uma exceção que acabou de ocorrer e executando instruções que tentam resolvê-la de alguma maneiraCatch clause: bloco de instruções que tentam resolver uma exceçãoStack trace: a seqüência de chamadas de métodos executados até o ponto onde ocorreu a exceção
![Page 14: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/14.jpg)
Palavras chave Java para o tratamento de exceções:
trycatchthrowthrowsfinally
![Page 15: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/15.jpg)
Formato geral do código para lançar e tratar exceções
try{//código que pode gerar uma exceção
} catch (Exception e)//captura a exceção{//código para tratar a exceção
}finally{}
void método1() throws IOException{//código que pode gerar uma IOException
}
void método2() throws IOException{//testa condição de exceçãoif (excep)then throw (new IOException());
}
Captura da Exceção
Passagem da Exceção pelo
Método
Lançamentode Exceções
![Page 16: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/16.jpg)
Exemplo sem tratamento de exceçãoclass Teste01{
public static void main (String args[]){
int i = 1, j = 0, k;k = i/j;
}}
/* causa o erro:Exception in thread "main" java.lang.ArithmeticException: / by zero
at Teste01.main(Teste01.java:6)quando da execução do programa, que termina abruptamente
*/
![Page 17: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/17.jpg)
Exemplo com tratamento de exceçãoclass Teste01{
public static void main (String args[]) {
int i = 1, j = 0, k;try{
k = i/j;}catch (ArithmeticException e){
System.out.println("Deu pau");System.out.println(e);
}}
}
![Page 18: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/18.jpg)
Mais um exemplo:class Conta{
public static void main (String args[]){int divisor = 0;int numero = 30;int indice = 100;int c[] = {1};try{int resultado = numero / divisor; c[indice] = resultado;
}catch (ArithmeticException a){System.out.println("Divisão por zero");divisor = 1;
} catch (IndexOutOfBoundsException x){System.out.println("Estourou o índice do array");indice = 0;
}}
}
![Page 19: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/19.jpg)
Variações sobre o mesmo exemplo:class Conta{public static void main (String args[]){int divisor = 0;int numero = 30;int indice = 100;int c[] = {1};try{int resultado = numero / divisor;try{c[indice] = resultado;
}catch (IndexOutOfBoundsException x){System.out.println("Estourou o índice do array");indice = 0;
}}catch (ArithmeticException a){System.out.println("Divisão por zero");divisor = 1;
} }
}
![Page 20: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/20.jpg)
Um exemplo diferente...import java.io.*;public class LeArquivo{private FileReader entrada;public LeArquivo(String nomeArquivo) {
entrada = new FileReader(nomeArquivo);}public String pegaPalavra() {
int c;StringBuffer buf = new StringBuffer();do{
c = entrada.read();if (Character.isWhitespace((char)c))return buf.toString();
elsebuf.append((char)c);
}while (c != -1);return buf.toString();
}}
![Page 21: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/21.jpg)
...que não compila !C:\>javac LeArquivo.javaLeArquivo.java:7: Exception java.io.FileNotFoundException must be caught, or it must be declared in the throws clause ofthis constructor.
entrada = new FileReader(nomeArquivo);^
LeArquivo.java:15: Exception java.io.IOException must be caught, or it must be declared in the throws clause ofthis method.
c = entrada.read();^
2 errors
Pois o compilador sabe que, em ambos os métodos, estãosendo utilizadas instruções que podem ocasionar erro e, portanto, que lançam exceções. Só que estas exceções não estão sendo tratadas
![Page 22: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/22.jpg)
Possíveis soluções: Tratar as exceções dentro dos próprios métodos (através de try e catch)Fazer com que os métodos possam lançar (throws) exceções que deverão ser tratadas por quem se utilizar destes métodosEsta última solução é mais adequada, pois o tratamento de exceções pode variar, dependendo de quem se utiliza dos métodos
![Page 23: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/23.jpg)
Agora o exemplo compila !import java.io.*;public class LeArquivoOK{
private FileReader entrada;public LeArquivoOK(String nomeArquivo) throws FileNotFoundException{entrada = new FileReader(nomeArquivo);
}public String pegaPalavra() throws IOException{int c;StringBuffer buf = new StringBuffer();do{c = entrada.read();if (Character.isWhitespace((char)c))return buf.toString();
elsebuf.append((char)c);
}while (c != -1);return buf.toString();
}}
![Page 24: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/24.jpg)
Throws
Throws–é usado para especificar
quais os tipos de exceções que um método pode devolver !
![Page 25: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/25.jpg)
E quem usa tem que fazer o seguinte...import java.io.*;import LeArquivoOK;public class TesteLeArquivosOK{
public static void main (String args[]){
LeArquivoOK l;try{
l = new LeArquivoOK(”123DeOliveira4.txt");}catch (FileNotFoundException f){
System.out.println("Deu pau ! " + f.getMessage());f.printStackTrace();
}System.out.println("Abriu");
}}
![Page 26: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/26.jpg)
Ou algo um pouco mais sofisticado...import LeArquivoOK;import java.io.*;public class TesteLeArquivosOK{ private LeArquivoOK l;private String nomeArq = "12345678.txt"; private boolean abriu = false; public void tentaAbrir(){while (!abriu){try{l = new LeArquivoOK(nomeArq);abriu = true;
}catch (FileNotFoundException f){System.out.println("Deu pau ! " + f.getMessage()+"\n");f.printStackTrace();nomeArq = "c:\\autoexec.bat";
}} // whileSystem.out.println("Abriu o arquivo " + nomeArq);
}public static void main (String args[]){TesteLeArquivosOK t = new TesteLeArquivosOK(); t.tentaAbrir();
} }
![Page 27: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/27.jpg)
Favor tentar fazer o seguinte:
Acrescentar ao programa TesteLeArquivosOK.java a chamada ao método pegaPalavra()da classe LeArquivoOK
![Page 28: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/28.jpg)
throwFavor não confundir com Throwsa palavra reservada throw lança uma exceçãopara lançar esta exceção, ela cria um objeto (que deve pertencer a uma classe que derive da classe Throwable)
![Page 29: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/29.jpg)
Exemplo do uso de throwpublic Object pop() throws EmptyStackException {
Object obj;if (size == 0)throw new EmptyStackException();
obj = objectAt(size - 1);setObjectAt(size - 1, null);size--;return obj;
}
![Page 30: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/30.jpg)
Cláusula finallyRelembrando a sintaxe:
try{//código que pode gerar uma exceção
} catch (Exception e)//captura a exceção{//código para tratar a exceção
}finally{}
Captura da Exceção
A cláusula finally é opcional
![Page 31: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/31.jpg)
Cláusula finally
Ela provê um mecanismo que permite que seu método execute instruções de finalização, independente do que acontece dentro do bloco trygeralmente estas instruções servem para fechar arquivos ou liberar eventuais recursos do sistema
![Page 32: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/32.jpg)
Um exemplo do uso de finallypublic void exemploBobo() {
PrintWriter saida = null;try {
System.out.println("Entrando no bloco try");saida = new PrintWriter(new FileWriter("ArqSaida.txt"));for (int i = 0; i < tamanho; i++)
saida.println("Valor em: " + i + " = " + vetor.elementAt(i));} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Capturada ArrayIndexOutOfBoundsException: " +e.getMessage());} catch (IOException e) {
System.err.println("Capturada IOException: " + e.getMessage());} finally {
if (saida != null) {
System.out.println("Fechando o PrintWriter");saida.close();
}else{
System.out.println("O PrintWriter não chegou a abrir");}
}}
![Page 33: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/33.jpg)
Para encerrar: espiada em algumas classes de exceção (1/4)java.lang.Object|+--java.lang.Throwable
|+--java.lang.Exception
|+--AclNotFoundException +--ActivationException, +--AlreadyBoundException, +--ApplicationException, +--AWTException,+--BadLocationException, +--ClassNotFoundException, +--CloneNotSupportedException, +--DataFormatException,+--ExpandVetoException, +--GeneralSecurityException, +--IllegalAccessException, +--InstantiationException, +--InterruptedException,
![Page 34: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/34.jpg)
+--IntrospectionException, +--InvocationTargetException, +--IOException| || +--ChangedCharSetException, | +--CharConversionException, | +--EOFException, | +--FileNotFoundException, | +--InterruptedIOException,| +--MalformedURLException, | +--ObjectStreamException, | +--ProtocolException, | +--RemoteException, | +--SocketException,| +--SyncFailedException, | +--UnknownHostException, | +--UnknownServiceException, | +--UnsupportedEncodingException,| +--UTFDataFormatException, | +--ZipException
Para encerrar: espiada em algumas classes de exceção (2/4)
![Page 35: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/35.jpg)
+--LastOwnerException,+--NoninvertibleTransformException, +--NoSuchFieldException, +--NoSuchMethodException, +--NotBoundException,+--NotOwnerException, +--ParseException, +--PrinterException, +--PrivilegedActionException, +--PropertyVetoException,+--RemarshalException, +--RuntimeException, | || +--ArithmeticException, | +--ArrayStoreException, | +--CannotRedoException, | +--CannotUndoException, | +--ClassCastException,| +--CMMException,
Para encerrar: espiada em algumas classes de exceção (3/4)
![Page 36: Gerenciamento de erros com Exceções em Java](https://reader034.fdocumentos.tips/reader034/viewer/2022052620/5571fa42497959916991b206/html5/thumbnails/36.jpg)
| +--ConcurrentModificationException, | +--EmptyStackException, | +--IllegalArgumentException,| +--IllegalMonitorStateException, | +--IllegalPathStateException, | +--IllegalStateException, | +--ImagingOpException,| +--IndexOutOfBoundsException, | +--MissingResourceException, | +--NegativeArraySizeException, | +--NoSuchElementException,| +--NullPointerException, | +--ProfileDataException, | +--ProviderException, | +--RasterFormatException, | +--SecurityException,| +--SystemException, | +--UnsupportedOperationException+--ServerNotActiveException, +--SQLException, +--TooManyListenersException,+--UnsupportedFlavorException, +--UnsupportedLookAndFeelException,
Para encerrar: espiada em algumas classes de exceção (4/4)