Excepções (Java)

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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