Exceções Exceções Prof. Anderson Augustinho Uniandrade Exceções Exceções são acontecimentos fora do comportamento normal ou desejado para um programa, por exemplo: – Erros aritméticos – Entrada de dados inválida – Falha no tratamento de arquivos – Estouro do limite de arrays O gerenciamento excepcionais. de exceções permite o controle sobre condições Quando utilizamos exceções, fica clara a separação entre o código normal do programa, e o código de tratamento de anomalias. Isto proporciona uma maior legibilidade do código-fonte. Exceções Prof. Anderson Augustinho Uniandrade Erros, Exceções Verificadas e Não-Verificadas Erros ocorrem na JVM, e não exatamente na própria aplicação. Geralmente representam um problema do qual a aplicação não consegue se recuperar. Por exemplo: falta de memória. Já as exceções, podem ser subdivididas em: Exceções verificadas: são chamadas assim porque o compilador faz uma verificação nos métodos que as indicam, garantindo que estas exceções sejam devidamente tratadas no código chamador. São todas as instâncias da classe Exception ou de uma de suas subclasses, excluindo-se o ramo da subclasse RuntimeException. Exceções não-verificadas: são aquelas originadas da classe RuntimeException, e ocorrem devido a bugs no programa. Estas exceções não aconteceriam senão por falhas no algoritmo. Exceções Prof. Anderson Augustinho Uniandrade Hierarquia de Exceções Fonte: Deitel – Java Como Programar – 6a edição – pág. 478 Exceções Prof. Anderson Augustinho Uniandrade Exemplo de Código Frágil public class TestNull { public static void main(String[] args) { String s = null; char c1 = s.charAt(2); //java.lang.NullPointerException (programa pára) String s = new String("Curitiba"); char c2 = s.charAt(2); char c3 = s.charAt(8); //java.lang.StringIndexOutOfBoundsException //(programa pára) } } //fim Exceções Prof. Anderson Augustinho Uniandrade Exemplo de Código Protegido com Verificações public class TestNullComVerificacao { public static void main(String[] args) { String s = null; //verifica antes de obter o caracter if (s != null && s.length() > 2) char c1 = s.charAt(2); String s = new String("Curitiba"); //verifica antes de obter o caracter if (s != null && s.length() > 8) char c3 = s.charAt(8); } } Exceções Prof. Anderson Augustinho Uniandrade Exemplo de Código Protegido com Tratamento de Exceções public class TestNullComExcecao { public static void main(String[] args) { try { //bloco com o código normal do programa String s = null; char c1 = s.charAt(2); String s = new String("Curitiba"); char c2 = s.charAt(2); char c3 = s.charAt(8); } catch (Exception e) { //tratamento de exceções } } } //fim Exceções Prof. Anderson Augustinho Uniandrade Tratamento Básico de Exceções Bloco finally O bloco finally é opcional, e por muitas vezes é referido como cláusula finally. O código do bloco finally sempre é executado, independente da ocorrência de exceções. public class TratamentoExcecoes { public static void main(String[] args) { try { //código normal do programa, passível a falhas } catch (Exception e) { //tratamento de falhas } finally { //bloco de finalização } } } Exceções Prof. Anderson Augustinho Uniandrade Lançamento de Exceções As situações anormais nos programas Java são materializadas em referências para instâncias de exceções. Toda situação de exceção, corresponde ao lançamento de uma instância da classe de exceção adequada. Tanto a JVM como o programador podem lançar exceções (utilizando a palavra throw). public void sacar(double valorSaque) throws Exception { if (saldo < valorSaque) { throw new Exception("Saldo insuficiente!"); } saldo = saldo - valorSaque; } Exceções Prof. Anderson Augustinho Uniandrade Propagação de Exceções Os métodos que podem lançar exceções verificadas, precisam declarar a palavra throws na sua assinatura. O método chamador, por sua vez, deverá lidar com as possíveis exceções. Isto pode ser feito de duas maneiras: – Tratar a exceção utilizando um bloco try / catch; – Propagar a exceção, declarando o método com a palavra throws; public void transferir(Conta origem, Conta destino, double valor) throws Exception { origem.sacar(valor); destino.depositar(valor); } Exceções Prof. Anderson Augustinho Uniandrade Tratamento de Exceções Como não fazer O pior, seria capturar uma exceção e nada fazer com ela. Por tanto, não devemos fazer isso: try { //código passível a falhas } catch (Exception e) { } Exceções Prof. Anderson Augustinho Uniandrade Exceções Personalizadas Podemos ainda criar as nossas próprias classes de exceção, o que pode nos beneficiar com uma maior flexibilidade. public class SaldoInsuficienteException extends Exception { public SaldoInsuficienteException() { super("Saldo Insuficiente!"); } public SaldoInsuficienteException(String mensagem) { super(mensagem); } } Exceções Prof. Anderson Augustinho Uniandrade