22/9/16. Agenda. Erros. Erros. Exceções. Mecanismo de exceções

Documentos relacionados
9 Exceções. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

[Desenvolvimento OO com Java] Exceções e controle de erros

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

Linguagens de Programação 8 Exceções

Programação Orientada a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

TRATAMENTO DE EXCEÇÕES

Tratamento de Exceções cont. Profa. Thienne Johnson EACH/USP

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc.

Tratamento de Exceções. Java Avançado. Tratamento de Exceções. Conceito de Exceções. Exemplo

Tratamento de Exceções. Julio Cesar Nardi

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

Java para Desktop. Exceções JSE

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Tratamento de Exceções

JAVA. Tópicos Especiais de Programação Orientada a Objetos. sexta-feira, 28 de setembro de 12

Programação Java. Tratamento de Exceções

Tratamento de Exceções. Grupo de Linguagens de Programação Departamento de Informática PUC-Rio

O tratamento de erros em Java

Tratamento de Exceções

Tratamento de Exceções. Prof. Marcelo Roberto Zorzan

Tratamento de Exceção. Tratamento de Exceções. Vantagens de TE. Exemplos de Exceções. Exemplo: Divide1 (sem TE)

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

Programação Orientada a Objetos SANTOS, Rafael (PLT)

Exceções. SCC0504 Programação Orientada a Objetos. Luiz Eduardo Virgilio da Silva ICMC, USP

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Linguagens de Programação Conceitos e Técnicas. Exceções

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Laboratório de Programação. Aula 12 Java 5COP088. Aula 12 Exceções Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II JAVA Décima Segunda Aula

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Aula 13 Tratamento de Exceções. Disciplina: Programação Estruturada e Orientada a Objetos Prof. Bruno Gomes

Computação II Orientação a Objetos

Notas de Aula 09: Tratamento de exceções

Tratamento de Exceções

Computação II Orientação a Objetos

Aula 13 POO 1 Tratamento de Exceções no Java. Profa. Elaine Faria UFU

Exceções. Profa. Patrícia A. Jaques Slides alterados por Leandro Tonietto Mar-12. quarta-feira, 21 de março de 12

Tratamento de Exceções em Java

1. Estude e implemente a classe Exemplo1 apresentada abaixo:

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Programação de Computadores II TCC /Turma A 1

Programação Orientada a Objetos. Manipulação de Exceções

Tratamento de Exceções

AULA TEÓRICA 3. Tema 4. Excepções Ø Tratamento de excepções

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Programação Orientada a Objetos (DPADF 0063)

Exceções. Criando suas exceções

Tratamento de Exceções. Prof. Leonardo Barreto Campos 1

Programação Orientada a Objetos

Tratamento de Erro e Javadoc. Professor: Norton T. Roman

Programação de Computadores II

Tratando exceções em Java

Programação Orientada a Objetos II

12 Tipos Genéricos. Desenvolvimento OO com Java. Vítor E. Silva Souza

Controlando Erros com Exceções

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Tratamento de Exceções. Profa. Thienne Johnson EACH/USP

Manipulação de excecões e manipulação de eventos

4 Conceito de Herança

Paradigmas da Programação PPROG. Linguagem JAVA. Exceções. (Livro Big Java, Late Objects Capítulo 7) Nelson Freire (ISEP DEI-PPROG 2015/16) 1/45

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

6 Polimorfismo. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Programação Orientada a Objetos. Prof. Diemesleno Souza Carvalho

Mecanismo de exceções em Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Programação Orientada a Objetos JAVA - NETBEANS

terminar o programa; retornar um valor de erro indicando falha; retornar e ignorar o problema; chamar uma função para tratar o erro, etc...

Erros, exceçõ. ções e asserçõ

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Introdução. LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\C++. C C++.

Escola Superior de Gestão e Tecnologia. Tratamento de Exceções

Programação Java (nível intermediário) 4. Polimorfismo

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

01. [Sebesta, 2000] Defina exceção, manipulador de exceções, levantamento de uma exceção, desativação de uma exceção e exceção incorporada.

Java Standard Edition (JSE)

Classes e Objetos. Sintaxe de classe em Java

Programação OO em Java

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Implementar um exemplo de relacionamento entre classes um para muitos (1:N) e um para um (1:1). Sistema para uma Promotora de Evento Agenda Anual

Linguagem de Programação II Implementação

Programação Estruturada e Orientada a Objetos

Programação por Objectos. Java

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Lista de Exercícios da disciplina Aplicações de Linguagem de Programação Orientada a objetos

Driver Mysql para Banco de Dados. Conexão com um Banco de Dados

MCG126 Programação de Computadores II

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

