Excepções (Java)

From Wiki**3

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

Introdução às Excepções

  • Introdução às excepções
  • Uso do mecanismo de excepções no controlo da execução de programas
  • Mecanismo de excepções em Java
  • Excepções e erros
  • Classes de suporte às excepções: Throwable, Exception, Error
  • Tipos de excepções: checked exceptions (verificadas em tempo de compilação) e excepções durante a execução (RuntimeException).

Mecanismo das Excepções em Java

Estes exemplos muito simples ilustram casos artificiais e servem para demonstrar o mecanismo das excepções. Não devem ser tomados como modelo de programação.

Classe "UmaExcepção"

Considere-se a seguinte classe que define uma excepção:

class UmaExcepção extends Exception {}

Programa 1

Este programa ilustra o processamento básico de excepções.

Neste exemplo, pode ainda ver-se como um erro pode ser tratado em tempo de execução. Embora não seja habitual tratar os erros como se fossem excepções, é possível fazê-lo.

 public class Teste1 {
   public static void f() throws UmaExcepção {
     throw new UmaExcepção();
   }
   public static void g() throws UmaExcepção {
     g();   // vai rebentar com a pilha e gerar um StackOverflowError
   }
   public static void main(String[] args) {
     // unreported exception UmaExcepção; must be caught or declared to be thrown
     // g();
     try {
       g();
     }
     catch(StackOverflowError e) {
       // não devia ser apanhado! mas pode ser...
       System.out.println("PILHA!");
     }
     catch (UmaExcepção e) { /* este bloco nunca é executado! */ }
     finally               { System.out.println("FINALMENTE!");  }
   }
 }

Resultado

 $ java Teste1
 PILHA!
 FINALMENTE!

Programa 2

 public class Teste2 {
   public static void f() throws UmaExcepção {
     throw new UmaExcepção();
   }
   public static void g() throws UmaExcepção {
     f();
   }
   public static void main(String[] args) {
     try {
       g();
     }
     catch (UmaExcepção e) {
       System.out.println("UmaExcepção apanhada!");
     }
     finally {
       System.out.println("FINALMENTE!");
     }
   }
 }

Resultado

 $ java Teste2
 UmaExcepção apanhada!
 FINALMENTE!

Programa 3

public class OutraExcepção extends Exception {
  public OutraExcepção() {}
  public OutraExcepção(Throwable cause){ super(cause); }
}
public class Teste3 {
  void f() throws UmaExcepção { throw new UmaExcepção(); }
  void g() throws UmaExcepção { f(); }
  void h() throws OutraExcepção { throw new OutraExcepção(); }

  public static void main(String args[]) throws OutraExcepção {
    Z z = new Z();
    try { z.g(); z.h(); }
    catch (UmaExcepção u) { System.out.println("u"); throw new OutraExcepção(u); }
    //catch (UmaExcepção u) { System.out.println("u"); throw new RuntimeException("batata", u); }
    catch (Throwable t) { System.out.println("t"); }
    finally { System.out.println("done! one way or another..."); }
  }

}

Note-se que, em geral, a função main deveria tratar as excepções (as checked exceptions).

Exemplos

Exercícios