p. prata, p. fazendeiro - departamento de informáticapprata/poo/poo_19_20_t08.pdf · programação...
TRANSCRIPT
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 1
6 – Exceções • Quando um programa viola as restrições semânticas da
linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.
Uma exceção é um erro recuperável • O controlo da execução do programa é transferido do ponto
onde ocorre a exceção para um ponto que pode ser especificado pelo utilizador.
? Sintaxe versus Semântica ?
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 2
6 – Exceções - Uma exceção diz-se lançada (thrown) no ponto onde ocorre e diz-se capturada (catched) no ponto para onde o controlo de execução é transferido - Cada exceção é representada por uma instância da classe Throwable ou de uma das suas subclasses.
- Objecto usado para guardar informação desde o ponto onde a excepção ocorre até ao ponto onde é capturada.
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 3
O tratamento de uma excepção é definido pela cláusula catch de uma instrução try: try { // bloco de instruções, nas quais queremos ter a possibilidade de detectar a ocorrência de erros recuperáveis. } catch ( <classe da excepção> < instância da excepção gerada> ) { // instruções para tratamento da excepção considerada [ ... outras cláusulas catch]* } [ finally { // instruções que serão executadas, ocorra ou não uma exceção no bloco try } ]* *[ opcional]
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 4
6 – Exceções Uma excepção pode ser lançada porque: - A JVM detecta uma violação da semântica da linguagem Exemplos - divisão por zero - o limite de um dado recurso foi ultrapassado - Foi executada uma instrução throw throw – geração explícita de uma excepção definida ou não pelo utilizador throw new < construtor da classe Exception ou de uma sua subclasse >
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 5
6 – Exceções
Existem dois tipos de excepções:
A - Excepções verificáveis pelo compilador - O compilador verifica se o programa trata as excepções que poderão ocorrer no código. Para cada excepção verificável, o método onde essa excepção pode ocorrer deve: - prever o tratamento da exceção (try – catch) ou
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 6
6 – Exceções A - Excepções verificáveis pelo compilador (cont) … ou lançar a excepção, através da cláusula throws, para que seja tratada no método invocador ou noutro mais externo. Ex.los public void metodoExemplo () throws <nome da classe da excepção> { … public static void main (String [] args ) throws IOException { …
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 7
6 – Exceções B - Exceções não verificáveis pelo compilador - São objetos das classes RunTimeException, Error e respectivas subclasses RunTimeException – exceções cuja ocorrência é difícil de ser verificável pelo programador Error – erros não recuperáveis Hierarquia das classes de excepção em Java:
… … … … java.lang …
UBI, Departamento de Informática T08- 8
Object
Throwable
Error Exception
IOException
ClassNotFoundException
InterruptedException
RuntimeException
ArithmeticException
IndexOutOfBoundsException
NullPointerException
java.io
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 9
6 – Exceções Exemplo 1: Definir uma exceção public class Bomba extends Exception { public Bomba (){ super(); } public Bomba ( String s ){ super ( s ); } }
Subclasse de Exception
UBI, Departamento de Informática T08- 10
public class Teste1 { public static void explode () throws Bomba { throw new Bomba(); } public static void main (String []args) { try { explode(); } catch ( RuntimeException e ) { System.out.println (“Runtime Explode”+ e.getMessage()); } catch ( Bomba b ) { System.out.println ( “Bomba” ); } }// main }//Teste1
A exceção que ocorre não é compatível com a classe RunTimeException mas é compatível com a classe Bomba. .
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 11
6 – Exceções
Bomba
Output do programa:
UBI, Departamento de Informática T08- 12
Exemplo 2: Cláusula finally public class Teste2 { public static void explode () { throw new NullPointerException(); } public static void main (String []args) { try { explode(); } catch ( Bomba e ) { System.out.println (“Bomba”); } finally { System.out.println (“Exceção não capturada”); } }// main }//Teste2
Subclasse de RunTimeException, exceção não verificável, não é obrigatório tratar a excepção. .
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 13
6 – Exceções
Output do programa:
Exceção não capturada java.lang.NullPointerException at Teste2.Explode (Teste2.java:7)
at Teste.main ( Teste2.java:11)
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 14
6 – Exceções Herança e cláusula throws - Um método que sobrepõe (“overrides”) outro não pode declarar lançar mais exceções do que o método que é sobreposto. Exemplo: public class C1 { public void m2() throws Exception { System.out.println (“Método 2 da classe C1 ”); } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 15
6 – Exceções public class C2 extends C1 { public void m2()* throws InterruptedException, ClassNotFoundException{ System.out.println (“Método 2 da classe C2 ”); } } * O método m2 da classe C2 sobrepõe m2 da classe C1
Válido
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 16
6 – Exceções Herança e cláusula throws (cont ...) - Cada excepção declarada em m2 da classe C2 tem que ser do
mesmo tipo (classe) de uma excepção lançada em m2 de C1 ou de um seu subtipo (subclasse).
- No método m2 da classe C1 tem que ser lançada a mesma excepção que em m2 de C2, ou uma excepção de uma sua superclasse.
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 17
6 – Exceções Exemplo 3: Qual o output do seguinte programa? package excecoes; public class TesteException extends Exception { public TesteException (){ super(); } public TesteException ( String s ){ super ( s ); } }
UBI, Departamento de Informática T08- 18
TesteException é uma
exceção verificável
cria uma instância
de TesteException
public class Teste { public static int atirador (String s) throws TesteException { if ( s.equals (“dividir”) ) { int i= 0 ; return i/i; } if ( s.equals( “null”) ) { s = null; return s.length(); } if ( s.equals (“teste”) ) { throw new TesteException (“Teste”); } return 0; } // fim do atirador
UBI, Departamento de Informática T08- 19
… public static void main (String []args) { String [] txt = new String [4]; txt [0] = “dividir“ ; txt [1] = “null“ ; txt [2] = “não“ ; txt [3] = “teste“ ;
UBI, Departamento de Informática T08- 20
public static void main (String []args) { … for ( int i = 0; i< txt.length ; i++ ){
try { atirador (txt [i] ); System.out.println ( “Teste(“ + txt[i] + ”)” + ”não lançou uma exceção”); } catch (Exception e){ System.out.println ( “Teste(“ + txt[i] + ”) lançou uma “ + e.getClass() + “\n com a mensagem “ + e.getMessage() ); } finally { System.out.println (“****”); System.out.println (“[Atirador(“ + txt[i] +“) executado]” ); } }// main } // Teste O método main invoca o método atirador 4 vezes
Sempre executado,
quer ocorra uma
exceção quer não.
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 21
6 – Exceções Output:
Teste(dividir) lançou uma class java.lang.ArithmeticException
com a mensagem / by zero
****
[Atirador(dividir ) executado]
Teste(null) lançou uma class java.lang.NullPointerException
com a mensagem null
****
[Atirador(null ) executado]
Teste(não)não lançou uma exceção
****
[Atirador(não ) executado]
Teste(teste) lançou uma class excepcoes.TesteException
com a mensagem Teste
****
[Atirador(teste ) executado]
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 22
6 – Exceções – Exercícios Suponha a classe Exemplo: import java.util.ArrayList; public class Exemplo { private int dim; // dimensão do array private String[] listaEstatica; private ArrayList<String> listaDinamica; public Exemplo (int d){ dim = d; listaEstatica = new String [dim]; listaDinamica = new ArrayList<String>(); }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 23
6 – Exceções – Exercícios Suponha a classe Exemplo: … public int getDim() { return dim; } public void setDim(int dim) { this.dim = dim; } public String[] getListaEstatica() { return listaEstatica; } public void setListaEstatica(String[] listaEstatica) { for (int i = 0; i < listaEstatica.length; i++) { this.listaEstatica[i] = listaEstatica[i]; } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 24
6 – Exceções – Exercícios Suponha a classe Exemplo: … public ArrayList<String> getListaDinamica() { return listaDinamica; } public void setListaDinamica (ArrayList<String> listaDinamica) { this.listaDinamica = (ArrayList<String>)listaDinamica.clone(); } public String toString() { String s= "dim= " + dim + ", listaEstatica="; for (int i = 0; i < listaEstatica.length; i++) { s = s + listaEstatica[i] + " "; } s = s + ", listaDinamica=" + listaDinamica ; return s; } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 25
6 – Exceções – Exercícios Qual o output do programa abaixo? (1) public class TesteExemplo { public static void main(String[] args) { Exemplo e1, e2; e1 = new Exemplo (5); System.out.println(e1); } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 26
6 – Exceções – Exercícios a) Para a classe Exemplo criar um método que devolva o primeiro
elemento da listaDinamica. Se a lista estiver vazia deverá gerar a exceção ListaVaziaException, com a mensagem de erro “Erro: lista vazia”. A exceção deverá ser tratada no programa que invocar o método. - Criar a classe de exceção ListaVaziaException.
- Testar o método.
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 27
6 – Exceções – Exercícios public String primeiroLD () throws ListaVaziaException{ if (listaDinamica.isEmpty() ) throw new ListaVaziaException( "Erro: Lista vazia" ); else return listaDinamica.get(0); } ___ Classe da Exceção public class ListaVaziaException extends Exception{ public ListaVaziaException(){ super (); } public ListaVaziaException(String s){ super (s); } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 28
6 – Exceções – Exercícios Testar public static void main(String[] args) { Exemplo e1, e2; e1 = new Exemplo(5); System.out.println(e1); try { String s = e1.primeiroLD(); System.out.println(s); } catch (ListaVaziaException x) { System.out.println(x.getMessage()); } Qual o output? (2)
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 29
6 – Exceções – Exercícios … Testar public static void main(String[] args) { Exemplo e1, e2;
e1 = new Exemplo(5); System.out.println(e1);
ArrayList<String> l = new ArrayList<String>(); l.add("XPTO1"); l.add("XPTO2"); e1.setListaDinamica(l); try { String s = e1.primeiroLD(); System.out.println(e1); System.out.println(s); } catch (ListaVaziaException x) { System.out.println(x.getMessage()); } Qual o output? (3)
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 30
6 – Exceções – Exercícios Output: (1) dim= 5, listaEstatica=null null null null null , listaDinamica=[] (2) dim= 5, listaEstatica=null null null null null , listaDinamica=[] Erro: Lista vazia (3) dim= 5, listaEstatica=null null null null null , listaDinamica=[] dim= 5, listaEstatica=null null null null null , listaDinamica=[XPTO1, XPTO2] XPTO1
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 31
6 – Exceções – Exercícios b) Para a mesma classe criar um método que atribua um valor a uma dada posição da listaEstatica. Se a posição for inválida o método deverá gerar a exceção ArrayIndexOutOfBoundsException (*) com a mensagem de erro “Posição inválida”. - Testar o método (*) exceção não verificável do pakage java.lang
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 32
6 – Exceções – Exercícios Classe Exemplo … public void adicionarLE (String valor, int pos) /* !!! */ { if (pos < 0 || pos >= dim) throw new ArrayIndexOutOfBoundsException("posição inválida"); listaEstatica[pos] = valor; }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 33
6 – Exceções – Exercícios Testar … public static void main(String[] args) { Exemplo e1, e2; e1 = new Exemplo(5); System.out.println(e1); try { e1.adicionarLE("ABC", 3); } catch (ArrayIndexOutOfBoundsException x) { System.out.println(x.getMessage()); } System.out.println(e1); try { e1.adicionarLE(“XYZ", 10); } catch (ArrayIndexOutOfBoundsException x) { System.out.println(x.getMessage()); } System.out.println(e1);
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 34
6 – Exceções – Exercícios Testar … Output … dim= 5, listaEstatica=null null null null null , listaDinamica=[] dim= 5, listaEstatica=null null null ABC null , listaDinamica=[] posição inválida dim= 5, listaEstatica=null null null ABC null , listaDinamica=[]
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 35
6 – Exceções – Exercícios Qual o output dos seguintes blocos de código? a) for (int i =0; i < 5 ; i++) try { System.out.println ( 10/i ); } catch (ArithmeticException x){ System.out.println (“Erro na iteração: ” + i); } finally { System.out.println ( “Continua” ); } }
Programação Orientada a Objectos - P. Prata, P. Fazendeiro
UBI, Departamento de Informática T08- 36
6 – Exceções – Exercícios Qual o output dos seguintes blocos de código? b) int i = 0; try { for ( i = -1; i < 5 ; i++){ System.out.println ( 10 / (i-1) ); } } catch (ArithmeticException x){ System.out.println (“Erro na iteração: ” + i); } finally { System.out.println ( “Continua” ); }