Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Cap
Cap
í
í
tulo 10
tulo 10
Tratamento de Exce
Objetivos do Capítulo
Apresentar o conceito de exceção e caracterizar as
situações sob as quais as exceções se manifestam.
Indicar os mecanismos que podem ser empregados para a
captura e tratamento de exceções.
Explorar a hierarquia de exceções composta pelas classes
da API do Java.
Apontar o que caracteriza as
checked exceptions
e as
unchecked exceptions
e o que distingue estes dois grupos de
exceções.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Introdução
Exceção: condição anormal
Causas:
Falhas na implementação Falhas na operaçãoO responsável
Qualidade de software
Tolerância à falhasIntroduçã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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Estrutura try-catch
Bloco try
Delimita instruções que podem gerar exceções. Um bloco catch para cada tipo de exceção.
Estrutura try-catch
Sintaxe:
try {
<instruções>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Estrutura try-catch
Tratamento genérico:
Uso de tipo genérico: Exception
Sintaxe:
try { <instruções> } catch (Exception ex) { <tratamento> }Estrutura try-catch
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Estrutura try-catch
Estrutura try-catch
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!”
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Estrutura try-catch
Estrutura try-catch
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Estrutura try-catch
Bloco Finally
Objetivo:
Garantir a execução de determinadas instruções.
Requisito:
Vínculo com estrutura try-catch
Sintaxe:
try {
<instruções>
}
catch (<tipo_da_exceção> <nome_da_exceção>) {
<tratamento>
}
finally {
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Bloco Finally
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!”.
Bloco Finally
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
A Hierarquia das Exceções
Uma exceção é uma classe
Cada classe têm uma ancestral direta
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento Obrigatório e Tratamento Opcional
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
Tratamento Obrigatório e Tratamento Opcional
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
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento de Checked Exceptions
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.
Tratamento de Checked Exceptions
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
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 }
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; 56 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
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
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 }
Tratamento para NullPointerException
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento para NullPointerException
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.
Tratamento para NullPointerException
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
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 }
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 }
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento para ArrayIndexOutOfBoundsException
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];
Tratamento para ArrayIndexOutOfBoundsException
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento para ArrayIndexOutOfBoundsException
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 }
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
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 }
Tratamento para InputMismatchException
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
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Tratamento para InputMismatchException
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.
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 }
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
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 }
Tratamento para Outras Exceções
Tipo:
checked exceptions
O compilador avisa
Tratamento obrigatório com estrutura try-catch
Tipo:
unchecked exceptions
Causa sob área de domínio do programador
Alterar algoritmo do programa Não utilizar estrutura try-catch Exemplos:
o NullPointerException
o ArrayIndexOutOfBoundsException o ArithmeticException
Causa fora da área de domínio do programador
Tratar com estrutura try-catch Exemplos:
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 1
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).
Este aplicativo deve realizar toda interação com o usuário
através da janela de comando.
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 1
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.
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.
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 valor do FGTS deve ser calculado pelo aplicativo e
corresponde a 8% do salário.
Exercício 2
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.
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
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 2
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!”.
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”.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 2
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.
Exercício 3
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}
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 3
Este aplicativo deve realizar toda interação com o usuário
através da janela de comando.
Exercício 3
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!”.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 4
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.
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
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 4
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!”.
Exercício 5
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.
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.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 5
Armazene os nomes dos entrevistados em um vetor de string
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.
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.
No relatório, devem constar as seguintes informações:
Os dados de todas as pessoas entrevistadas. A média de idade dos entrevistados.
Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Exercício 5
Se um dado informado não for válido, o aplicativo deve emitir
uma mensagem de erro e solicitá-lo novamente.
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!”.
Contato
Com o autor:
Rui Rossi dos Santos
E-mail: livros@ruirossi.pro.br
Web Site: http://www.ruirossi.pro.br
Com a editora:
Editora NovaTerra
Telefone: (21) 2218-5314