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
Download

Exceções