Tratamento de Exceções Rui Rossi dos Santos ruirossi@ruirossi.pro.br Mediador: Rui Rossi dos Santos Slide 1
o Exceção: condição anormal Introdução 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
o Código 10.1 Excecao.java Introdução 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
o Bloco try Estrutura try-catch 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
o Tratamento genérico: Estrutura try-catch Uso de tipo genérico: Exception o Sintaxe: try { <instruções> } catch (Exception ex) { <tratamento> } Mediador: Rui Rossi dos Santos Slide 5
o Código 10.2 Try.java Estrutura try-catch 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
o Código 10.2 Try.java Estrutura try-catch 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
o Objetivo: Bloco Finally 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
o Código 10.5 Finally.java Bloco Finally 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
o Código 10.5 Finally.java Bloco Finally Mediador: Rui Rossi dos Santos Slide 14
o Uma exceção é uma classe A Hierarquia das Exceções 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
o NullPointerException Tratamento para 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
o Tipo: checked exceptions Tratamento para Outras Exceções 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