Excees Aplicaes, durante a execuo, podem incorrer em muitas espcies de erros de vrios graus de severidade Quando mtodos so invocados sobre um objeto: Problemas de estado interno Erros com objetos ou dados que eles manipulam Ele pode estar violando seu contrato bsico Excees
Acontece quando encontra algo inesperado:
Problemas no hardware Erro de entrada e sada (IO) Arrays fora de faixa Erros da aplicao Valores de variveis Saldo insuficiente Diviso por zero Usurio no existe Parmetros de mtodos Nota invalida Falha de Memria Excees desagradvel encontrar erros O que deve ser feito: Notificar o usurio de um erro; Conseguir salvar todo o trabalho Permitir que usurios saiam elegantemente do programa Excees Exceo um desvio no fluxo de execuo normal do programa Indica que houve problema na execuo de um bloco do programa Se no for tratado, programa pode parar O uso correto de excees torna o programa mais robusto e confivel Excees Quando um erro ocorre dentro de um mtodo: Um objeto criado O objeto contm informaes sobre o erro, assim como o tipo e o estado do programa A ao de capturar esse objeto chamamos de throwing an exception O ambiente de execuo (runtime system) tenta encontrar algum tratamento a exceo A busca segue a call stack lista de chamadas de mtodos Excees Hierarquia de Excees em Java Em Java, um objeto de exceo sempre uma instncia de uma classe derivada Throwable Hierarquia de Excees em Java Error: Ocorrem devido a problemas de SO ou hardware No deve lanar um objeto desse tipo
Ao se fazer um programa Java, deve focalizar
na hierarquia Exception Divide em dois ramos: As que derivam de RuntimeException e as que no derivam Hierarquia de Excees em Java RuntimeException: Acontece porque se fez um erro de programao Exemplos: Acesso de array proibido; acesso de ponteiro nulo. Qualquer outra Exceo: Ocorre porque algo ruim, como um erro de E/S, aconteceu com o programa bom em outros aspectos Exemplos: Tentar ler alm do fim de um arquivo; tentar abrir um URL malformado. Tipos de Excees A Java Language Specification define 2 tipos de excees: Exceo No Verificada (unchecked): Deriva da classe Error ou da RuntimeException No precisam ser tratadas, mas podem ser NullPointerException, NumberFormatException, ArrayIndexOutOfBoundsException Se uma exceo no verificada ocorrer e no for tratada, o programa pode parar (console) Exceo Verificada (checked): Excees previsveis Devem ser tratadas pelo programa Formas de Capturar Atravs de uma clusula throws na assinatura do mtodo Ou atravs de uma bloco try Formas de Capturar Um mtodo deve informar que excees ele pode disparar (throw) clusula throws na definio do mtodo Um bloco que tenta (try) chamar um mtodo que pode disparar uma exceo deve trat-la Chamada normal de um mtodo, mas que deve estar em um bloco try{...} catch {...} Uma exceo um objeto que deve ser capturado (catch) nesse bloco que a exceo deve ser tratada Um trecho de cdigo pode ser executado sempre bloco finally Tratando Excees 1 Forma: bloco try-catch-finally Um bloco deve capturar uma exceo para trat-la try { // Executa cdigo Tenta executar // que pode disparar exceo } catch (Exception exception){ // Trata exceo // exception uma referncia Captura // para objeto da // classe Exception } finally { // Este bloco sempre Sempre Executa // executado, independente de // ocorrer exceo } Exemplo Mtodo parseInt pode disparar exceo NumberFormatException (no verificada) Se a exceo for dispara os comandos do bloco try no sero mais executados. O fluxo de execuo muda para a captura (bloco catch) Ela pode no ser tratada. Programa encerra se for disparada System.out.print("Digite um nmero"); String numero = sc.nextLine(); int x; try{ x = Integer.parseInt(numero); System.out.println("Numero digitado vlido"); } catch (NumberFormatException exception){ System.out.println("Digite um nmero vlido"); } Catch Pode haver mais de um bloco catch Cada bloco trata um tipo especfico de exceo O bloco try contm mtodos que podem disparar todas as excees Um mtodo pode disparar mais de uma exceo try { // bloco de comandos } catch (Excecao1 ex1) { // Trata exceo1 } catch (Excecao2 ex2) { // Trata exceo2 } catch (Excecao3 ex3){ // Trata exceo3 } Repassando a responsabilidade Um mtodo pode repassar uma exceo Ele chama um mtodo que dispara uma exceo, mas no quer tratar Ele pode repassar a exceo Basta colocar a clusula throws na assinatura do mtodo Para quem chama, o mtodo que dispara a exceo Repassando a Responsabilidade
public void metodo() throws AlgumaException{
// Corpo do mtodo chama // mtodo que dispara AlgumaException obj.metodoQueDisparaExcecao(); public void qualquer(){ } // alguma coisa try { metodo(); } catch (AlgumaException e) { e.printStackTrace(); } // mais coisa } Definindo Excees 1 Passo: Defina uma classe que herde de Exception Ou RuntimeException se desejar fazer exceo no verificada
public class ContatoNaoEncontradoException extends Exception {
public ContatoNaoEncontradoException() { super("Contato no encontrado"); } } Definindo Excees 2 Passo: No mtodo que dispara a exceo: Coloque a clusua throws Crie o objeto da classe de exceo Dispare (throw) a exceo Onde a exceo ser disparada depende de cada mtodo public Contato buscar(String nome) throws ContatoNaoEncontradoException{ // Laco para procurar contato pelo nome for (int i = 0 ; i < quantidade ; i++) if (contatos[i].nome().equals(nome)) return contatos[i]; // Se sair do lao e no tiver retornado // o contato no esta cadastrado // deve disparar excecao throw new ContatoNaoEncontradoException(); } Definindo Excees 3 Passo: Exceo tratada na interface com usurio private void buscarContato() { System.out.print("Digite o nome: "); String nome = sc.nextLine(); try { Contato contato = agenda.buscar(nome); System.out.println(contato); } catch (ContatoNaoEncontradoException e) { System.out.println("ERRO!!!!"); System.out.println(e.getMessage()); System.out.println("\nDigite [ENTER] para continuar...."); sc.nextLine(); } } Exerccio Crie uma Classe CalculoMatematico Nela, crie um mtodo divisao, que recebe como parmetros os valores a serem divididos. O retorno o resultado da diviso (todos os nmeros devem ser do tipo inteiro) Crie uma classe de teste para testar a CalculoMatematico Nela crie um objeto CalculoMatematico e acesse o mtodo divisao, tentando dividir 4 por 0. Execute a classe e veja o que acontece Exerccio Crie um bloco try...catch no metodo divisao para tratar a operao realizada No catch: Informar o objeto do tipo ArithmeticException Imprimir uma mensagem informando que a operao no pode ser realizada Retorna zero Exerccio Tire o bloco try...catch do mtodo divisao Adicione throws ArithmeticException na assinatura do mtodo E na primeira linha do bloco do mtodo, faa uma verificao se o divisor igual a 0 Se for, lance uma exceo throw new ArithmeticException(Texto); Na classe de teste, crie um bloco try...catch, tentando executar o mtodo diviso Catch para ArithmeticException No bloco do Catch, imprima o mtodo getMessage() do objeto criado do tipo ArithmeticException Exerccio Crie uma nova Classe DivisorZeroException Implemente da mesma forma do slide 19 Na Classe CalculoMatematico, troque ArithmeticException por DivisorZeroException throws DivisorZeroException throw new DivisorZeroException(); Na classe de teste, troque no Catch ArithmeticException por DivisorZeroException