APIs Java: Tratamento de exceções e Coleções

Sistemas Distribuídos

Programação Orientada a Objetos SANTOS, Rafael

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Transcrição:

Agenda Desenvolvimento OO com Java Exceções Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Apresentar o mecanismo de tratamento de exceções de Java; Explicar os diferentes :pos de exceções, como lançálas, capturá-las e tratá-las; Mostrar como criar suas próprias exceções. Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada. Julho 2013 Desenvolvimento OO com Java 2 Erros Quando desenvolvemos sojware, estamos sujeitos a muitos erros; Muitos erros podem ser iden:ficados no momento da compilação: Sintaxe incorreta; Iden:ficador (variável, método, etc.) desconhecido; Classe não encontrada; Etc. Erros Porém, alguns erros ocorrem somente durante a execução; Podem ser bugs: Cálculos incorretos, trecho de código não implementado, etc.; Devem ser corrigidos na depuração. Podem ser condições excepcionais: Falha no sistema de arquivos, entrada de dados inválida, etc.; Devem ser tratados pelo próprio programa. Julho 2013 Desenvolvimento OO com Java 3 Julho 2013 Desenvolvimento OO com Java 4 Exceções Condição provocada por uma situação excepcional que requer uma ação específica e imediata; Desvia o fluxo de controle do programa para um código de tratamento; Podem ser causadas por diversas condições: Erros sérios de hardware; Erros simples de programação; Condições esperadas (não são erros). Mecanismo de exceções Uma LP pode ou não oferecer um mecanismo específico para tratar exceções; Vantagens: Maior confiabilidade; Maior legibilidade e redigibilidade. Java oferece um mecanismo de exceções. Julho 2013 Desenvolvimento OO com Java 5 Julho 2013 Desenvolvimento OO com Java 6 1

Tipos de exceção Exceções, como (quase) tudo em Java, são objetos; Porém são objetos especiais: podem ser manipulados pelo mecanismo de exceções. java.lang.throwable Ancestral de todas as classes que recebem tratamento do mecanismo de exceções; Principais métodos: void printstacktrace(): lista a sequência de métodos chamados até o ponto onde a exceção foi lançada; String getmessage(): retorna o conteúdo de um atributo que contém uma mensagem indicadora da exceção; O método tostring() também é implementado e retorna uma descrição breve da exceção. Julho 2013 Desenvolvimento OO com Java 7 Julho 2013 Desenvolvimento OO com Java 8 java.lang.error Representa um problema grave, de diicil (ou impossível) recuperação; Exemplos: OutOfMemoryError, StackOverflowError, etc. Geralmente causam o encerramento do programa; Não devem ser usadas pelos programadores. java.lang.exception Exceções que podem ser lançadas pelos métodos da API Java ou pelo seu programa; Devem ser tratadas; Em geral, representam situações inesperadas, porém contornáveis; O programador tem contato com esta classe e suas subclasses. Julho 2013 Desenvolvimento OO com Java 9 Julho 2013 Desenvolvimento OO com Java 10 java.lang.runtimeexception Tipo especial de exceção; Não necessitam ser lançadas explicitamente pelo programa; Seu tratamento não é obrigatório; Ex.: NullPointerException; IndexOutOfBoundsException; etc. Exception x RuntimeException RuntimeException: Dão menos trabalho para codificar; Geralmente representam bugs; O código deve ser consertado para que ela não mais ocorra. Exception: Aumentam a confiabilidade do código; Geralmente representam situações esperadas; Em seu tratamento, a situação deve ser contornada e o programa con:nua a funcionar. Julho 2013 Desenvolvimento OO com Java 11 Julho 2013 Desenvolvimento OO com Java 12 2

