O documento discute o tratamento de erros em programação, definindo exceções, tratamento de exceções e como isso permite que programas continuem executando mesmo quando erros ocorrem. Ele também explica os blocos try, catch e finally, e como eles são usados para tratar erros específicos como divisão por zero. Além disso, discute hierarquia de exceções em Java e como precondições e pós-condições podem ser usadas.
2. Introdução
• Exceção
• Indicação de um problema que ocorre durante a
execução de um programa
• O problema ocorre raramente
• A regra é que uma instrução deve executar de
modo correto
• A exceção à regra é quando isso não ocorre
• O tratamento de exceções permite que um
programa continue executando
3. Visão Geral
• Tratamento de exceções
• Permite remover o código de erro da linha
principal de execução do programa
• Cada programador pode escolher a exceção que
quer tratar
• Os programas tornam-se mais robustos quando
os erros não são negligenciados
4. Exemplo 1 e 2
• Divisão por zero
• Rastreamento de pilha
• Linhas de informações que são exibidas em
resposta a uma entrada inválida. Incluem o nome
da exceção em uma mensagem descritiva que
indica o problema que ocoorreu, e a pilha
completa de chamada de método no momento
em que a exceção ocorreu.
5. Exemplo 1 e 2
• Java não permite a divisão por zero entre números
inteiros
• Java permite a divisão por zero com valores de
ponto flutuante
• java.lang.ArithmeticException: / by zero
• Indica que essa exceção ocorreu como resultado
de uma tentativa de divisão por zero
• Ponto de lançamento
• Linha superior da cadeia de chamadas. Ponto
incial onde a exceção ocorre
6. Exemplo 1 e 2
• InputMismatchException
• Ocorre quando o método Scanner nextInt recebe
uma String que não representa um número
inteiro válido
• Em alguns casos, o aplicativo java continua
executando mesmo ocorrendo uma exceção. É
preciso tratar isto também para que resultados
inesperados não ocorram
7. Bloco TRY
• Throw = lançar
• Inclui o código que pode lançar uma exceção e o
código que não deve ser executado se ocorrer uma
exceção.
• Se ocorrer uma exceção:
• O código restante do bloco try será pulado e o
controle vai pra o bloco catch
8. Bloco Catch
• CATCH = captura
• BLOCO CATCH
• Contém o código que captura e trata a
exceção, permitindo que o aplicativo java continue
executando
• Exceção não capturada
• É uma exceção à qual não há nenhum bloco catch
correspondente
9. Bloco Catch
Se ocorrer uma exceção em um bloco try:
O bloco catch captura a exceção
O bloco catch que será executado é o bloco
catch cujo o tipo é correspondente ao tipo da
exceção que ocorreu
Todo bloco CATCH exibe uma mensagem de erro
e pede para o usuário tentar novamente
10. Modelo de terminação
• Se ocorrer uma exceção em um bloco TRY:
• Ele é terminado
• O controle vai para o primeiro BLOCO CATCH
seguinte que tem o tipo correspondente
• O controle de programa não volta ao ponto de
lançamento do bloco TRY
• O controle de programa retoma depois do último
bloco CATCH
• Depois de uma exceção ser tratada:
• O controle é retomado logo em seguida ao ponto
de lançamento da exceção
11. Escopo
• Quando um bloco try termina:
• As variáveis locais declaradas no bloco saem de
escopo e são destruídas
• Quando um bloco catch termina:
• As variáveis locais declaradas dentro do bloco
catch, incluindo os parametros de exceção desse
bloco, também saem de escopo e são destruídos
12. Clausula THROWS
• Especifica as exceções que o método lança
• Aparece depois da lista de parâmetros do método e
antes do corpo do método
• Contém uma lista das exceções separadas por vírgulas
que o método lançará se ocorrer um problema
• Essas exceções podem ser lançadas por instruções no
corpo do método ou por métodos chamados no corpo
• Um método pode lançar exceções das classes listadas
em sua cláusula throws ou de suas subclasses
13. Quando usar?
• O tratamento de exceções é projetado para
processar erros síncronos, que ocorrem quando
uma instrução é executada.
• O tratamento de exceções não é projetado para
processar problemas associados com os eventos
assíncronos, que ocorrem paralelamente com o
fluxo
de
controle
do
programa
e
independentemente dele.
16. Hierarquia de Exceções
Lançada para indicar que um índice
de algum tipo (como para uma
matriz, para uma string, ou um
vetor) está fora da faixa definida.
17. Hierarquia de Exceções
• Todas as classes de exceção do JAVA herdam, direta ou
indiretamente, da classe EXCEPTION.
• THROWABLE
• Subclasse de OBJECT e superclasse de EXCEPTION
• EXCEPTION e ERROR
• Representam situações excepcionais que podem
ocorrer em um programa Java e podem ser
capturadas pelo aplicativo
18. Exceções Verificadas
• Obriga a quem chama o método ou o construtor a
tratar essa exceção
• O compilador checará se ela está sendo
devidamente tratada
• Exceções verificadas tem que ser tratadas ou
lançadas!
19. Exceções Não Verificadas
• São os problemas que provavelmente poderiam
ser evitados pelo programador.
• É por esse motivo que o JAVA não te obriga a usar
o try/catch nessas exceptions.
• O compilador não checa se você está tratando
essas exceções.
20. ERROR
• Representam situações anormais que poderiam
acontecer na JVM
• ERROR acontece raramente e não devem ser
capturados por aplicativos
• Todas as classes que herdam da classe ERROR são
Exceções Não Verificadas
22. Exception
• A exceção EXCEPTION e suas subclasses, são exceções
programáticas
• Todas as classes que herdam da classe EXCEPTION mas
não da classe RuntimeException são exceções
verificadas
• Exceções Programáticas
• São aquelas criadas por um aplicativo ou por um
desenvolvedor de API.
23. Exceções Não Verificadas e
Exceções Verificadas
• As classes de exceção são definidas como classes
verificadas
quando
são
consideradas
suficientemente importantes para a captura ou
declaração em uma clausula throws
• Fonte:
http://www.caelum.com.br/apostila-javaorientacao-objetos/excecoes-e-controle-deerros/#11-4-outro-tipo-de-excecao-checkedexceptions
24. Capturas de Exceções
• Se um catch for escrito para capturar objetos de
exceção de um tipo de superclasse, ele também
pode capturar todos os objetos de subclasses
dessa classe.
• É um erro de compilação capturar o mesmo tipo
de exceção em dois ou mais blocos catch
diferentes associados com um bloco try em
particular.
25. Capturas de Exceções
• Capturar a superclasse garante que os objetos de
todas as subclasses serão capturadas
• Um erro de compilação ocorrerá caso um bloco
catch, para um tipo de exceção de superclasse, seja
colocado ANTES de outros blocos catch que
capturam tipos de exceção de subclasse.
• Como
consequencia,
esses
blocos
não
executarão, pois o bloco da superclasse já os está
tratando.
26. Finally
• Programas que obtem certos tipos de recursos
devem retorna-los ao sistema explicitamente para
evitar os vazamentos de recursos.
• Exemplos: arquivos, conexões de banco de
dados, conexões de rede, etc...
• Bloco finally é opcional
28. Finally
• Um bloco finally NÃO EXECUTARÁ:
• Se o aplicativo fechar antes de um bloco try
chamando o método system.exit (método que
encerra um aplicativo de forma imediata)
• Um bloco finally EXECUTARÁ:
• Se uma exceção for lançada no BLOCO TRY ou
BLOCO CATCH correspondente
29. Finally
• Se uma exceção ocorrer:
• O programa pula o restante do bloco try
• Se o programa capturar a exceção em um dos
blocos catch:
• O programa processa a exceção
• O bloco finally libera o recurso em seguida
• O controle do programa prossegue à primeira
instrução depois do bloco finally
30. Finally
• Se uma exceção não ocorrer:
• Os blocos catch são pulados
• O controle do programa prossegue para o bloco
finally
• O bloco finally libera o recurso
• O controle do programa prossegue à primeira
instrução depois do bloco finally
31. Finally
• Se uma exceção não puder ser capturada:
• O programa pula o restante do bloco try
• O programa prossegue para o bloco finally (que
executa)
• O programa passa a exceção para o próximo
bloco try externo
• Um bloco catch associado pode capturar a
exceção
• O bloco finally executará de qualquer
forma, mesmo que a exceção não for capturada
32. System.err
• Fluxo: uma sequência de bytes
• System.out: é o fluxo de saída padrão. É usado
para exibir uma saída do programa. As saídas
podem ser enviadas para o monitor de tela.
• System.err: é o fluxo de erro padrão. É usado para
exibir erros de um programa. As saídas podem ser
enviadas para um arquivo de log.
34. Desempilhamento de pilha
• Quando uma exceção é lançada mas não é
capturada em um escopo em particular
• A pilha de chamada de método é desempilhada
• Uma tentativa de capturar a exceção no próximo
bloco try externo é feita.
35. Desempilhamento de pilha
• Desempilhar a pilha de chamada de método
significa:
• O método em que a exceção não foi captura é
encerrado
• Todas as variáveis nele presentes saem de
escopo
• O controle retorna à instrução que invocou esse
método.
36. Desempilhamento de pilha
• Se um bloco try incluir essa instrução:
• Uma tentativa de capturar a exceção com catch é
feita
• Se um bloco try não incluir essa instrução:
• O desempilhamento ocorre novamente
• Se nenhum bloco catch capturar alguma vez essa
exceção e a exceção for verificada:
• Compilar o programa resultará em um erro
38. Métodos da classe Throwable
• printStackTrace
• Envia para o fluxo de erro padrão o rastreamento da
pilha
• Util para o processo de teste e depuração
• getStackTrace
• Recupera informações sobre o rastreamento de
pilha que podem ser impressas por printStackStrace
• getMessage
• Retorna a string descritiva armazenada em uma
exceção
40. Exceções Encadeadas
• Permitem que um objeto de exceção mantenha
informações do rastreamento de pilha completo
• As vezes um bloco catch captura um tipo de
exceção e depois lança uma nova exceção de um
tipo diferente para indicar que ocorreu uma
exceção específica no programa
• Exceções encadeadas empacotam as informações
da exceção original com as informações da nova
exceção
42. Precondições e PósCondições
• São os estados esperados antes e depois da
exceução de um métodos
• Facilitam as tarefas e aprimoram todo o projeto
• Diminuem os gastos com manutenção e depuração
do código
43. Pré Condição de um Método
• É uma condição que deve ser verdadeira quando o método
é invocado
• Descrevem parâmetros de método
• Descrevem quaisquer outras expectativas que o método
tenha sobre o estado atual de um programa
• Se
um
usuário
não
conseguir
atender
às
précondições, então o comportamento de um método é
indefinido
• Nunca você deve supor ou esperar que o comportamento
seja consistente se as précondições não forem satisfeitas
44. Pós Condição de um Método
• É uma condição que deve ser verdadeira depois de o
método retornar com sucesso
• Descrevem o valor de retorno
• Descrevem quaisquer outros efeitos colaterais que o
método possa apresentar
• Ao chamar um método, você pode assumir que ele cumpre
todas as suas pós conições
• Você deve documentar toda as pós condições para que os
outros programadores saibam o que esperar ao chamar o
método
45. Precondições e PósCondições
• EXEMPLO: Método STRING CHARAT
• Tem um parâmetro int: um índice na String
• Précondição: o método assume que INDEX é
maior que ou igual a zero e menor que o
comprimento da STRING
46. Precondições e PósCondições
• EXEMPLO: Método STRING CHARAT
• Póscondição:
• Caso a PRÉCONDIÇÃO seja atendida:
• Declara que o método retornará o caractere
na posição na STRING especificada pelo
parâmetro INDEX
• Caso a PRÉCONDIÇÃO não seja atendida:
•O
método
lança
uma
IndexOutOfBoundsException
47. Precondições e PósCondições
• O método charAt satisfaz sua póscondição desde
que o programador atenda à precondição
• DOCUMENTAÇÃO DO SOFTWARE
• Escreva as póscondições e as précondições na
especificação do seu software, se preferir, escreva
comentários em cada declaração de método
48. Assertivas
• Condições que devem ser verdadeiras em um
ponto particular de um método
• Ajudam a assegurar a validade de um programa
capturando BUGS potenciais
• Ajudam a identificar possíveis erros de lógica
durante o desenvolvimento
• Précondições e póscondições são dois tipos de
assertivas
49. Assertivas
• Pré condições: assertivas sobre o estado de um
programa quando um método é invocado
• Pós condições: assertivas sobre o estado de um
programa depois do encerramento de um método
• Assertivas
podem
comentários
ser
declaradas
como
• ASSERT: instrução para validar as assertivas
programaticamente
50. Assertivas
• ASSERT: avalia uma expressão BOOLEAN e
determina se ela é verdadeira ou falsa
expressão assert
• Avalia expressão e lança um AssertionError se a
expressão for false
assert expressão1 : expressão2
• Avalia
expressão1
e
lança
um
AssertionError, com expressão2 como a
mensagem de erro, se expressão1 for false
51. Exemplo 7
• Entrar no CMD.EXE
• Entrar no diretório onde está salvo o arquivo .class
• Java –ea AssertTest