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