Tratamento
de
Exceções
Rui Rossi dos Santos
[email protected]
Mediador: Rui Rossi dos Santos
Slide 1
Introdução
o Exceção: condição anormal
o Causas:
• Falhas na implementação
• Falhas na operação
o O responsável
o Qualidade de software
• Tolerância à falhas
Mediador: Rui Rossi dos Santos
Slide 2
Introdução
o Código 10.1 – Excecao.java
• O aplicativo deve solicitar um número inteiro e exibir o seu cubo.
• Utilize um diálogo gráfico para solicitar e exibir os dados.
• Execute o aplicativo e informe um dado que não possa ser
convertido para o tipo int.
Mediador: Rui Rossi dos Santos
Slide 3
Estrutura try-catch
o Bloco try
• Delimita instruções que podem gerar exceções.
• Um bloco catch para cada tipo de exceção.
• Tipo = classe.
o Sintaxe:
try {
<instruções>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
}
Mediador: Rui Rossi dos Santos
Slide 4
Estrutura try-catch
o Tratamento genérico:
• Uso de tipo genérico: Exception
o Sintaxe:
try {
<instruções>
}
catch (Exception ex) {
<tratamento>
}
Mediador: Rui Rossi dos Santos
Slide 5
Estrutura try-catch
o Código 10.2 – Try.java
– Captar dois números e dividir o primeiro pelo segundo.
– Utilizar diálogos gráficos para captar os números e exibir o
resultado.
– Se ocorrer uma exceção durante a execução destas instruções,
o programa deve exibir uma mensagem de erro e encerrar o
aplicativo.
– A mensagem de erro deve conter:
• O nome da classe que representa a exceção.
• A mensagem de erro padrão desta exceção.
Mediador: Rui Rossi dos Santos
Slide 6
Estrutura try-catch
o Código 10.2 – Try.java
Mediador: Rui Rossi dos Santos
Slide 7
Estrutura try-catch
o Código 10.3 – TratamentoMultiplo.java
– Captar dois números e dividir o primeiro pelo segundo.
– Utilizar diálogos gráficos para captar os números e exibir o
resultado.
– Se ocorrer uma exceção durante a execução destas instruções,
o programa deve exibir uma mensagem de erro específica para
cada tipo de exceção que pode ser disparada e deve encerrar o
aplicativo.
– Exiba as seguintes mensagens de erro:
• Em caso de NumberFormatException: “Número inválido!”
• Em caso de ArithmeticExceptino: “O divisor não pode ser zero!”
Mediador: Rui Rossi dos Santos
Slide 8
Estrutura try-catch
o Código 10.3 – TratamentoMultiplo.java
Mediador: Rui Rossi dos Santos
Slide 9
Estrutura try-catch
o Código 10.4 – ValidaInteiro.java
Solicitar um número inteiro e indicar se ele é válido.
Utilizar diálogos gráficos.
Se o diálogo de entrada for cancelado, encerrar o aplicativo.
Se o número não for válido, exibir mensagem de erro e solicitá-lo
novamente.
– Regras para validação do número:
–
–
–
–
• Deve ser inteiro.
• Deve ser maior ou igual a 1.
• Deve ser menor ou igual a 10.
– Exibir uma mensagem de erro específica para cada uma destas
situações.
– Lançar uma IllegalArgumentException nos dois últimos casos.
Mediador: Rui Rossi dos Santos
Slide 10
Estrutura try-catch
o Código 10.4 – ValidaInteiro.java
Mediador: Rui Rossi dos Santos
Slide 11
Bloco Finally
o Objetivo:
• Garantir a execução de determinadas instruções.
o Requisito:
• Vínculo com estrutura try-catch
o Sintaxe:
try {
<instruções>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
}
finally {
<instruções>
}
Mediador: Rui Rossi dos Santos
Slide 12
Bloco Finally
o Código 10.5 – Finally.java
–
–
–
–
–
Solicitar um número inteiro e indicar se ele é válido.
Utilizar diálogos gráficos.
Se o diálogo de entrada for cancelado, encerrar o aplicativo.
Se o número não for válido, exibir mensagem de erro.
Regras para validação do número:
• Deve ser inteiro.
• Deve ser igual ou superior a -2.147.483.648.
• Deve ser igual ou inferior a 2.147.483.647.
– Instruções de finalização que devem ser garantidas:
• Mensagem de conclusão: “Operação encerrada!”.
• Liberação imediata da memória utilizada pelo aplicativo.
Mediador: Rui Rossi dos Santos
Slide 13
Bloco Finally
o Código 10.5 – Finally.java
Mediador: Rui Rossi dos Santos
Slide 14
A Hierarquia das Exceções
o Uma exceção é uma classe
o Cada classe têm uma ancestral direta
• Pai ou mãe?
Mediador: Rui Rossi dos Santos
Slide 15
A Hierarquia das Exceções
Mediador: Rui Rossi dos Santos
Slide 16
Tratamento Obrigatório e Tratamento Opcional
o Primeiro grupo: checked exceptions
•
•
•
•
•
Tratamento obrigatório
Classes que não derivam de RuntimeException
Condições inválidas
Causas fora do controle do programador
Exemplos:
- Problemas físicos na rede
- Queda do servidor de BD
- Ausência de arquivos
Mediador: Rui Rossi dos Santos
Slide 17
Tratamento Obrigatório e Tratamento Opcional
o Segundo grupo: unchecked exceptions
•
•
•
•
Tratamento opcional
Classe RuntimeException e suas descendentes
Defeitos no código do aplicativo (bugs)
Podem ser evitadas pelo programador
- Adaptação da lógica de seu algoritmo
• Exemplos:
- Executar método de objeto nulo
- Acessar posição inexistente de vetor
- Converter dado captado do usuário
• Há casos em que o programador não pode evitá-las
- Tratá-las como se fossem checked exceptions
Mediador: Rui Rossi dos Santos
Slide 18
Tratamento de Checked Exceptions
o Código 10.6 – TratamentoObrigatorio.java
–
–
–
–
Ler o arquivo Excecao.java e exibir seu conteúdo.
Editar e compilar sem nenhum tratamento de exceção.
Analisar as mensagens de erro do compilador.
Implementar um tratamento para cada checked exception.
Mediador: Rui Rossi dos Santos
Slide 19
Tratamento de Checked Exceptions
o Código 10.6 – TratamentoObrigatorio.java
Mediador: Rui Rossi dos Santos
Slide 20
Tratamento de Checked Exceptions
Código 10.6 – TratamentoObrigatorio.java.
1
import java.io.FileReader;
2
import java.io.BufferedReader;
3
4
public class TratamentoObrigatorio {
5
public static void main(String[] args) {
6
String texto = "";
7
FileReader fr = new FileReader("Excecao.java");
8
BufferedReader br = new BufferedReader(fr);
9
10
while(true) {
11
String linha = br.readLine();
12
if(linha == null) break;
13
texto += linha + "\n";
14
}
15
16
br.close();
17
fr.close();
18
System.out.println(texto);
19
}
20 }
Mediador: Rui Rossi dos Santos
Slide 21
Tratamento de Checked Exceptions
Código 10.7 – TratamentoObrigatorio.java.
1
import java.io.FileReader;
2
import java.io.BufferedReader;
3
import java.io.FileNotFoundException;
4
import java.io.IOException;
5
6
public class TratamentoObrigatorio {
7
public static void main(String[] args) {
8
String texto = "";
9
FileReader fr = null;
10
11
try {
12
fr = new FileReader("Excecao.java");
13
}
14
catch (FileNotFoundException nfex) {
15
System.out.println("Arquivo não encontrado!");
16
System.exit(0);
17
}
18
Mediador: Rui Rossi dos Santos
Slide 22
Tratamento de Checked Exceptions
Código 10.7 – TratamentoObrigatorio.java.
19
try {
20
BufferedReader br = new BufferedReader(fr);
21
22
while(true) {
23
String linha = br.readLine();
24
if(linha == null) break;
25
texto += linha + "\n";
26
}
27
28
br.close();
29
fr.close();
30
}
31
catch (IOException ioex) {
32
System.out.println("Erro durante a leitura do arquivo!");
33
System.exit(0);
34
}
35
36
System.out.println(texto);
37
System.exit(0);
38
}
39 }
Mediador: Rui Rossi dos Santos
Slide 23
Tratamento para NullPointerException
o NullPointerException
• Descendente direta de RuntimeException
• Uma unchecked exception
• Causas comuns:
-
Acessar ou modificar um atributo de um objeto nulo.
Executar um método de um objeto nulo.
Acessar ou modificar um elemento de um vetor nulo.
Recuperar a quantidade de elementos de um vetor nulo.
Mediador: Rui Rossi dos Santos
Slide 24
Tratamento para NullPointerException
o Código 10.8 – TratamentoNull.java
Solicitar o nome do usário.
Converter seu nome para maiúsculo e exibi-lo.
Utilizar diálogos gráficos.
Experimentar cancelar o diálogo de entrada sem ter previsto isso
no algoritmo do aplicativo.
– Corrigir o defeito do programa com uma estrutura de decisão.
–
–
–
–
Mediador: Rui Rossi dos Santos
Slide 25
Tratamento para NullPointerException
o Código 10.8 – TratamentoNull.java
Mediador: Rui Rossi dos Santos
Slide 26
Tratamento para NullPointerException
Código 10.8 – TratamentoNull.java.
1
import javax.swing.JOptionPane;
2
3
public class TratamentoNull {
4
public static void main(String[] args) {
5
String nome = JOptionPane.showInputDialog("Informe seu nome");
6
nome = nome.toUpperCase();
7
JOptionPane.showMessageDialog(null,"Seu nome: " + nome);
8
System.exit(0);
9
}
10 }
Mediador: Rui Rossi dos Santos
Slide 27
Tratamento para NullPointerException
Código 10.9 – TratamentoNull.java.
1
import javax.swing.JOptionPane;
2
3
public class TratamentoNull {
4
public static void main(String[] args) {
5
String nome = JOptionPane.showInputDialog("Informe seu nome");
6
if (nome == null) System.exit(0);
7
nome = nome.toUpperCase();
8
JOptionPane.showMessageDialog(null,"Seu nome: " + nome);
9
System.exit(0);
10
}
11 }
Mediador: Rui Rossi dos Santos
Slide 28
Tratamento para ArrayIndexOutOfBoundsException
o ArrayIndexOutOfBoundsException
• Descendente indireta de RuntimeException
• Uma unchecked exception
• Causas comuns:
- Acesso a elemento de vetor/matriz com índice ilegal.
• Exemplo:
int[ ] fibonacci = {1,1,2,3,5,8,13,21};
int n = fibonacci[8];
Mediador: Rui Rossi dos Santos
Slide 29
Tratamento para ArrayIndexOutOfBoundsException
o Código 10.10 – TratamentoArray.java
– Declare, instancie e inicialize um vetor de strings com o nome de
quatro amigos.
– Implemente um laço que percorra este vetor e imprima o
conteúdo de cada elemento.
– Experiência: contador de 1 ao tamanho do vetor.
Mediador: Rui Rossi dos Santos
Slide 30
Tratamento para ArrayIndexOutOfBoundsException
o Código 10.10 – TratamentoArray.java
Mediador: Rui Rossi dos Santos
Slide 31
Tratamento para ArrayIndexOutOfBoundsException
Código 10.10 – TratamentoArray.java.
1
public class TratamentoArray {
2
public static void main(String[] args) {
3
String[] amigos = {"Cláudia","Vanessa","Raul","Sidnei"};
4
5
for (byte num = 1; num <= amigos.length; num++)
6
System.out.println("Amigo " + num + ": " + amigos[num]);
7
}
8
}
Mediador: Rui Rossi dos Santos
Slide 32
Tratamento para ArrayIndexOutOfBoundsException
Código 10.11 – TratamentoArray.java.
1
public class TratamentoArray {
2
public static void main(String[] args) {
3
String[] amigos = {"Cláudia","Vanessa","Raul","Sidnei"};
4
5
for (byte num = 0; num < amigos.length; num++)
6
System.out.println("Amigo " + (num + 1) + ": " + amigos[num]);
7
}
8
}
Mediador: Rui Rossi dos Santos
Slide 33
Tratamento para InputMismatchException
o InputMismatchException
•
•
•
•
Descendente indireta de RuntimeException
Uma unchecked exception
Disparada por métodos da classe Scanner
Causas comuns:
- O termo recuperado não coincide com o padrão esperado.
• Exemplo:
- Método nextInt( ) invocado
- Usuário digita: 55,33
Mediador: Rui Rossi dos Santos
Slide 34
Tratamento para InputMismatchException
o Código 10.12 – TratamentoInput.java
–
–
–
–
Captar a idade do usuário.
Utilizar método nextByte( ).
Experimente deixar sem tratamento de exceção.
Implemente um tratamento adequado.
Mediador: Rui Rossi dos Santos
Slide 35
Tratamento para InputMismatchException
Código 10.12 – TratamentoInput.java.
1
import java.util.Scanner;
2
3
public class TratamentoInput {
4
public static void main(String[] args) {
5
Scanner scan = new Scanner(System.in);
6
7
System.out.print("Informe sua idade:\t");
8
byte idade = scan.nextByte();
9
10
System.out.println("Sua idade:\t\t" + idade);
11
}
12 }
Mediador: Rui Rossi dos Santos
Slide 36
Tratamento para InputMismatchException
Código 10.13 – TratamentoInput.java.
1
import java.util.Scanner;
2
import java.util.InputMismatchException;
3
4
public class TratamentoInput {
5
public static void main(String[] args) {
6
byte idade = -1;
7
8
while (idade < 0) {
9
System.out.print("\nInforme sua idade:\t");
10
Scanner scan = new Scanner(System.in);
11
12
try {
13
idade = scan.nextByte();
14
}
15
catch (InputMismatchException ime) {
16
System.out.println("Idade inválida!");
17
}
18
}
19
20
System.out.println("Sua idade:\t\t" + idade);
21
}
22 }
Mediador: Rui Rossi dos Santos
Slide 37
Tratamento para Outras Exceções
o Tipo: checked exceptions
• O compilador avisa
• Tratamento obrigatório com estrutura try-catch
o Tipo: unchecked exceptions
• Causa sob área de domínio do programador
- Alterar algoritmo do programa
- Não utilizar estrutura try-catch
- Exemplos:
• NullPointerException
• ArrayIndexOutOfBoundsException
• ArithmeticException
• Causa fora da área de domínio do programador
- Tratar com estrutura try-catch
- Exemplos:
• InputMismatchException
• NumberFormatException
Mediador: Rui Rossi dos Santos
Slide 38
Exercício 1
o Crie um novo aplicativo, chamado Exercicio1001, que solicite
o nome e o salário do usuário e calcule o valor que a empresa
deve depositar em sua conta do FGTS (Fundo de Garantia por
Tempo de Serviço).
o Este aplicativo deve realizar toda interação com o usuário
através da janela de comando.
o Procure implementar este aplicativo de modo que sua
interação com o usuário se estabeleça exatamente como
você pode observar na figura do slide seguinte.
Mediador: Rui Rossi dos Santos
Slide 39
Exercício 1
Mediador: Rui Rossi dos Santos
Slide 40
Exercício 1
o Se o nome informado não for válido, o aplicativo deve
imprimir uma mensagem de erro e solicitá-lo novamente.
• O nome deve conter de 5 a 50 caracteres.
• O nome não pode conter números.
o Se o salário informado não for válido, o aplicativo deve
imprimir uma mensagem de erro e solicitá-lo novamente.
• O salário deve ser um número fracionário.
• O salário deve ser igual ou superior a R$ 465,00.
o Ao final, o aplicativo deve imprimir os dados que serão
registrados no recibo de pagamento do usuário:
• Seu nome.
• Seu salário.
• O FGTS a ser depositado.
o O valor do FGTS deve ser calculado pelo aplicativo e
corresponde a 8% do salário.
Mediador: Rui Rossi dos Santos
Slide 41
Exercício 2
o Crie um novo aplicativo, chamado Exercicio1002, que solicite
um número inteiro e indique se ele é um número primo.
• Os números primos são números inteiros com apenas dois
divisores: ele mesmo e o número um.
• O 17 é um exemplo de número primo porque só pode ser dividido
por ele mesmo e por um.
o Este aplicativo deve realizar toda interação com o usuário
através da janela de comando. A figura do slide seguinte
ilustra como isto deve ser realizado.
• Procure implementar este aplicativo de modo que sua interação
com o usuário se estabeleça exatamente como você pode
observar nesta figura.
Mediador: Rui Rossi dos Santos
Slide 42
Exercício 2
Mediador: Rui Rossi dos Santos
Slide 43
Exercício 2
o O número informado deve ser maior que um e deve ser menor
ou igual a 2.147.483.647.
• Se o dado informado não for um número, deve-se exibir a
seguinte mensagem de erro: “Erro: dado inválido!”.
• Se o número não for maior que um, deve-se exibir a seguinte
mensagem de erro: “Erro: o número deve ser maior que 1!”.
o Este aplicativo deve permitir que seja analisada qualquer
quantidade de números.
• Depois que o usuário indicar um número e for indicado se ele é
primo, o aplicativo deve solicitar outro número para repetir a
operação.
• Este procedimento deve se repetir indefinidamente e o aplicativo
só deve ser encerrado quando o usuário digitar “SAIR”.
Mediador: Rui Rossi dos Santos
Slide 44
Exercício 2
o Procure implementar o algoritmo deste aplicativo de modo
que ele realize esta tarefa no menor tempo possível.
• Propõe-se, como desafio, que você tente expandir o limite
máximo que o usuário pode informar para
9.223.372.036.854.775.807.
• Tente otimizar o algoritmo para que ele seja capaz de analisar
números tão grandes como este em um tempo plausível.
Mediador: Rui Rossi dos Santos
Slide 45
Exercício 3
o Crie um novo aplicativo, chamado Exercicio1003, que gere os
números que compõe a Seqüência de Fibonacci.
• Esta seqüência é uma função recursiva que objetiva gerar um
conjunto de números inteiros.
• Os dois primeiros elementos desta seqüência são: {1,1}.
• O terceiro número e todos os demais números desta seqüência
são definidos pela soma dos dois números anteriores.
• O terceiro número, portanto, será o dois (resultado da soma: 1 +
1), o quarto número será o três (resultado da soma: 2 + 1), o
quinto número será o cinco (resultado da soma: 3 + 2) e assim
sucessivamente.
• A lista dos dez primeiros números desta seqüência são os
seguintes: f(M=10) = {1,1,2,3,5,8,13,21,34,55}
Mediador: Rui Rossi dos Santos
Slide 46
Exercício 3
o Este aplicativo deve realizar toda interação com o usuário
através da janela de comando.
Mediador: Rui Rossi dos Santos
Slide 47
Exercício 3
o O aplicativo deverá solicitar ao usuário o a quantidade de
números que deverão ser gerados.
•
•
•
•
O número informado deve ser maior ou igual a três.
O número deve ser menor ou igual a 92.
Armazene a quantidade informada em uma variável do tipo byte.
Se o dado informado não for um número ou se for um número
superior à capacidade do tipo byte, o aplicativo deve produzir a
seguinte mensagem de erro: “Erro: dado inválido!”.
• Se o número for menor que três ou maior que 92, o aplicativo
deve produzir a seguinte mensagem de erro: “Erro: a quantidade
deve estar entre 3 e 92!”.
Mediador: Rui Rossi dos Santos
Slide 48
Exercício 4
o Crie um novo aplicativo, chamado Exercicio1004, que solicite
um número inteiro e indique se ele é um número perfeito.
• Um número perfeito é um número inteiro para o qual a soma de
todos os seus divisores positivos menores que ele é igual ao
próprio número.
• O número seis é um exemplo de número perfeito porque a soma
de seus divisores é igual a ele próprio: 1 + 2 + 3 = 6.
o Este aplicativo deve realizar toda interação com o usuário
através da janela de comando. A do slide seguinte ilustra
como isto deve ser realizado.
• Procure implementar este aplicativo de modo que sua interação
com o usuário se estabeleça exatamente como você pode
observar nesta figura.
Mediador: Rui Rossi dos Santos
Slide 49
Exercício 4
Mediador: Rui Rossi dos Santos
Slide 50
Exercício 4
o O número informado deve ser maior que zero e deve ser
menor ou igual a 32.767.
• Se o dado informado não for um número ou se for um número
superior a 32767, o aplicativo deve produzir a seguinte
mensagem de erro: “Erro: dado inválido!”.
• Se o número não for maior que zero, o aplicativo deve produzir a
seguinte mensagem de erro: “Erro: o número deve ser maior que
zero!”.
Mediador: Rui Rossi dos Santos
Slide 51
Exercício 5
o Crie um novo aplicativo, chamado Exercicio1005, que
permita o registro de dados coletados através de pesquisa de
campo junto a uma amostra de até 100 pessoas.
• Os dados coletados junto a cada pessoa são apenas três: seu
nome, sua idade e seu estado civil.
o Este aplicativo deve realizar toda interação com o usuário
através de diálogos gráficos.
• A Figura do slide seguinte ilustra como isto deve ser realizado.
• Procure implementar este aplicativo de modo que sua interação
com o usuário se estabeleça exatamente como você pode
observar nesta figura.
Mediador: Rui Rossi dos Santos
Slide 52
Exercício 5
Mediador: Rui Rossi dos Santos
Slide 53
Exercício 5
o Armazene os nomes dos entrevistados em um vetor de string
o Utilize uma matriz do tipo byte para armazenar as idades e os
estados civis.
• Armazene o estado civil como um byte que represente o código
de um dos seguintes caracteres: S, C, V, D, O.
• Eles representarão, respectivamente, os seguintes estados civis:
solteiro(a), casado(a), viúvo(a), divorciado(a) e outros.
o Quando o usuário cancelar um dos diálogos de entrada, o
aplicativo deve considerar que os dados de todos os
entrevistados já foram registrados.
• Nesse caso, realizar os cálculos estatísticos sobre estes dados e
exibir o relatório final através de um diálogo gráfico de saída.
o No relatório, devem constar as seguintes informações:
• Os dados de todas as pessoas entrevistadas.
• A média de idade dos entrevistados.
• O percentual de pessoas que se enquadra em cada estado civil.
Mediador: Rui Rossi dos Santos
Slide 54
Exercício 5
o Se um dado informado não for válido, o aplicativo deve emitir
uma mensagem de erro e solicitá-lo novamente.
o A validade dos dados será quebrada nas situações descritas
abaixo e as mensagens de erro que devem ser exibidas são
aquelas indicadas:
• Se o nome contém menos de 5 ou mais de 50 caracteres, exiba a
mensagem de erro: “O nome deve conter de 5 a 50 caracteres!”.
• Se o nome contiver dígitos numéricos, exiba a mensagem de
erro: “O nome não deve conter números!”.
• Se a idade não for um número inteiro ou se for um número inteiro
superior a 127, exiba a mensagem de erro: “Dado inválido!”.
• Se a idade for menor que zero, exiba a mensagem de erro: “Não
existe idade negativa!”.
• Se o estado civil informado não for um único caractere, exiba a
mensagem de erro: “Informe um caractere!”.
• Se o estado civil informado não for um dos caracteres previstos
(S, C, V, D e O), exiba a mensagem de erro: “Opção inválida!”.
Mediador: Rui Rossi dos Santos
Slide 55
Download

Clique Aqui - Rui Rossi dos Santos