Excepções (Java): Difference between revisions

From Wiki**3

Root (talk | contribs)
Root (talk | contribs)
 
(19 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{NAVPO}}
{{NAVPO}}
<!--{{TOCright}}-->
{{TOCright}}
==Introdução às Excepções==
 
= Introdução às Excepções =


* Introdução às excepções
* Introdução às excepções
* Uso do mecanismo de excepções no controlo da execução de programas
* Uso do mecanismo de excepções no controlo da execução de programas
==Excepções em Java==
* Mecanismo de excepções em Java
* Mecanismo de excepções em Java
* Excepções e erros
* Excepções e erros
* Classes de suporte às excepções: <code>Throwable</code>, <code>Exception</code>, <code>Error</code>
* 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 (<code>RuntimeException</code>).
* 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 ==
= 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.
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" ===
== Classe "UmaExcepção" ==
Considere-se a seguinte classe que define uma excepção:
Considere-se a seguinte classe que define uma excepção:
  <B>class</B> UmaExcep&ccedil;&atilde;o <B>extends</B> <B><FONT COLOR="#0095ff">Exception</FONT></B> {}


=== Programa 1 ===
<source lang="java">
class UmaExcepção extends Exception {}
</source>
 
== Programa 1 ==
Este programa ilustra o processamento básico de excepções.
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íel fazê-lo.
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.


  <B>public</B> <B>class</B> Teste1 {
<source lang="java">
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">f</FONT>() <B>throws</B> UmaExcep&ccedil;&atilde;o {
public class Teste1 {
      <B>throw</B> <B>new</B> <FONT COLOR="#000080">UmaExcep&ccedil;&atilde;o</FONT>();
  public static void f() throws UmaExcepção {
    }
    throw new UmaExcepção();
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">g</FONT>() <B>throws</B> UmaExcep&ccedil;&atilde;o {
  }
      <FONT COLOR="#000080">g</FONT>();  <I><FONT COLOR="#808080">// vai rebentar com a pilha e gerar um StackOverflowError</FONT></I></FONT></FONT>
  public static void g() throws UmaExcepção {
    }
    g();  // vai rebentar com a pilha e gerar um StackOverflowError
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {
  }
      <I><FONT COLOR="#808080">// unreported exception UmaExcep&ccedil;&atilde;o; must be caught or declared to be thrown</FONT></I>
  public static void main(String[] args) {
      <I><FONT COLOR="#808080">// g();</FONT></I>
    // unreported exception UmaExcepção; must be caught or declared to be thrown
      <B>try</B> {
    // g();
        <FONT COLOR="#000080">g</FONT>();
    try {
      }
      g();
      <B>catch</B>(<B><FONT COLOR="#0095ff">StackOverflowError</FONT></B> e) {
    }
        <I><FONT COLOR="#808080">// n&atilde;o devia ser apanhado! mas pode ser...</FONT></I>
    catch(StackOverflowError e) {
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;PILHA!&quot;</FONT>);
      // não devia ser apanhado! mas pode ser...
      }
      System.out.println("PILHA!");
      <B>catch</B> (UmaExcep&ccedil;&atilde;o e) { <I><FONT COLOR="#808080">/* este bloco nunca &eacute; executado! */ </FONT></I>}
    }
      <B>finally</B>               { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;FINALMENTE!&quot;</FONT>);  }
    catch (UmaExcepção e) { /* este bloco nunca é executado! */ }
    }
    finally              { System.out.println("FINALMENTE!");  }
  }
  }
}
</source>


===Resultado===
===Resultado===
Line 54: Line 57:
   FINALMENTE!
   FINALMENTE!


=== Programa 2 ===
== Programa 2 ==


  <B>public</B> <B>class</B> Teste2 {
<source lang="java">
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">f</FONT>() <B>throws</B> UmaExcep&ccedil;&atilde;o {
public class Teste2 {
      <B>throw</B> <B>new</B> <FONT COLOR="#000080">UmaExcep&ccedil;&atilde;o</FONT>();
  public static void f() throws UmaExcepção {
    }
    throw new UmaExcepção();
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">g</FONT>() <B>throws</B> UmaExcep&ccedil;&atilde;o {
  }
      <FONT COLOR="#000080">f</FONT>();
  public static void g() throws UmaExcepção {
    }
    f();
    <B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) {
  }
      <B>try</B> {
  public static void main(String[] args) {
        <FONT COLOR="#000080">g</FONT>();
    try {
      }
      g();
      <B>catch</B> (UmaExcep&ccedil;&atilde;o e) {
    }
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;UmaExcep&ccedil;&atilde;o apanhada!&quot;</FONT>);
    catch (UmaExcepção e) {
      }
      System.out.println("UmaExcepção apanhada!");
      <B>finally </B>{
    }
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;FINALMENTE!&quot;</FONT>);
    finally {
      }
      System.out.println("FINALMENTE!");
    }
    }
  }
  }
}
</source>


===Resultado===
===Resultado===
Line 82: Line 87:
   FINALMENTE!
   FINALMENTE!


=== Programa 3 ===
== Programa 3 ==


<java5>
<source lang="java">
public class OutraExcepção extends Exception {
public class OutraExcepção extends Exception {
   public OutraExcepção() {}
   public OutraExcepção() {}
   public OutraExcepção(Throwable cause){ super(cause); }
   public OutraExcepção(Throwable cause){ super(cause); }
}
}
</java5>
</source>


<java5>
<source lang="java">
public class Teste3 {
public class Teste3 {
   void f() throws UmaExcepção { throw new UmaExcepção(); }
   void f() throws UmaExcepção { throw new UmaExcepção(); }
Line 107: Line 112:


}
}
</java5>
</source>
 
Note-se que, em geral, a função '''main''' deveria tratar as excepções (as ''checked exceptions'').
 
=Exemplos=
* [[Entradas e Saídas em Java]]


==Exemplos==
=Exercícios=


==Exercícios==
* [[Excepções (Java)/Exercício 01: Stack|Stack]]
* [[Excepções (Java)/Exercício 02: Arabian Nights|Arabian Nights]]


[[category:Ensino]]
[[category:Ensino]]
[[category:PO]]
[[category:PO]]
[[category:Java]]
[[category:Java]]

Latest revision as of 13:14, 22 September 2023

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