Captura e tratamento de exceções São obrigatórios para exceções não-run$me; Podem ser feitos para exceções run$me; Códigos que podem lançar exceções são colocados em blocos supervisionados; Tratadores de exceção são dispostos após o bloco, especificando quais exceções são esperadas; Esquema conhecido como blocos try catch. Blocos try catch // Código que pode lançar exceções... catch (ExcecaoA e) { // Tratamento da exceção A, // ou qualquer subclasse de ExcecaoA. // e = instância da classe de exceção. catch (ExcecaoB e) { // Tratamento da exceção B. catch (Exception e) { // Tratamento de qualquer exceção. Julho 2013 Desenvolvimento OO com Java 13 Julho 2013 Desenvolvimento OO com Java 14 Mul:-catch (Java 7) Se o tratamento de duas exceções diferentes for o mesmo, há repe:ção de código: // Imagine um método para abrir uma conexão com o BD. Connection conn = null; Class.forName(driver); conn = DriverManager.getConnection(url, usu, senha); catch (ClassNotFoundException ex) { catch (SQLException ex) { return conn; Mul:-catch (Java 7) Podemos generalizar a exceção para a superclasse comum mais próxima: // Imagine um método para abrir uma conexão com o BD. Connection conn = null; Class.forName(driver); conn = DriverManager.getConnection(url, usu, senha); catch (Exception ex) { return conn; Porém isso deixa o código genérico demais... Julho 2013 Desenvolvimento OO com Java 15 Julho 2013 Desenvolvimento OO com Java 16 Mul$-catch (Java 7) A par:r do Java 7, resolve-se o problema com um catch múl:plo (mul$-catch): // Imagine um método para abrir uma conexão com o BD. Connection conn = null; Class.forName(driver); conn = DriverManager.getConnection(url, usu, senha); catch (ClassNotFoundException SQLException ex) { return conn; Casamento sucessivo Quando uma exceção ocorre, procura-se um tratador adequado; As cláusulas catch são checadas em sequência; A primeira que servir é executada e o programa procede após o úl:mo tratador (os demais blocos catch não são executados); Portanto, cuidado com a ordem! Ex.: se a captura de Exception fosse a primeira, as outras nunca seriam executadas. Julho 2013 Desenvolvimento OO com Java 17 Julho 2013 Desenvolvimento OO com Java 18 3

