JAVA - Apostila
532 pág.

JAVA - Apostila


DisciplinaProgramação Orientada A Objetos3.926 materiais57.478 seguidores
Pré-visualização28 páginas
try e catch\u2217
try e finally
try, catch\u2217 e finally
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 01a
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} catch (E3 e) {
i(); j();
}
m(); n();
...
Pergunta-se: Quais métodos serão executados caso ative...
1 exceção E1 no método a?
2 exceção E3 no método b?
3 exceção E2 no método d?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 328 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 01b
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} catch (E3 e) {
i(); j();
}
m(); n();
...
Pergunta-se
Quais métodos serão executados caso uma RuntimeException
seja ativada no método c?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 329 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 02a
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} finally {
k(); l();
}
m(); n();
...
Pergunta-se: Quais métodos serão executados caso ative...
1 exceção E1 no método a?
2 exceção E2 no método d?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 330 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 02b
...
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
} finally {
k(); l();
}
m(); n();
...
Pergunta-se
Quais métodos serão executados caso uma RuntimeException
seja ativada no método c?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 331 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Fins acadêmicos
Como já mencionada, as exceções não verificáveis não
necessitam ser tratadas
No entanto, para fins acadêmicos iremos fingir o tratamento
de tais exceções apenas para facilitar o entendimento
No final desta seção, veremos porque não tratá-las
Serão utilizadas as mais conhecidas:
Divisão por zero (ArithmeticException)
Uso de um índice inválido em arranjo (ArrayIndexOutOfBoundsException)
Acesso a uma referência nula (NullPointerException)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 332 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 03
public int divide( int a, int b ) {
2 try {
return a / b;
4 } catch (ArithmeticException e) {
e.printStackTrace();
6 return 0;
}
8 }
Pergunta-se
O que acontece se a exceção for ativada? E se não for?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 333 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 04
public int divide( int a, int b ) {
2 try {
return a / b;
4 } catch (ArithmeticException e) {
System.out.println("Problema na divisao: " + e.getMessage());
6 return 0;
} finally {
8 System.out.printf("encerrando divisao(%d,%d)", a, b);
}
10 }
Pergunta-se
O que acontece se a exceção for ativada? E se não for?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 334 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 05
public int divide( int a, int b ) {
2 try {
return a / b;
4 } finally {
System.out.printf("encerrando divisao(%d,%d)", a, b);
6 }
}
Pergunta-se
O que acontece se alguma exceção for ativada? E se não for?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 335 / 527
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 06 \u2013 Situação Real
1 public void lerArquivo( String fileName ) {
try {
3 Reader in = new FileReader( fileName );
LineNumberReader reader = new LineNumberReader( in );
5 while ( reader.ready() ) {
System.out.println( reader.getLineNumber() + ": " + reader.readLine() );
7 }
reader.close();
9 in.close();
} catch (FileNotFoundException e) {
11 System.out.println( "Arq. nao existe. Causa: " + e.getMessage() );
} catch (IOException e) {
13 System.out.println( "Erro de E/S. Causa: " + e.getMessage() );
} catch (Throwable e){
15 System.out.println( "Erro de Inesperado. Causa: " + e.getMessage() );
}
17 }
Pergunta-se
1 O que ocorre se uma RuntimeException for ativada?
2 Pode inverter a ordem das exceções?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 336 / 527
Se não encontrar o
arquivo
Algum erro na leitura do
arquivo
Qualquer outro erro
POO \u2013 Exceção
Tratamento de Exceção \u2013 Exemplo 06 \u2013 Situação Real \u2013
Explicação
A ordem das exceções deve ser da mais específica para a
mais genérica
Por exemplo, se Throwable estivesse no 1o bloco catch,
qualquer exceção entraria nesse bloco
Porque, na verdade, é verificado se a exceção é subclasse
da exceção discriminada no catch
E, como sabemos, todas as exceções são subclasses de
Throwable
Como é FileNotFoundException é uma IOException,
também não poderia mudar. Logo, nesse exemplo não se
pode alterar a ordem do tratamento de exceções
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 337 / 527
POO \u2013 Exceção
Propagação de Exceção
throws
Permite ao método chamado delegar o tratamento do erro
para o método chamador
Metáfora com chefe mandando funcionário fazer algo e
algum problema aparece para o funcionário
É uma boa prática de programação, pois permite construir
sistemas onde tratamento de erros é centralizado
Propagação de Exceção \u2013 Sintaxe
Basta colocar no throws no final da assinatura do método
Por exemplo:
public int f() throws E1
private void g( double d ) throws E1, E2
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 338 / 527
POO \u2013 Exceção
Propagação de Exceção \u2013 Exemplo 01
1 public static Date stringToDate( String sd ) {
DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
3 dateFormat.setLenient( false );
try {
5 return dateFormat.parse( sd );
} catch (ParseException e) {
7 return new Date(); /* caso erro, retorne "agora" */
}
9 }
Think about...
Exceção ativada caso o string da data seja inválido
Logo, todas as invocações a esse método com um string
inválido terá a data atual como seu retorno
Mas, se quiséssemos deixar essa decisão para quem
chamou?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 339 / 527
POO \u2013 Exceção
Propagação de Exceção \u2013 Exemplo 01 \u2013 Solução
public static Date stringToDate( String sd ) throws ParseException {
2 DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
dateFormat.setLenient( false );
4 return dateFormat.parse( sd );
}
Então a solução é \u2013 caso a exceção seja ativada \u2013
progagá-la ao método chamador e não tratá-la
Observe que não mais a trata, mas sim, delega!
Desse modo, cada chamada a esse método terá seu
próprio tratamento, pois assim foi delegado a ele
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 340 / 527
POO \u2013 Exceção
Propagação de Exceção \u2013 Exemplo 01 Completo
1 public static void main( String[] args ) {
String sd = Teclado.lerString( "Digite seu aniversario" );
3 try {
Date d = stringToDate( sd );
5 System.out.printf( "Voce tem %d anos",
(System.currentTimeMillis() - d.getTime()) /31536000000L);
7 } catch (ParseException e) {
System.out.println( "Data invalida. Tente novamente." );
9 }
}
11
public static Date stringToDate( String sd ) throws ParseException {
13 DateFormat dateFormat = new SimpleDateFormat( "dd/MM/yyyy" );
dateFormat.setLenient( false );
15 return dateFormat.parse( sd );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 341 / 527
POO \u2013 Exceção
Propagação de Exceção \u2013 Exemplo 02a
public static void main( String args[] ) {
try {
a(); b(); c(); d();
} catch (E1 e) {
e(); f();
} catch (E2 e) {
g(); h();
}
m(); n();
}
public static void b() throws E1 {
x(); y(); z();
}
Pergunta-se: Quais métodos serão executados caso ative...
1 exceção E1 no método y?
2 exceção E2 no método z?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 342