<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Excepci%C3%B3ns</id>
	<title>Excepcións - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://manuais.iessanclemente.net/index.php?action=history&amp;feed=atom&amp;title=Excepci%C3%B3ns"/>
	<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Excepci%C3%B3ns&amp;action=history"/>
	<updated>2026-10-24T23:56:49Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://manuais.iessanclemente.net/index.php?title=Excepci%C3%B3ns&amp;diff=3782&amp;oldid=prev</id>
		<title>Arribi: /* Lanzamento de excepcións */</title>
		<link rel="alternate" type="text/html" href="https://manuais.iessanclemente.net/index.php?title=Excepci%C3%B3ns&amp;diff=3782&amp;oldid=prev"/>
		<updated>2008-01-28T11:11:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Lanzamento de excepcións&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Excepcións e erros==&lt;br /&gt;
Unha &amp;#039;&amp;#039;&amp;#039;excepción&amp;#039;&amp;#039;&amp;#039; é unha situación que se orixina durante a execución do programa e que require que este acabe dunha maneira inmediata ou que faga unha acción especial para tratala. Por exemplo, un intento de división por 0; un acceso a unha posición dun array fora dos límites do mesmo ou un fallo durante a lectura de entrada/saída.&lt;br /&gt;
&lt;br /&gt;
Java proporciona un mecanismo elegante e potente para tratar estas situacións que se poden producir nun programa. Cando se produce unha excepción no programa dicimos que se &amp;#039;&amp;#039;&amp;#039;lanza unha excepción&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;throw&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
O mecanismo de tratamento de excepcións pódese resumir no seguinte: transferir o control dende o lugar do programa no que aconteceu a excepción a un xestor (presente no programa) que a captura e a trata.&lt;br /&gt;
&lt;br /&gt;
Ademais das excepcións, poden producirse erros. Un &amp;#039;&amp;#039;&amp;#039;erro&amp;#039;&amp;#039;&amp;#039; representa unha situación anormal e irreversible. Normalmente, son situacións que escapan ao control do programador e, polo tanto, non son tratadas por el.&lt;br /&gt;
&lt;br /&gt;
Hai diferentes tipos de excepción. Cada un deles é unha subclase da clase [http://java.sun.com/javase/6/docs/api/java/lang/Exception.html &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;Exception&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;], mentres que os erros son subclases de [http://java.sun.com/javase/6/docs/api/java/lang/Error.html &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;]. Ambas son subclases de [http://java.sun.com/javase/6/docs/api/java/lang/Throwable.html &amp;lt;code&amp;gt;Throwable&amp;lt;/code&amp;gt;]&lt;br /&gt;
[[Image:Xerarquia_excepcion_erros.gif|center]]&lt;br /&gt;
==Tipos de excepcións==&lt;br /&gt;
Se temos en conta como se debe tratar unha excepción dentro dun programa podemos distinguir dous tipos de excepcións:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Excepcións marcadas&amp;#039;&amp;#039;&amp;#039;. Son aquelas nas que é obrigatorio a súa captura. Todos os tipos de excpecións, salvo &amp;lt;code&amp;gt;RuntimeExcepction&amp;lt;/code&amp;gt; e as súas subclases son excepcións marcadas. Se non se capturan o programa non compilará.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;Excepcións non marcadas&amp;#039;&amp;#039;&amp;#039;. Non é obrigatoria a súa captura. Pertencen a este grupo as excepcións en tempo de execución, isto é, &amp;lt;code&amp;gt;RuntimeExcepction&amp;lt;/code&amp;gt; e as súas subclases. Correspóndense normalmente cunha mala programación polo que a solución non debe pasar por preparar o programa para que se poda recuperar, senón evitar que se produzan. Por exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
public class Division {&lt;br /&gt;
  public static void main (String [] args) {&lt;br /&gt;
    int j = 5/0; // División por cero. Dará un erro en tempo de execución.&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Captura de excepcións==&lt;br /&gt;
No momento en que se produce unha excepción créase un obxecto do tipo de excepción correspondente e &amp;#039;&amp;#039;&amp;#039;lánzase&amp;#039;&amp;#039;&amp;#039; a excepción. Esta pode ser capturada premitindo realizar as accións oportunas. Por exemplo, se se produce unha excepción de tipo &amp;lt;code&amp;gt;IOException&amp;lt;/code&amp;gt; se creará unha instancia desa clase.&lt;br /&gt;
&lt;br /&gt;
===Os bloques try e catch===&lt;br /&gt;
Unha excepción en Java ten a seguinte forma:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  // Sección de código que pode lanzar unha excepción&lt;br /&gt;
}&lt;br /&gt;
catch(unhaExecpcion) {&lt;br /&gt;
  // Sección de código que manexa esta excepción&lt;br /&gt;
}&lt;br /&gt;
catch(outraExecpcion) {&lt;br /&gt;
  // Sección de código que manexa esta execpción&lt;br /&gt;
}&lt;br /&gt;
// Outro código que pode executarse de xeito &amp;quot;normal&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;O bloque try&amp;#039;&amp;#039;&amp;#039; delimita aquela ou aquelas instruccións onde se pode producir unha excepción. Se isto sucede, o control do programa transfírese ao bloque catch definido para o tipo de excepción que se produciu, pasando como parámetro o obxecto do tipo da excepción que se creou.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;O bloque catch&amp;#039;&amp;#039;&amp;#039; define as instrucións que se deberán executar en caso de que se produza un determinado tipo de excepción.&lt;br /&gt;
&lt;br /&gt;
Un exemplo en pseudocódigo dunha excepción é o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
   descargaOFicheiroDendeARede&lt;br /&gt;
   leOFicheiroECreaUnhaTaboa&lt;br /&gt;
}&lt;br /&gt;
catch(NonPodoObterOFicheiroDaRede) {&lt;br /&gt;
   usaOFicheiroLocalNoSeuLugar&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non pode haber código entre un bloque try e outro catch. O seguinte exemplo fallará:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
   // Fai algo&lt;br /&gt;
}&lt;br /&gt;
System.out.println(&amp;quot;Isto non se pode facer&amp;quot;);&lt;br /&gt;
catch(Exception ex) { }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
No caso de que existan varios bloques catch hai que ter en conta as seguintes consideracións:&lt;br /&gt;
*Pode haber varios bloques catch pero &amp;#039;&amp;#039;&amp;#039;non poden ter declarado a mesma clase de excepción&amp;#039;&amp;#039;&amp;#039;.  &lt;br /&gt;
*Ainda que existan varios bloques catch &amp;#039;&amp;#039;&amp;#039;só se executará un deles&amp;#039;&amp;#039;&amp;#039; cando se produza a excepción. &lt;br /&gt;
*Os catch &amp;#039;&amp;#039;&amp;#039;máis específicos deben estar situados por diante dos máis xenéricos&amp;#039;&amp;#039;&amp;#039;, en relación á xerarquía de herdanza. Por exemplo: &amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;catch (IOException e)&amp;lt;/source&amp;gt; Ten que ir diante de: &amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;catch (Exception e)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Por último, o control do programa nunca se devolve ao lugar onde se produciu a excepción.&lt;br /&gt;
&lt;br /&gt;
===O bloque finally===&lt;br /&gt;
As excepcións poden ter un terceiro bloque, non obrigatorio, chamado &amp;#039;&amp;#039;&amp;#039;finally&amp;#039;&amp;#039;&amp;#039;. O código que vai nun bloque finally &amp;#039;&amp;#039;&amp;#039;sempre&amp;#039;&amp;#039;&amp;#039; se executa (despois do bloque try), independentemente de que se lanzara ou non unha excepción. Incluso se hai unha sentenza &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; no bloque try! Por elo, sempre se pon neste bloque o código para pechar ficheiros, sockets e liberar recursos en xeral. Só se dentro dun bloque try ou catch se executa unha sentenza do tipo &amp;lt;code&amp;gt;System.exit()&amp;lt;/code&amp;gt; a cláusula finally non se executará.&lt;br /&gt;
&lt;br /&gt;
Non podemos escribir un bloque try sen algún dos bloques, catch ou finally:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
  // fai algo&lt;br /&gt;
} &lt;br /&gt;
finally {&lt;br /&gt;
   //libera recursos&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Outro exemplo cos tres bloques:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
   // fai algo&lt;br /&gt;
}&lt;br /&gt;
catch (UnhaExcepcion ex) {&lt;br /&gt;
  // trata a excepcion&lt;br /&gt;
}&lt;br /&gt;
finally {&lt;br /&gt;
   // libera recursos&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Xerarquía de excepcións==&lt;br /&gt;
Todas as excepcións son instancias dunha clase que ten á clase &amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt; como superclase da súa xerarquía. Noutras palabras, as excepcións son sempre subclases de [http://java.sun.com/javase/6/docs/api/java/lang/Exception.html &amp;lt;code&amp;gt;java.lang.Exception&amp;lt;/code&amp;gt;].&lt;br /&gt;
Cando se lanza unha excepción instánciase un obxecto da clase correspondente:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
       // algún código&lt;br /&gt;
}&lt;br /&gt;
catch (ArrayIndexOutOfBoundsException excepcion) {&lt;br /&gt;
       excepcion.printStackTrace();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Neste exemplo, &amp;lt;code&amp;gt;excepcion&amp;lt;/code&amp;gt; é unha instancia da clase &amp;lt;code&amp;gt;ArrayIndexOutOfBoundsException&amp;lt;/code&amp;gt;. Como tal obxecto pode chamar a métodos, neste caso a &amp;lt;code&amp;gt;printStackTrace()&amp;lt;/code&amp;gt;.&lt;br /&gt;
A xerarquía de excepcións en Java, non completa, é a seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
java.lang.Exception&lt;br /&gt;
    * java.lang.ClassNotFoundException&lt;br /&gt;
    * java.lang.CloneNotSupportedException&lt;br /&gt;
    * java.lang.IllegalAccessException&lt;br /&gt;
    * java.lang.InstantiationException&lt;br /&gt;
    * java.lang.InterruptedException&lt;br /&gt;
    * java.lang.NoSuchFieldException&lt;br /&gt;
    * java.lang.NoSuchMethodException&lt;br /&gt;
    * java.lang.RuntimeException&lt;br /&gt;
          o java.lang.ArithmeticException&lt;br /&gt;
          o java.lang.ArrayStoreException&lt;br /&gt;
          o java.lang.ClassCastException&lt;br /&gt;
          o java.lang.EnumConstantNotPresentException&lt;br /&gt;
          o java.lang.IllegalArgumentException&lt;br /&gt;
                + java.lang.IllegalThreadStateException&lt;br /&gt;
                + java.lang.NumberFormatException&lt;br /&gt;
          o java.lang.IllegalMonitorStateException&lt;br /&gt;
          o java.lang.IllegalStateException&lt;br /&gt;
          o java.lang.IndexOutOfBoundsException&lt;br /&gt;
                + java.lang.ArrayIndexOutOfBoundsException&lt;br /&gt;
                + java.lang.StringIndexOutOfBoundsException&lt;br /&gt;
          o java.lang.NegativeArraySizeException&lt;br /&gt;
          o java.lang.NullPointerException&lt;br /&gt;
          o java.lang.SecurityException&lt;br /&gt;
          o java.lang.TypeNotPresentException&lt;br /&gt;
          o java.lang.UnsupportedOperationException&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Matching de excepcións==&lt;br /&gt;
Cando temos varios bloques catch se se lanza unha excepción esta irá comprobando se existe algún bloque catch polo que poder &amp;quot;entrar&amp;quot;, empezando polo máis preto ao bloque try, que sempre será a excepción menos xenérica. O seguinte código fallará porque &amp;lt;code&amp;gt;IOException&amp;lt;/code&amp;gt; é máis xenérica que &amp;lt;code&amp;gt;FileNotFoundException&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
try {&lt;br /&gt;
       // código&lt;br /&gt;
} catch (IOException e) {&lt;br /&gt;
      // manexa IOExceptions&lt;br /&gt;
} catch (FileNotFoundException ex) {&lt;br /&gt;
      // manexa só FileNotFoundException&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
O erro que devolverá o compilador será o seguinte:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
   TestEx.java:15: exception java.io.FileNotFoundException has&lt;br /&gt;
     already been caught&lt;br /&gt;
   } catch (FileNotFoundException ex) {&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Lanzamento de excepcións==&lt;br /&gt;
En determinados casos pode ser útil lanzar unha excepción dende dentro dun determinado método. Isto pode utilizarse como un medio para indicar que algo está sucedendo e non é posible continuar coa execución normal do método. Para lanzar unha excepción utilizamos a seguinte expresión:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
throw obxecto_excepcion;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cando se lanza unha excepción marcada desde un método esta &amp;#039;&amp;#039;&amp;#039;debe ser declarada na cabeceira do método&amp;#039;&amp;#039;&amp;#039;. Isto hai que indicalo coa palabra reservada &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt;, tal e como se amosa no seguinte exemplo:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
void meuMetodo() throws Excepcion1, Excepcion2 {&lt;br /&gt;
   // código do método&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A execución do método meuMetodo terá que ir nun bloque try se Excepcion1 e Excepcion2 son excepcións marcadas, xa que é obrigatorio capturalas. Se non, obteremos un erro en tempo de compilación.&lt;br /&gt;
&lt;br /&gt;
Se a excepción é non marcada, é dicir, é unha subclase de &amp;lt;code&amp;gt;RuntimeExecption&amp;lt;/code&amp;gt; non será necesario capturala.&lt;br /&gt;
&lt;br /&gt;
==Métodos útiles==&lt;br /&gt;
Todas as excepcións herdan un conxunto de métodos que se poden usar no interior dos catch para completar o tratamento da excepción. Os máis útiles son:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
/* Devolve unha mensaxe de texto asociada á excepción,&lt;br /&gt;
dependendo do tipo de excepción sobre o que se aplique.*/&lt;br /&gt;
void getMessage()&lt;br /&gt;
&lt;br /&gt;
/*Envía á consola o volcado de pila asociado á excepción.&lt;br /&gt;
É moi útil durante a fase de desenvolvemento da aplicación, &lt;br /&gt;
axudando a detectar erros de programación.*/&lt;br /&gt;
void printStackTrace()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Creación de excepcións personalizadas==&lt;br /&gt;
É posible crear as nosas propias excepcións xa que pode acontecer que os tipos de excepeción existentes non se adapten ás características da situación que se quere notificar. Para facelo simplemente hai que crear unha clase que herde da clase Exception cun construtor que chame ao construtor da superclase cun texto personalizado:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class unhaExcepcion extends Exception { &lt;br /&gt;
  public unhaExcepcion() {&lt;br /&gt;
    super(&amp;quot;Excepcion personalizada!&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vantaxes de utilizar excepcións==&lt;br /&gt;
Existen diferentes motivos polos que o uso de excepcións é recomendable:&lt;br /&gt;
*Proporcionan un &amp;#039;&amp;#039;&amp;#039;mecanismo estruturado&amp;#039;&amp;#039;&amp;#039; para o tratamento de erros, evitando a utilización de instrucións de control que dificultan a lectura do código e fan que o programa sexa máis propenso a erros.&lt;br /&gt;
*Proporcionan un xeito de agrupar diferentes tipos de erros nun programa.&lt;/div&gt;</summary>
		<author><name>Arribi</name></author>
	</entry>
</feed>