Lançamento de exceções O lançamento de uma exceção pode ser implícito ou explícito; Implícito: Erro iden:ficado pelo Java; Ex.: ponteiro nulo, índice fora dos limites, etc. Explícito: Lançado pela API do Java ou por seu programa quando uma situação inesperada é encontrada; Ex.: entrada de dados inválida, fim de arquivo, etc. O comando throw Para lançar exceções explicitamente, use a palavrachave throw: public static void main(string[] args) { throw new Exception("Exceção Teste"); catch (Exception e) { System.out.println("Capturada: " + e); e.printstacktrace(); Julho 2013 Desenvolvimento OO com Java 19 Julho 2013 Desenvolvimento OO com Java 20 Caso um tratador adequado não seja encontrado no bloco onde a exceção foi lançada, ela é propagada para para o nível mais externo; A propagação con:nua até que algum tratador seja encontrado ou até chegar ao nível da JVM; O tratamento padrão da JVM é imprimir a exceção na saída padrão. public void teste(int num) { // 1 // 2 // 3 catch (EOFException e) { catch (IOException e) { catch (NumberFormatException e) { Julho 2013 Desenvolvimento OO com Java 21 Julho 2013 Desenvolvimento OO com Java 22 Os blocos try catch aninhados formam diferentes níveis; Se uma exceção não é tratada no bloco 3, é propagada para o 2 e assim por diante; Exceções não-run$me devem ser tratadas em algum lugar do método: Do contrário gera erro de compilação; Ex.: trocar IOException por NullPointerException no segundo tratador. // Este código não compila: public void teste(int num) { // 1 // 2 // 3 catch (EOFException e) { catch (NullPointerException e) { catch (NumberFormatException e) { Julho 2013 Desenvolvimento OO com Java 23 Julho 2013 Desenvolvimento OO com Java 24 4

É possível propagar uma exceção para fora do método onde ela ocorreu; Uso da palavra-chave throws; A responsabilidade de tratar fica com o código que chamou este método; Por sua vez, pode tratá-la ou lançá-la novamente; Se o método main() lançar uma exceção, ela é capturada pela JVM e impressa na tela. // Este código compila! public void teste(int num) throws IOException { // 1 // 2 // 3 catch (EOFException e) { catch (NullPointerException e) { catch (NumberFormatException e) { Julho 2013 Desenvolvimento OO com Java 25 Julho 2013 Desenvolvimento OO com Java 26 Todo método é obrigado a indicar em seu cabeçalho as exceções (não-run$me) que propaga; Avisa aos usuários do método quais exceções podem ocorrer e não são tratadas; Um método pode propagar quantas exceções quiser: public void teste(int num) throws EOFException, IOException, NumberFormatException { public void outroteste() { metodolancador(); catch (IOException e) { System.out.println("Veio de outro método:"); e.printstacktrace(); public void metodolancador() throws IOException { throw new IOException(); Julho 2013 Desenvolvimento OO com Java 27 Julho 2013 Desenvolvimento OO com Java 28 Recapitulando... O que já aprendemos: Erros devem ser tratados pelo mecanismo de tratamento de exceções; Exceções são objetos com tratamento especial que estão na hierarquia da classe Throwable; Usamos mais Exception e RuntimeException, sendo que esta úl:ma não precisa ser declarada; Exceções ocorrem em blocos try catch e podem ser lançadas para um nível mais externo; Prosseguindo... Como criar minhas próprias exceções? Criação de exceções Além de usar as exceções da API Java, o programador pode criar suas próprias exceções; Basta criar uma classe que esteja na hierarquia de Throwable (abaixo de Error, Exception ou RuntimeException); Coloque como propriedades da exceção informações importantes do contexto no qual ela foi lançada. Julho 2013 Desenvolvimento OO com Java 30 Julho 2013 Desenvolvimento OO com Java 31 5

Criação de exceções class ExcecaoImpar extends Exception { private int x; public ExcecaoImpar() { public ExcecaoImpar(String msg) { super(msg); public ExcecaoImpar(int x) { this.x = x; public String tostring() { return "O número " + x + " é ímpar!"; Criação de exceções public static void imprimepar(int num) throws ExcecaoImpar { if ((num % 2) == 0) System.out.println(num); else throw new ExcecaoImpar(num); public static void main(string[] args) { imprimepar(2); imprimepar(3); catch (ExcecaoImpar e) { System.out.println(e); Julho 2013 Desenvolvimento OO com Java 32 Julho 2013 Desenvolvimento OO com Java 33 Quando criar exceções? Quando em seu código puder ocorrer alguma situação inevitável (porém esperada) e não existe uma exceção pronta que represente-a especificamente; Exemplos: Usuário digitou informação errada; Encapsular um erro interno de alguma classe que você u:liza; Etc. Muito usadas por bibliotecas de classes e frameworks. A cláusula finally Usada quando queremos que um trecho de código seja executado independente de haver ou não exceção; Colocada após o úl:mo tratador; O bloco finally é sempre executado! Todo bloco try deve ter um ou mais blocos catch ou um bloco finally; Pode ter ambos, formando uma estrutura conhecida como try catch finally. Julho 2013 Desenvolvimento OO com Java 34 Julho 2013 Desenvolvimento OO com Java 35 A cláusula finally // Código que pode lançar exceções... catch (ExcecaoA e) { // Tratamento da exceção A, // ou qualquer subclasse de ExcecaoA. // e = instância da classe de exceção. catch (ExcecaoB e) { // Tratamento da exceção B. finally { // Código executado ao final. Julho 2013 Desenvolvimento OO com Java 36 Finally executado independentemente do que ocorre dentro do try class Test { public static void main(string args[]) { System.out.println(Test.test()); public static int test() { return 0; finally { System.out.println("finally trumps return."); // fonte: http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java Output: finally trumps return. 0 Julho 2013 Desenvolvimento OO com Java 37 6

Exceções e herança As exceções adicionam certa complexidade à herança devido ao mecanismo de construção e à sobrescrita de métodos; Construtores e exceções: Construtores são obrigados a lançar exceções declaradas no construtor da superclasse; Construtores podem lançar exceções que não são declaradas no construtor da superclasse. Por que? // Este código gera erro de compilação: // Unhandled exception type Exception class Pai { Pai() throws Exception { class Filho extends Pai { Filho() { // Chamada implícita à super(), // super() lança Exception! Julho 2013 Desenvolvimento OO com Java 39 Julho 2013 Desenvolvimento OO com Java 40 Exceções e herança Regras para sobrescrita: Não é obrigatório declarar que os métodos da subclasse lançam as exceções declaradas no método da superclasse que foi sobrescrito; Métodos da subclasse não podem propagar exceções que não estão declaradas no método que foi sobrescrito; A exceção: podem propagar exceções que sejam subclasses de uma das exceções declaradas no método que foi sobrescrito. Por que? // Este código gera erro de compilação: // Exception Exception is not compatible with throws // clause in Pai.metodo2() class Pai { void metodo1() throws Exception { void metodo2() throws ClassNotFoundException { class Filho extends Pai { @Override void metodo1() { // OK! @Override void metodo2() throws Exception { throws new CloneNotSupportedException(); Julho 2013 Desenvolvimento OO com Java 41 Julho 2013 Desenvolvimento OO com Java 42 Por que? public static void main(string[] args) { Pai p = new Filho(); // Este método está declarado como lançando // ClassNotFoundException, porém a // implementação no filho lança outra exceção! p.metodo2(); catch (ClassNotFoundException e) { e.printstacktrace(); Exceções futuras... Um método pode declarar que lança uma exceção e nunca lançá-la; Clientes implementarão tratamento, que nunca será usado; Serve para deixar reservado para necessidades futuras daquele trecho de código. Julho 2013 Desenvolvimento OO com Java 43 Julho 2013 Desenvolvimento OO com Java 44 7