apuntes:excepciones
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
apuntes:excepciones [2021/03/10 13:14] – Santiago Faci | apuntes:excepciones [2021/03/10 13:39] – Santiago Faci | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== |
- | \part*{Excepciones | + | ===== Excepciones |
- | + | ||
- | \section{Excepciones} | + | |
Las excepciones en Java son errores que se producen en tiempo de ejecución. Cuando realizamos el proceso de compilación pueden aparecer una | Las excepciones en Java son errores que se producen en tiempo de ejecución. Cuando realizamos el proceso de compilación pueden aparecer una | ||
Line 10: | 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 (\verb IOException ) |
- | \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 | ||
Line 35: | Line 30: | ||
para corregir o notificar el problema (parte \verb catch ). | para corregir o notificar el problema (parte \verb catch ). | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
try { | try { | ||
Line 44: | Line 39: | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
En este caso, el código que hay asociado al bloque \verb try se ejecutará de forma que, si dentro de él se produjera una excepción, el | En este caso, el código que hay asociado al bloque \verb try se ejecutará de forma que, si dentro de él se produjera una excepción, el | ||
Line 50: | Line 45: | ||
el grupo \verb try-catch . | el grupo \verb try-catch . | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
File fichero = null; | File fichero = null; | ||
Line 70: | Line 65: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
- | \subsection{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 | ||
Line 79: | Line 74: | ||
podamos ajustar mejor el comportamiento en caso de error. | 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 86: | Line 81: | ||
} | } | ||
} | } | ||
- | \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 | ||
Line 93: | Line 88: | ||
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: | 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 110: | Line 105: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
- | \subsection{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 \verb try que permite añadir código que se ejecutará siempre, de | ||
Line 119: | Line 114: | ||
de ejecución del código se vea interrumpido por una excepción. | de ejecución del código se vea interrumpido por una excepción. | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
BufferedReader buffer = null; | BufferedReader buffer = null; | ||
Line 144: | Line 139: | ||
} | } | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
- | \subsection{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 \emph{unchecked} y \emph{checked exceptions} que son lanzadas en determinadas situaciones. | ||
Line 154: | Line 149: | ||
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 165: | Line 160: | ||
} | } | ||
} | } | ||
- | \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 177: | Line 172: | ||
} | } | ||
. . . | . . . | ||
- | \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 194: | Line 189: | ||
. . . | . . . | ||
} | } | ||
- | \end{lstlisting} | + | </ |
- | \subsection{Bloques multi-catch} | + | ==== Bloques multi-catch |
También es posible capturar más de un tipo de excepción bajo un mismo bloque \verb catch , aunque no es una práctica recomendada ya que no | También es posible capturar más de un tipo de excepción bajo un mismo bloque \verb catch , aunque no es una práctica recomendada ya que no | ||
Line 202: | Line 197: | ||
asociado el mismo bloque de código. | asociado el mismo bloque de código. | ||
- | \begin{lstlisting}[language=java] | + | < |
public class Ventana { | public class Ventana { | ||
. . . | . . . | ||
Line 215: | Line 210: | ||
. . . | . . . | ||
} | } | ||
- | \end{lstlisting} | + | </ |
- | \subsection{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 | ||
Line 223: | Line 218: | ||
liberen al terminar. Así, ese ejemplo podría escribirse de la siguiente forma: | liberen al terminar. Así, ese ejemplo podría escribirse de la siguiente forma: | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
try (BufferedReader buffer = | try (BufferedReader buffer = | ||
Line 239: | Line 234: | ||
} | } | ||
. . . | . . . | ||
- | \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 \verb java.lang.AutoClosable | uno de los interfaces \verb java.lang.AutoClosable | ||
- | \begin{lstlisting}[language=java] | + | < |
public class MiRecurso implements AutoCloseable { | public class MiRecurso implements AutoCloseable { | ||
. . . | . . . | ||
Line 255: | Line 250: | ||
} | } | ||
} | } | ||
- | \end{lstlisting} | + | </ |
- | \section{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. | ||
Line 268: | Line 263: | ||
Veamos un ejemplo: | Veamos un ejemplo: | ||
- | \begin{lstlisting}[language=java] | + | < |
. . . | . . . | ||
String cadena = "Esto es un texto"; | String cadena = "Esto es un texto"; | ||
Line 278: | Line 273: | ||
assertion cadena == null; | assertion cadena == null; | ||
. . . | . . . | ||
- | \end{lstlisting} | + | </ |
Si ejecutamos el código anterior con la opción \verb -ea activada como opción de la JVM, se nos mostrará el siguiente mensaje de error: | Si ejecutamos el código anterior con la opción \verb -ea activada como opción de la JVM, se nos mostrará el siguiente mensaje de error: | ||
- | \begin{verbatim} | + | <code bash> |
run: | run: | ||
Exception in thread " | Exception in thread " | ||
Line 288: | Line 283: | ||
/ | / | ||
BUILD FAILED (total time: 0 seconds) | BUILD FAILED (total time: 0 seconds) | ||
- | \end{verbatim} | + | </ |
+ | ---- | ||
(c) 2019-2021 Santiago Faci | (c) 2019-2021 Santiago Faci |
apuntes/excepciones.txt · Last modified: 2023/06/04 18:31 by Santiago Faci