apuntes:excepciones
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
apuntes:excepciones [2021/03/10 13:37] – Santiago Faci | apuntes:excepciones [2023/05/28 23:50] – [Aserciones] Santiago Faci | ||
---|---|---|---|
Line 8: | Line 8: | ||
que, en Java, acaban lanzando una excepción si llegan a producirse: | que, en Java, acaban lanzando una excepción si llegan a producirse: | ||
- | \begin{itemize} | + | * Estamos escribiendo en disco y éste se llena ('' |
- | \item Estamos escribiendo en disco y éste se llena (\verb IOException ) | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | \item . . . | + | |
- | \end{itemize} | + | |
- | En Java se propone el control de excepciones para evitar que se produzcan estos errores en lugar de tener que escribir continuamente | + | En Java se propone el control de excepciones para evitar que se produzcan estos errores en lugar de tener que escribir continuamente estructuras |
- | estructuras | + | |
- | dentro un bloque controlado todo el código (y el que dependa de éste) que sea susceptible de producir una excepción, sin interrumpir el | + | |
- | flujo de nuestro programa (al contrario de lo que ocurre añadiendo sentencias | + | |
- | Se recomienda excepciones como \verb NullPointerException | + | Se recomienda excepciones como '' |
- | general, corresponderán a errores de codificación, | + | |
- | esperando capturarlas cuando se produzcan. Son dos excepciones que derivan de \verb RuntimeException . Son lo que se conoce como | + | |
- | \emph{unchecked exceptions}. Echa un vistazo a | + | |
- | | + | |
- | \subsection{Bloque try-catch} | + | ==== Bloque try-catch |
- | El bloque | + | El bloque |
- | para corregir o notificar el problema (parte | + | para corregir o notificar el problema (parte |
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
try { | try { | ||
Line 42: | Line 32: | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
- | En este caso, el código que hay asociado al bloque | + | En este caso, el código que hay asociado al bloque |
- | flujo de ejecución pasaría al bloque | + | el grupo //try-catch//. |
- | el grupo \verb try-catch . | + | |
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
File fichero = null; | File fichero = null; | ||
Line 68: | Line 57: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
==== Instrucción throws ==== | ==== Instrucción throws ==== | ||
- | También podemos, en lugar de capturar la excepción, lanzarla haciendo que tenga que ser controlada en un nivel superior. Por ejemplo, si | + | También podemos, en lugar de capturar la excepción, lanzarla haciendo que tenga que ser controlada en un nivel superior. Por ejemplo, si estoy desarrollando una clase que debe controlar una determinada excepción, quizás me pueda resultar interesante hacerla " |
- | estoy desarrollando una clase que debe controlar una determinada excepción, quizás me pueda resultar interesante hacerla " | + | |
- | para que sea controlada, por ejemplo, en el controlador de la aplicación o bien cerca de la interfaz con el usuario. Así es probable que | + | |
- | podamos ajustar mejor el comportamiento en caso de error. | + | |
- | \begin{lstlisting}[language=java] | + | < |
public class Util { | public class Util { | ||
public static Date parseFecha(String fecha) throws ParseException { | public static Date parseFecha(String fecha) throws ParseException { | ||
Line 84: | Line 70: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
- | El ejemplo de arriba es un caso en el que tenemos un método estático que utilizamos para parsear fechas en nuestra aplicación. Cuando el | + | El ejemplo de arriba es un caso en el que tenemos un método estático que utilizamos para parsear fechas en nuestra aplicación. Cuando el texto que se le pase no se corresponda con un formato válido de fecha, lanzará una excepción. Pero justamente en el método no tenemos muy claro que hacer puesto que dicho método lo utilizarán desde diferentes localizaciones del código en la aplicación. Por eso es mejor que lancemos fuera la excepción para que sea quién utilice este método quién deba decidir qué hacer en caso de fallo. Por ejemplo: |
- | texto que se le pase no se corresponda con un formato válido de fecha, lanzará una excepción. Pero justamente en el método no tenemos muy | + | |
- | claro que hacer puesto que dicho método lo utilizarán desde diferentes localizaciones del código en la aplicación. Por eso es mejor que | + | |
- | lancemos fuera la excepción para que sea quién utilice este método quién deba decidir qué hacer en caso de fallo. Por ejemplo: | + | |
- | \begin{lstlisting}[language=java] | + | < |
public class Ventana { | public class Ventana { | ||
. . . | . . . | ||
Line 108: | Line 91: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
==== Bloque try-catch-finally ==== | ==== Bloque try-catch-finally ==== | ||
- | Se puede añadir también un tercer bloque de código asociado a la parte \verb try que permite añadir código que se ejecutará siempre, de | + | Se puede añadir también un tercer bloque de código asociado a la parte //try// que permite añadir código que se ejecutará siempre, de forma que incluso lo hará cuando se produzca una excepción no controlada. Normalmente se utiliza para la zona donde liberar recursos que hayan sido ocupados durante el bloque |
- | forma que incluso lo hará cuando se produzca una excepción no controlada. Normalmente se utiliza para la zona donde liberar recursos que | + | |
- | hayan sido ocupados durante el bloque | + | |
- | de ejecución del código se vea interrumpido por una excepción. | + | |
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
BufferedReader buffer = null; | BufferedReader buffer = null; | ||
Line 142: | Line 122: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
==== Cómo crear tus propias excepciones ==== | ==== Cómo crear tus propias excepciones ==== | ||
- | Como ya hemos visto, Java tiene una serie de \emph{unchecked} y \emph{checked exceptions} que son lanzadas en determinadas situaciones. | + | Como ya hemos visto, Java tiene una serie de //unchecked// y //checked exceptions// que son lanzadas en determinadas situaciones. Vamos a ver ahora cómo también podemos crear nuestras propias excepciones y lanzarlas cuando se produzcan situaciones de "más alto nivel" en nuestra lógica de la aplicación. |
- | Vamos a ver ahora cómo también podemos crear nuestras propias excepciones y lanzarlas cuando se produzcan situaciones de "más alto nivel" en | + | |
- | nuestra lógica de la aplicación. | + | |
Por ejemplo, en una aplicación para la gestión de inventarios, | Por ejemplo, en una aplicación para la gestión de inventarios, | ||
- | \begin{lstlisting}[language=java] | + | < |
public class FueraDeStockException extends Exception { | public class FueraDeStockException extends Exception { | ||
Line 163: | Line 141: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
Así, cuando nos encontramos con esa situación, podemos directamente lanzar nuestra excepción: | Así, cuando nos encontramos con esa situación, podemos directamente lanzar nuestra excepción: | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
private void anadirProductoAlCarrito(Producto producto) { | private void anadirProductoAlCarrito(Producto producto) { | ||
Line 175: | Line 153: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
Y de esta manera, por ejemplo, en el controlador o interaz de la aplicación, | Y de esta manera, por ejemplo, en el controlador o interaz de la aplicación, | ||
- | \begin{lstlisting}[language=java] | + | < |
public class Ventana { | public class Ventana { | ||
. . . | . . . | ||
Line 192: | Line 170: | ||
. . . | . . . | ||
} | } | ||
- | \end{lstlisting} | + | </ |
==== Bloques multi-catch ==== | ==== Bloques multi-catch ==== | ||
- | También es posible capturar más de un tipo de excepción bajo un mismo bloque | + | También es posible capturar más de un tipo de excepción bajo un mismo bloque |
- | permite afinar el caso de error en algunos casos, pero bien utilizado permite que agrupemos en el caso de que varias excepciones tengan | + | |
- | asociado el mismo bloque de código. | + | |
- | \begin{lstlisting}[language=java] | + | < |
public class Ventana { | public class Ventana { | ||
. . . | . . . | ||
Line 213: | Line 189: | ||
. . . | . . . | ||
} | } | ||
- | \end{lstlisting} | + | </ |
==== Uso de recursos en bloques try-catch ==== | ==== Uso de recursos en bloques try-catch ==== | ||
- | Como hemos visto en el primer ejemplo, accedíamos a un fichero en la excepción, para luego acabar liberando los recursos al finalizar el | + | Como hemos visto en el primer ejemplo, accedíamos a un fichero en la excepción, para luego acabar liberando los recursos al finalizar el bloque |
- | bloque | + | |
- | liberen al terminar. Así, ese ejemplo podría escribirse de la siguiente forma: | + | |
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
try (BufferedReader buffer = | try (BufferedReader buffer = | ||
Line 237: | Line 211: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
- | Para este caso, hay que tener en cuenta que, para que Java pueda liberar automáticamente los recursos de una clase Java, debemos implementar | + | Para este caso, hay que tener en cuenta que, para que Java pueda liberar automáticamente los recursos de una clase Java, debemos implementar uno de los interfaces |
- | uno de los interfaces | + | |
- | \begin{lstlisting}[language=java] | + | < |
public class MiRecurso implements AutoCloseable { | public class MiRecurso implements AutoCloseable { | ||
. . . | . . . | ||
Line 253: | Line 226: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
===== Aserciones ===== | ===== Aserciones ===== | ||
- | Las aserciones son sentencias utilizadas para comprobar si una condición es cierta (o no) y controlar asi los errores en el código. | + | Las aserciones son sentencias utilizadas para comprobar si una condición es cierta (o no) y controlar asi los errores en el código. Básicamente equivale a una sentencia |
- | Básicamente equivale a una sentencia | + | |
- | mostrando el mensaje asociado a la misma. De forma similar a | + | |
- | cómo hacen las excepciones, | + | |
- | sólo tienen efecto si se pasa la opción | + | |
- | forma sólo se activan cuando es necesario o interesa utilizarlas. | + | |
Veamos un ejemplo: | Veamos un ejemplo: | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
String cadena = "Esto es un texto"; | String cadena = "Esto es un texto"; | ||
Line 276: | Line 244: | ||
assertion cadena == null; | assertion cadena == null; | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
- | Si ejecutamos el código anterior con la opción | + | Si ejecutamos el código anterior con la opción |
- | \begin{verbatim} | + | <code bash> |
run: | run: | ||
Exception in thread " | Exception in thread " | ||
Line 286: | Line 254: | ||
/ | / | ||
BUILD FAILED (total time: 0 seconds) | BUILD FAILED (total time: 0 seconds) | ||
- | \end{verbatim} | + | </ |
---- | ---- | ||
- | (c) 2019-2021 Santiago Faci | + | (c) 2019-{{date> |
apuntes/excepciones.txt · Last modified: 2023/06/04 18:31 by Santiago Faci