Curso de Análise e Desenvolvimento de Sistemas Disciplina: Programação Orientada a Objetos Prof. Gilmar Caiado Material de Apoio – 4o Período – 22/09/2009 Programação Orientada a Objetos – Material de Apoio 4 Tratamento de Exceções (try / catch) • Mecanismo implementado na linguagem java que auxilia na recuperação de erros que ocorram em um try, possibilitando o seu tratamento em um catch; Ex. 1: sem captura de erro via try / catch – simulação de erro por divisão de um número por zero: public class ExceptionZeroDivision { //testa a divisão de um número por zero sem capturar a exceção lançada public static void main (String args[]) { double num = 87 / 0; System.out.println("Resultado da divisão: " + num); } } Resultado da execução: Exception in thread "main" java.lang.ArithmeticException: / by zero at tratexcecoes.ExceptionZeroDivision.main(ExceptionZeroDivision.java:7) Ex. 2: captura do erro via try / catch: public class TrataExceptionZeroDivision { //testa a divisão de um número por zero, capturando a exceção lançada public static void main(String args[]) { try { double num = 87 / 0; System.out.println("Resultado da divisão: " + num); } catch (ArithmeticException arthException) { arthException.printStackTrace(); //System.out.println(arthException.toString()); } } } 1 Resultado da execução: java.lang.ArithmeticException: / by zero at tratexcecoes.TrataExceptionZeroDivision.main(TrataExceptionZeroDivision.java:8) Obs: • o tratamento da exceção via try / catch permite o tratamento da exceção capturada em catch, apresentando uma mensagem de erro para o usuário, que pode ser modificada para uma mensagem mais amigável: JOptionPane.showMessageDialog(null, "Erro de divisão por zero!", "Erro", JOptionPane.INFORMATION_MESSAGE); Capturando mais de uma exceção em um try / catch • Mais de uma exceção podem ser tratadas em uma estrutura try / catch. Isso permite uma flexibilidade na programação, gerando respostas diferenciadas para cada tipo de exceção em questão. Ex. 3: Uso das exceções ArithmeticException e java.util.InputMismatchException Obs: • • A exceção java.util.InputMismatchException é disparada quando, se usando a classe Scanner, é fornecido um valor de entrada de tipo diferente do que o esperado; observar as mensagens de resposta ao usuário, dentro dos catchs import java.util.Scanner; import java.util.InputMismatchException; public class TrataDuasExceptions { //demonstra o lançamento de uma exceção qdo ocorre uma divisão por zero public static int quociente(int numerador, int denominador) throws ArithmeticException { return numerador / denominador; } public static void main(String args[]) { Scanner scan = new Scanner(System.in); try { System.out.print("Entre o numerador: "); int numerador = scan.nextInt(); System.out.print("Entre o denominador: "); int denominador = scan.nextInt(); 2 int result = quociente(numerador, denominador); System.out.println("Resultado da divisão de " + numerador + " por " + denominador + ": " + result); } catch (InputMismatchException ime) { System.err.println("Você deve usar somente números inteiros. Tente novamente!"); //ime.printStackTrace(); } catch (ArithmeticException ae) { System.err.println("Você não deve efetuar uma divisão por zero. Tente novamente!"); //ae.printStackTrace(); } } } Relançando a exceção para tratamento por outro método • Uma exceção não precisa ser necessariamente tratada no método em que a mesma surgiu. O tratamento da exceção pode ser enviado para um outro método executar o seu tratamento – relançamento de exceções. Para tanto, usa-se a expressão seguinte, na assinatura do método onde a exceção ocorre: throws <tipo_exceção> Ex. 4: public class TrataThrowsException { //método que lança a exceção public void lancaExcecao() throws ArithmeticException { double num = 87 / 0; System.out.println("Resultado da divisão: " + num); } public TrataThrowsException() { try { lancaExcecao(); } catch (ArithmeticException exc) { System.out.println("Exceção tratada pelo catch do construtor!"); } } public static void main(String args[]) { TrataThrowsException trata = new TrataThrowsException(); } } 3