Exception - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a grabar vuestra boca.
00:00:00
Entonces, lo que vamos a ver hoy es el concepto de manejo de excepciones.
00:00:10
Nosotros hemos visto en programas anteriores que a veces Java no consigue hacer lo que tiene que hacer.
00:00:14
Aquí hay varios tipos de errores, varios tipos de problemas.
00:00:24
El primer error, y más fácil, son los errores sintácticos o, dicho de esta forma, los errores resolvibles a tiempo de compilación.
00:00:28
Eso porque Java, ¿cómo es Java? ¿Interpretado o compilado?
00:00:38
Six, seven.
00:00:43
¡Six, seven!
00:00:44
Ambas.
00:00:46
Ambas, ¿vale?
00:00:48
Entonces, si os acordáis, antes se compila en bytecode y después se interpreta desde bytecode.
00:00:49
El compilador, la fase de compilador, una cosa interesante que nos proporciona
00:00:55
es que sustancialmente nos permite encontrar pequeños errores de sintaxis.
00:00:58
O sea, si yo he escrito mal el código, él me lo marca y me dice,
00:01:06
no, mira, aquí esta palabra no podía estar.
00:01:10
Oye, mira, has usado una variable, esta variable no existe, no la has declarado antes.
00:01:12
Oye, estás llamando un método y este método no existe, no lo has declarado.
00:01:15
Todas estas cosas son las cosas que os salen en el IDE, os salen en Eclipse.
00:01:20
marcadas en rojos hay un error
00:01:23
y vosotros
00:01:26
sin ni siquiera haber
00:01:28
arrancado el programa
00:01:30
ya sabéis que ese programa no va a funcionar
00:01:32
y que necesitáis modificarle
00:01:34
cambiar
00:01:36
una vez que no tenéis errores
00:01:36
de compilación, no tenéis
00:01:40
marcado nada de rojo
00:01:42
lanzáis vuestro programa y vuestro programa funciona
00:01:43
seguramente, correcto
00:01:46
arranca
00:01:48
se ejecuta
00:01:52
Pero luego podría no hacer para nada lo que vosotros queréis que haga.
00:01:54
Vosotros habéis hecho un programa para calcular el área del triángulo
00:02:01
y lo que hace es calcular lado por lado.
00:02:04
El programa funciona, te da un resultado, tú le pones lado 3 y se te dice,
00:02:08
claro, 3 por 3, 9.
00:02:12
Pero esa no es el área del triángulo, es el área del cuadrado.
00:02:13
Estos son errores semánticos.
00:02:19
y eso no hay nadie que os lo resuelva.
00:02:21
Esos son problemas vuestros.
00:02:26
Habéis programado mal.
00:02:28
Eso es entender cuál es el problema,
00:02:31
entender cuál es el algoritmo para solucionarlo
00:02:34
e implementarlo bien.
00:02:36
Si hacéis errores en el algoritmo,
00:02:38
el problema es vuestro.
00:02:40
Y luego está un tercer tipo de errores,
00:02:44
digamos así, ¿vale?
00:02:47
Que son cosas que técnicamente estarían bien, pero que en esa situación concreta de esa ejecución
00:02:48
ha pasado algo que sustancialmente los ha transformado en mal.
00:03:01
¿Me explico?
00:03:07
Por ejemplo, yo te he dicho, dame un número, y tú has escrito gato.
00:03:08
¿Vale?
00:03:12
Mi código no tenía errores semánticos.
00:03:13
Mi código no tenía errores sintácticos.
00:03:16
Mi código es sólido, pero en el momento en que yo te pido un número y tú me estás dando un string, estás generando tu usuario un error a tiempo de ejecución, no en tiempo de compilación.
00:03:19
En compilación no había error porque tú leías un int, pero como ahora tú has dicho léete un int y me has dado un string, pues ahí hay un problema.
00:03:35
Java reacciona a este tipo de errores
00:03:42
a errores que digamos se ejecutan
00:03:46
o sea, se salen cuando hay una ejecución
00:03:49
con dos grandes categorías
00:03:53
los errores y las excepciones
00:03:56
los errores son chungos
00:03:59
los errores es
00:04:02
cuidado que aquí ha pasado algo
00:04:04
demasiado grande
00:04:07
aquí la java virtual machine
00:04:10
ha colapsado
00:04:13
no puedes hacer nada para recuperar
00:04:14
error
00:04:17
o una excepción
00:04:19
aquí ha pasado algo
00:04:22
que no me esperaba
00:04:25
normalmente el programa funciona
00:04:26
en este caso excepcional
00:04:29
pues no ha funcionado
00:04:31
las excepciones
00:04:32
se pueden
00:04:36
recuperar, o sea, tú puedes decir
00:04:37
vale, muy bien, si pasa
00:04:39
algo así, no
00:04:41
no colapses
00:04:43
déjamela a mí
00:04:45
y yo te digo cómo recuperarte
00:04:47
de este posible
00:04:49
error
00:04:50
¿se entiende más o menos?
00:04:52
¿sí?
00:04:55
entonces, una excepción es un error
00:04:56
un fallo en un programa que ocurre
00:04:59
en tiempo de ejecución
00:05:01
no saltará nunca una excepción
00:05:02
mientras estás compilando, mientras estás aplicando
00:05:05
códigos, cuando le das al play
00:05:07
Paso al play, llego a un array, intento leer la primera posición del array,
00:05:09
el array es null, y por lo tanto me da una null pointer exception.
00:05:14
Tú me dices, dame un número, yo te escribo gato, por lo tanto no es un número,
00:05:20
te lanzo un arithmetic number exception o una number format exception, no me acuerdo cómo sea.
00:05:25
¿Sí?
00:05:32
¿Qué cosa podrías decir?
00:05:33
Cuando un error ocurre, lo más normal es que se detenga el programa.
00:05:34
Nosotros hemos visto que hasta ahora sale un mensaje en rojo.
00:05:39
¿Por qué sale en rojo?
00:05:42
Porque en vez que en system.out.println, escribe en system.er.println.
00:05:46
Si vosotros en cualquiera de vuestros programas, en vez de system.out ponéis en system.er, el mensaje sale en rojo.
00:05:54
Vosotros tenéis dos canales de salida y un canal de entrada en cada programa.
00:06:01
¿vale? el canal del programa
00:06:05
de entrada es el system in
00:06:07
y el sistema out
00:06:09
es la salida
00:06:16
estándar
00:06:19
de tu programa
00:06:20
pero además tu programa, tu proceso
00:06:21
siempre tiene un tercer canal de salida
00:06:23
o sea, un segundo canal de salida
00:06:26
o un tercer canal de comunicación
00:06:28
que es el canal por donde
00:06:29
mandas los errores
00:06:32
¿vale? porque normalmente tú quieres decir
00:06:33
una cosa al usuario que te está usando
00:06:36
y una cosa distinta al programador que te ha programado por si pasa algo, ¿sí?
00:06:37
Es el concepto de que tú, si te llama tu cliente y te dice,
00:06:44
oye, me está dando este error de aquí, pues tú vas allí y te vas a mirar
00:06:48
el canal secreto de administradores y vas a mirar qué te ha dicho en el error,
00:06:53
porque al usuario le dirá, no me puedo conectar,
00:06:58
pero tú por debajo te habrías escrito, no me puedo conectar por esta razón de aquí,
00:07:04
porque el IP no funciona
00:07:07
porque no he podido generar no sé qué fichero
00:07:09
y cosas por el estilo. Entonces tú
00:07:11
entiendes esa jerga, entonces lo pones
00:07:13
allí, el otro no. Se pueden
00:07:15
redireccionar estos canales
00:07:17
para que escriban en ficheros.
00:07:19
Que es lo que se suele hacer, los famosos
00:07:21
ficheros de Londres. Entonces
00:07:23
los errores y los problemas se
00:07:25
escriben dentro de un fichero
00:07:27
conectado al system.er
00:07:29
para que escriba en estos ficheros
00:07:31
y entonces tú como
00:07:34
administrador, cuando hay un programa
00:07:35
que no funciona, vas a mirar los ficheros
00:07:37
de log de error, y allí te encuentras
00:07:39
cuáles son los problemas.
00:07:42
¿Dudas?
00:07:44
¿Con lo que has dicho entonces
00:07:46
por la tercera salida
00:07:47
podríamos crear nuestros propios
00:07:50
errores para el futuro?
00:07:52
No exactamente. Sí puedes hacer
00:07:55
lo que acabas de decir, de otra forma.
00:07:57
Eso es simplemente que tú puedes escribir
00:07:59
mensajes, digamos,
00:08:01
en dos canales.
00:08:02
Uno es el canal orientado
00:08:04
a hablar con quien te está usando,
00:08:06
y otro es el es el canal donde tú vas a meter los errores vale en eclipse o en básico lo que
00:08:08
hacen es escribir en el mismo sitio la consola pero luego se pueden redireccionar para que
00:08:17
escriban en un fichero para que escriban en un socket y lo mande por internet entonces
00:08:25
tú te recibes en tu ordenador hoy mira había un error en este sistema o cosa por estilo se puede
00:08:31
cambia la cosa
00:08:36
entonces tú tienes esas dos cosas
00:08:39
una es los mensajes normales
00:08:41
que te esperas, que hablas con el
00:08:43
usuario, con quien te está usando
00:08:45
y otro, que puedes usar o no
00:08:47
para los errores
00:08:49
pero esto es un poquito distinto
00:08:50
tú puedes crearte tus propios errores
00:08:53
pero con muchas excepciones
00:08:55
y lo veremos dentro de un rato
00:08:57
ok
00:08:58
Java proporciona un mecanismo para controlar
00:09:00
situaciones que normalmente provocarían
00:09:03
una interrupción de ejecución, ¿vale?
00:09:05
Cuando vosotros, cuando yo digo
00:09:07
que explota el programa, que separa
00:09:09
la Java Vector Machine, es porque ha habido
00:09:11
uno de estos errores, de estas excepciones,
00:09:13
y nadie ha
00:09:16
controlado esta excepción.
00:09:17
Si esta excepción escala, escala,
00:09:19
escala, y llega al main,
00:09:21
y nadie en el main dice, mira,
00:09:23
cuando te pasa esto, tienes que solucionarlo
00:09:25
de esta forma, pues la única cosa
00:09:27
que puede hacer él es, oye, mira, lo siento
00:09:29
mucho, aquí se acaba.
00:09:31
Si tú dices, oye, soy un escáner,
00:09:33
léete un número, ¿vale?
00:09:35
Tú lees un número y te dan en vez de un string
00:09:37
y tú no le has explicado al programa
00:09:39
qué hacer cuando te dan un string,
00:09:42
pues lo único que se puede hacer
00:09:44
es parar la llave de tu máquina y decir,
00:09:46
tío, de aquí no puedo seguir.
00:09:47
Pero, sin embargo, si tú allí haces
00:09:50
lo que tienes que hacer para decirle
00:09:53
cuando te pase una cosa que no es un número,
00:09:54
tú le tienes que decir, oye,
00:09:58
te he pedido un número, no otra cosa,
00:10:00
y volver a pedírselo, pues entonces
00:10:01
él ya no explota. Él se mantendrá allí,
00:10:04
controlará la excepción y volverá a pedirte el mundo.
00:10:08
Pero eso tienes que decir tú.
00:10:11
Para manejar los errores, lo hemos dicho ya
00:10:13
en episodios anteriores, hay dos
00:10:21
formas, ¿vale? Una es la forma pesimista
00:10:23
y otra la forma optimista, digamos así.
00:10:26
La forma pesimista es, oye, mira,
00:10:29
yo sé que va a haber errores, va a haber
00:10:32
cosas problemáticas.
00:10:35
Pues voy a rellenar mi código
00:10:37
de comprobaciones
00:10:40
de ifs
00:10:42
para minimizar
00:10:43
la posibilidad que haya un error.
00:10:45
Entonces,
00:10:49
si mi programa explotaría
00:10:49
al meterle un número negativo,
00:10:52
yo voy a comprobar, oye, si el número
00:10:53
es negativo, no hagas nada.
00:10:55
Y si es positivo, sigue adelante.
00:10:57
Y si tú me tenías que dar un string,
00:11:00
voy a comprobar que sea un string.
00:11:02
Y si el string es null, pues me paro.
00:11:03
Si no, todo es cuniz.
00:11:05
El problema de este mecanismo
00:11:08
es que primero encontrar todos los posibles fallos
00:11:10
es complejo.
00:11:15
A lo mejor un caso concreto no se te ha pasado por acá
00:11:18
y a lo mejor necesitarías una condición booleana gigantesca
00:11:21
para cubrir ese caso.
00:11:26
Y si los datos son correctos,
00:11:29
estoy sobrecargando el sistema
00:11:32
con los innecesarios. O sea,
00:11:34
por cada vez que yo ejecuto mi programa
00:11:36
que todo iría bien,
00:11:38
te piden un número y te dan un número
00:11:39
tenía que ser positivo y es positivo.
00:11:42
Tú estás preguntando, ¿ma es un número?
00:11:44
Así, entonces sigue adelante.
00:11:47
¿Ma es positivo? Sí, sigue adelante.
00:11:48
Estás haciendo comprobaciones innecesarias.
00:11:50
Si, en situaciones en las que
00:11:54
estadísticamente es
00:11:56
bastante improbable
00:11:58
que te pongan
00:11:59
Dados mal, por ejemplo, este es un sistema que utilizan otros informáticos y entonces
00:12:02
saben lo que tienen que hacer, pues tú estás gastando recursos para nada.
00:12:07
Entonces se contrapone al manejo de excepciones optimista.
00:12:13
¿Cómo es optimista?
00:12:19
Optimista es decir, pues tranquilo, todo irá bien, tú ejecútalo y trabaja, no va a pasar
00:12:22
nada.
00:12:29
la mayoría de las veces, no va a pasar
00:12:30
nada. ¡Qué bien!
00:12:32
Pero yo marco
00:12:35
algunos
00:12:37
trozos de código diciendo, ¡eh, mira!
00:12:38
Si cuando tú estás aquí, que tranquilo
00:12:41
que no va a pasar nada, pero si
00:12:43
en el caso aquí pasara
00:12:44
algo, te voy a dejar unas
00:12:46
instrucciones para intentar
00:12:48
recuperarte. Estas instrucciones
00:12:50
pueden pasar del
00:12:52
escribe un mensaje de error
00:12:53
y colapsa, a
00:12:56
escribe este mensaje en un fichero
00:12:58
y colapsa. Ah, oye,
00:13:00
no colapses y te explico
00:13:02
cómo recuperarte de este error.
00:13:04
¿Sí? Proteger
00:13:06
el código potencialmente peligroso
00:13:09
implica una estructura
00:13:11
try-catch.
00:13:14
Sostantialmente, prueba a hacer una cosa
00:13:15
y pilla los posibles errores.
00:13:17
¿Dudas?
00:13:22
Yo
00:13:24
entiendo las
00:13:25
dos opciones
00:13:26
y para mí personalmente
00:13:28
me parece un poco la optimista
00:13:31
pero no sé
00:13:33
cuál es la diferencia entre una y otra
00:13:35
entre el programa de manera optimista
00:13:37
y de manera pesimista, porque para mí personalmente
00:13:39
diría, joder, pues lo hago todo
00:13:41
de manera optimista y ya está
00:13:43
pero ¿qué tiene de malo?
00:13:45
a diferencia del otro
00:13:47
no
00:13:48
no hay ni bueno ni malo
00:13:50
¿vale? el concepto es que
00:13:53
en determinadas
00:13:55
circunstancias te compensa
00:13:57
usar uno, en determinadas
00:13:59
circunstancias te compensa hacer otro.
00:14:01
Esto no es gratis.
00:14:03
¿Vale? O sea, aquí
00:14:06
haces un cierto sobrecarga
00:14:07
cuando haces este código,
00:14:09
algo tiene que estar allí cuidando
00:14:11
de decir, oye, mira, que si pasa algo,
00:14:13
lo tengo que recuperar, no puede explotar sin nada.
00:14:15
¿Vale? Pero no es gratis.
00:14:17
Tampoco el IF es gratis. Preguntarse si esto
00:14:19
es así. Ahora, hay situaciones
00:14:21
en que una cosa la puedes hacer y la otra
00:14:23
no.
00:14:25
O al revés. Esto de leer un número y que en vez de leer un gato, no lo puedes considerar con un string.
00:14:27
Porque el error no te sale en lo he metido en una variable y ahora puedo comprobar esa variable.
00:14:37
El error te sale antes. Cuando tú intentas poner algo en una variable que puede contener Intel, estás poniendo un string.
00:14:43
Entonces, colapsa antes que tú puedas hacer un if sobre esa variable.
00:14:49
Entonces, ahí, por ejemplo, no puedes usar el if.
00:14:52
hay otras situaciones
00:14:54
en el que tú no quieres
00:14:57
gestionarlos con excepciones
00:14:59
o no tienes una excepción
00:15:01
válida para ese contexto
00:15:02
y entonces quieres comprobar
00:15:04
que lo que estás metiendo
00:15:07
los datos que estás metiendo sean correctos
00:15:09
a través de ETH
00:15:11
eso depende
00:15:12
un poco del proyecto y de
00:15:15
dónde estás, hay estos dos medios
00:15:16
el ETH
00:15:19
es asegurarse que antes de utilizar
00:15:20
los datos, los datos sean correctos
00:15:23
el try es intentarlo
00:15:24
y si va mal me recupero
00:15:27
del error, son dos enfoques
00:15:29
distintos, el try catch
00:15:31
se utiliza más
00:15:32
a nivel de cosas
00:15:34
que puedan lanzar excepciones en lo que
00:15:36
se tiene que utilizar
00:15:39
el otro, a lo mejor
00:15:39
hay algunas situaciones
00:15:43
que compensa
00:15:44
decir, los ejemplitos que hemos hecho nosotros
00:15:46
me tienes que dar un número positivo
00:15:49
pues vale, compruebo que el número
00:15:51
sea positivo porque si es negativo
00:15:53
quiero hacer una cosa distinta
00:15:54
considera que el try catch lo que hace es
00:15:56
si va mal
00:15:58
utilizar ese valor
00:16:00
pero allí ya algo ha ido
00:16:02
mal
00:16:05
si lo podía prevenir a lo mejor no lo ha sido
00:16:05
¿vale?
00:16:09
es sutil, se puede hacer
00:16:11
muchas veces se pueden hacer las dos cosas
00:16:12
hay veces como el ejemplo anterior que no
00:16:14
se puede hacer por ejemplo el list
00:16:17
y se tiene que hacer con try catch
00:16:18
casos concretos, una regla
00:16:20
concreta de cuándo es el uno o el otro,
00:16:24
no te la sabré yo.
00:16:26
¿Vale?
00:16:28
Tened en cuenta que
00:16:32
esto también a lo mejor lo entenderás
00:16:33
mejor en 10 años
00:16:36
después que has trabajado en una empresa.
00:16:37
¿Vale? Aquí la clave
00:16:40
es saber que hay las dos herramientas,
00:16:42
las dos posibilidades de hacer las cosas,
00:16:44
y llega un momento de una vida y dirás, oye, mira,
00:16:45
aquí esto encaja perfecto.
00:16:47
es que depende me explico tú imagínate que yo tengo un campo edad y yo no quiero poner una
00:16:48
edad negativa. Si alguien me dice edad menos 7, eso no es un error. El tráquecho no hace nada.
00:17:11
El tráquecho dice, perfecto, metele menos 7. Ahora, otra cosa es que después de la edad,
00:17:19
yo voy a hacer un cálculo que si el número es negativo, por ejemplo, voy a hacer una raíz
00:17:25
cuadrada o qué sé yo, y si el número es negativo, me da un error. Pues entonces allí sí que podría
00:17:31
tratarlo con un trackech. Pero el número ya está en la variable, no sé si me explico.
00:17:37
Entonces, ejemplo de pesimista contra optimista, ¿vale? Entonces, vosotros sabéis que si yo divido
00:17:42
un número por cero, explota. Aritmética excepción. No se puede dividir un número por cero, ¿vale?
00:18:01
entonces, pesimista
00:18:08
hay un main, tengo un scanner
00:18:10
digo, dame un entero, me dan
00:18:13
un entero y me pregunto
00:18:15
si el denominador es distinto
00:18:16
de cero, pues entonces
00:18:19
haz la operación, y si no
00:18:20
dices algo
00:18:22
aquí no hay un else, pero
00:18:24
sigues con la
00:18:26
programación, ¿vale?
00:18:28
aquí no explota
00:18:30
porque si el denominador es cero
00:18:32
no hará la operación, ¿vale?
00:18:34
No escribirá esta línea de códigos, pero no la ejecuta y por lo tanto no es nuestro, ¿vale?
00:18:36
Pero todas las veces que yo le pongo, como tengo en el nominador, un número que no es cero,
00:18:44
yo tendré que hacer este if, ¿vale?
00:18:50
Y que me dirá, sí, no es cero, y me escribirá la cosa.
00:18:53
Es como una operación esta.
00:18:56
Si yo sé que esto prácticamente no va a pasar nunca, o sea, a lo mejor es un gasto innecesario.
00:18:57
A nivel de 3K, yo no hago el if, simplemente hago esta división y pruebo a hacer esta división.
00:19:03
En el caso en que explote una excepción, lo que hago es escribir este número no es válido o recuperarme o cosas por el estilo.
00:19:13
Esto no hace explotar el programa, el programa sigue adelante.
00:19:20
Si yo quito
00:19:24
Este de aquí y pongo solo
00:19:26
Llave, llave, no hace nada
00:19:28
No escribe nada, no cambia nada y sigue adelante
00:19:30
Exactamente como hacía este
00:19:32
Ha habido un error
00:19:34
Pero se ha recuperado el error
00:19:37
Y sigue adelante
00:19:38
Esto porque hay alguien
00:19:39
Que se ha encargado de
00:19:42
Hacer este error, veis que estamos en el main
00:19:44
Pero el
00:19:46
El código que da problemas
00:19:48
Está protegido
00:19:50
Si yo quitar el track edge
00:19:51
cuando esto se ejecuta, da una excepción
00:19:53
no hay nadie
00:19:56
que gestiona, que controla esta excepción
00:19:57
estoy en el made, por lo tanto
00:20:00
la java esto machine se para
00:20:02
y me da un error de excepción
00:20:03
¿qué pasa con esto?
00:20:05
dudad, vale, existe una clase
00:20:07
que se llama exception, lo podéis encontrar en el
00:20:13
API, vale, exception es
00:20:15
una clase
00:20:17
de alto nivel
00:20:19
de las que heredan
00:20:21
la mayoría de los
00:20:23
de las clases que acaban con
00:20:25
bla bla bla excepción. Null pointer exception, aritmetic exception, stackable flow exception, etc.
00:20:27
No sé si era un exception, no lo recuerdo bien. Pero bueno. Cuando en este tema, la JVM crea un
00:20:35
objeto de la clase exception. O sea, cuando hay este tipo de error, que se ha estropeado,
00:20:44
la JVM va a recopilar datos su por qué ha habido este error y lo esguarda, crea un objeto
00:20:49
rellenando sus atributos, un objeto
00:20:56
de tipo excepción. ¿Vale? Este objeto.
00:20:59
Entonces, si yo dentro
00:21:06
del ramacatch,
00:21:07
dentro de esta variable,
00:21:09
tendré una referencia al objeto
00:21:11
excepción que ha creado la JavectorMachine.
00:21:13
Entonces, le podré preguntar,
00:21:16
mira qué ha pasado, dame una
00:21:17
descripción de por qué has explotado,
00:21:19
dame una descripción de lo que ha
00:21:21
pasado, de cuál es el contexto,
00:21:23
se puede hacer varias cosas sobre
00:21:25
la excepción.
00:21:27
En este objeto se guarda información sobre el error, quién lo ha producido, dónde se ha producido, qué ha causado errores, etc.
00:21:29
Un mismo código peligroso podría causar distintos tipos de excepciones.
00:21:38
Aquí podría ser que ponga un try, luego varias líneas de código y un catch.
00:21:43
Y puede ser que allí haya explotado por un null pointer exception, haya explotado por un number format exception,
00:21:47
haya explotado porque no ha podido leer un fichero, la IO exception, input output exception.
00:21:53
y podría ser que yo no lo sé
00:21:59
si lo pongo así
00:22:02
sea cual sea
00:22:03
el error, la excepción
00:22:07
que ha saltado, pues
00:22:10
llevo aquí
00:22:11
porque una null pointer exception
00:22:12
es una excepción
00:22:15
porque la he dado
00:22:18
la IO exception es una excepción
00:22:18
entonces aquí estoy pillando algo genérico
00:22:21
y sea cual sea el error
00:22:23
voy a ver que pasa
00:22:26
sin embargo
00:22:27
se puede manejar
00:22:29
las excepciones de una forma un poquito
00:22:33
más fina. O sea, decir que
00:22:34
oye, mira, si tú el error que ha habido
00:22:36
era un all pointer exception,
00:22:39
haz esto. Pero si
00:22:41
en vez de no era un all pointer exception,
00:22:42
era otro tipo de error, pues
00:22:44
haz una cosa distinta.
00:22:46
Y esto se hace
00:22:48
así.
00:22:50
Encontré
00:22:54
y luego digo, catch arithmetic
00:22:55
exception. Pues aquí dentro
00:22:58
este bloque 3 se ejecutará
00:23:00
si es sólo si la excepción
00:23:02
que ha explotado es una aritmética
00:23:04
exception.
00:23:06
Si no, se ejecutará esto
00:23:08
porque aquí dentro caen
00:23:10
todas las otras excepciones posibles.
00:23:12
¿Ve?
00:23:15
Tened en cuenta que el orden cuenta.
00:23:15
Si yo esto lo inverto,
00:23:18
la aritmética exception no la
00:23:20
ejecutaré nunca, porque siempre pillará
00:23:22
la primera como, ah, sí, es una excepción.
00:23:24
¿Entiendes?
00:23:28
¿Ve?
00:23:28
Entonces, en una situación como esta, yo estaría ejecutando el bloque 1, ¿vale?
00:23:32
Si no hay ninguna excepción, ejecuto el bloque 2 y luego voy al bloque 5.
00:23:36
Sin ningún problema.
00:23:43
Si salta una excepción de tipo aritmético, yo ejecutaría el bloque 1,
00:23:45
el bloque 2 lo ejecutaría parcialmente, asterisco, hasta donde salta el error.
00:23:49
Donde salta el error, entraría en el bloque 3.
00:23:55
Ejecutaría el bloque 3 y luego me iría al bloque 5.
00:23:58
Si en vez sale una excepción que no es una aritmética excepción, cualquier otra excepción,
00:24:02
pues bloque 1, bloque 2 a mitad, saltaría al bloque 4 y seguiría por bloque 4.
00:24:09
¿Dudas?
00:24:16
Existe también una cláusula opcional.
00:24:19
Esto es un try, catch, catch, catch, catch.
00:24:23
Se puede poner un finally.
00:24:26
el finales en cualquier caso después que has hecho lo que tiene que hacer ejecuta esta parte
00:24:28
como si fuera una parte que tanto que explote como que no así que la tiene que ejecutar pues
00:24:38
entonces la pongo en un final por ejemplo si no hay excepciones ejecuta la primera luego
00:24:44
ejecuta el bloque 2 entero, no ha habido excepciones, ejecuta el finally porque
00:24:57
esto se ejecuta siempre y luego va a ser bloque cíclico.
00:25:01
¿El finally sería como el default de un switch o el else to need?
00:25:06
No, porque tú estás ejecutando tanto el 2 como el 4, o ejecutas esto o ejecutas esto.
00:25:11
Finally es literalmente lo que dice, try, prueba a hacer esto, pilla estas excepciones
00:25:18
y al final hace esto. Entonces, si no hay excepciones, el bloque 1, bloque 2, bloque
00:25:25
finally y bloque 5. Ahora, si hay una excepción de tipo aritmético, entonces sería bloque
00:25:35
1, bloque 2 es donde hay la excepción, ejecutaría el bloque 3, después se ejecuta el finally
00:25:46
porque el final se ejecuta y después sigue con el fin.
00:25:53
Cualquier tipo de excepción diferente ejecutaría el bloque 1,
00:25:59
el bloque 2 a mitad y saltaría el final.
00:26:06
Porque no hay ningún catch que está pillando este tipo de excepciones,
00:26:10
pero el final se ejecuta de verdad.
00:26:14
Tened en cuenta que como no se ha pillado el catch,
00:26:16
el bloque 5 no llega.
00:26:20
Se ejecuta el 4 y se ha cerrado.
00:26:22
Entonces, ¿qué hay en la clase Exception?
00:26:26
La clase Exception tiene varias cosas, tiene varios parámetros, etcétera, etcétera, que hay útil.
00:26:38
Hay un getMessage que devuelve un string, que es una descripción de por qué ha ocurrido el error.
00:26:46
Entonces, yo desde dentro si uso e.getMessage sabré por qué ha explotado, ¿vale?
00:26:54
Uso e porque la excepción se llama e.
00:27:05
Si uso, si estoy aquí, debería hacer ae.getMessage, ¿sí?
00:27:07
ToString, algo parecido, ¿vale?
00:27:15
Porque el getMessage te da solo el mensaje de error,
00:27:19
el toString te da una representación del objeto entero.
00:27:23
Entonces incluye el mensaje de error,
00:27:27
pero te da también qué clase es, etc.
00:27:29
ReceptionString es el constructor de la clase, ¿vale?
00:27:34
Sirve porque tú puedes crear una excepción tuya.
00:27:36
PrintStackTrace es lo que veis cuando ha habido uno de estos errores,
00:27:42
que salen todos los métodos que estaban
00:27:47
llamando. Este es un error
00:27:50
que ha pasado en este método, que había sido
00:27:52
llamado desde este método, que había sido llamado
00:27:54
desde este método, que había sido llamado
00:27:55
este. Es
00:27:57
imprime una traza,
00:27:58
una descripción
00:28:02
de la pila de llamadas
00:28:04
de métodos.
00:28:06
Esta es la misma stack de los stack overflow.
00:28:09
Hasta aquí
00:28:17
control de excepciones, ¿vale?
00:28:18
Entonces, relativamente sencillo,
00:28:22
existen
00:28:23
métodos por ahí
00:28:24
que si funcionan mal
00:28:28
pueden lanzar una excepción
00:28:30
y que tú tienes que
00:28:31
controlar con
00:28:34
un try-catch, ¿vale?
00:28:36
Entonces, existen excepciones
00:28:37
que puedes
00:28:40
controlar o no.
00:28:42
Por ejemplo, la null pointer exception.
00:28:44
Si tú la controlas bien,
00:28:46
si tú no la controlas, te arriesga
00:28:48
pero hay a tú
00:28:50
¿vale? existen
00:28:52
excepciones en vez que si tú
00:28:54
tienes un método que lanza esa excepción
00:28:56
y no has hecho un try catch
00:28:58
el mismo compilador te avisa
00:29:00
te dice no, este método aquí no lo puedes
00:29:02
llamar si no lo pones dentro del try catch
00:29:04
¿vale? ahora veremos
00:29:06
de un tipo y cuáles son
00:29:08
¿vale?
00:29:10
pero técnicamente tú puedes hacer
00:29:12
puedes capturar
00:29:14
las excepciones, pero puedes hacer
00:29:16
métodos que lanzan
00:29:18
una excepción. Tú puedes
00:29:20
hacer que a un determinado momento,
00:29:22
mientras estás trabajando, dices, y si llegas aquí
00:29:24
y las condiciones son estas,
00:29:26
pues para
00:29:29
la ejecución y lanza
00:29:30
una excepción. Porque hemos llegado a un
00:29:32
punto en que no puedo seguir adelante.
00:29:34
¿Vale? Es como un
00:29:37
punto de bloqueo de, oye, yo
00:29:38
desde aquí no puedo seguir, a menos
00:29:40
que alguien nos recoja esta
00:29:41
excepción y me diga cómo hacerlo,
00:29:43
yo aquí ha acabado no tengo los datos para seguir adelante para lanzar una
00:29:46
excepción se usa el comando true lanza y la excepción que quiero lanzar
00:29:53
no puedo crear una new excepción excepción e igual new excepción le pongo
00:30:00
dentro el mensaje que quiero que ponga y luego la lanzo
00:30:04
el objeto que se le pasa a true tiene que ser de la clase excepción o una
00:30:11
cualquier subclase que la extienda incluso excepciones personales que os podéis crear
00:30:15
vosotros puedes crear la clase mi excepción que extends exception y luego hacer mi excepción
00:30:20
e es igual a new mi excepción y a ese punto throw e luego hacemos pruebas
00:30:27
que hace el throw sale inmediatamente del bloque del código actual cuando encuentro un throw he
00:30:38
acabado, allí voy a mi padre, a quien me ha llamado. Si allí dentro tenemos, estaba en un
00:30:44
try-catch y tengo un catch asociado a la excepción que he lanzado, pues entonces se recupera y se
00:30:51
hace ese código. Si no, salgo de ese bloque también y me voy a quien me había llamado. O sea, se va
00:31:02
para arriba si yo tengo el método busca que hace el error y el método busca lo había llamado el
00:31:13
método haz algo vale entonces yo voy a mirar si haz algo tiene un try catch o no si no lo tiene
00:31:19
va al que lo había llamado y si no lo tiene va al que lo había llamado hasta llegar al main si ninguno
00:31:26
ha hecho un try-catch nunca, pues allá es cuando bloqueo la JVM y se ha acabado totalmente.
00:31:33
Si en cualquiera de las stack de la pila de llamadas uno ha puesto un try-catch,
00:31:43
pues eso es el que recupera, o sea, que captura la excepción y a ver qué me dice.
00:31:49
proceso continuo está llegado al método main
00:31:57
si nadie lo ha hecho, pues es fatal
00:32:02
esta otra cláusula
00:32:04
que no es trow
00:32:09
es trow
00:32:10
con la s de tercera persona
00:32:11
en inglés
00:32:15
se usa
00:32:17
en las declaraciones de los métodos
00:32:19
para decir que
00:32:21
avisar
00:32:23
que oye, quien use este método f
00:32:24
que sepas
00:32:27
que este método puede lanzar
00:32:29
un determinado tipo de excepción.
00:32:31
Entonces,
00:32:35
cuando yo voy a usar el método F,
00:32:35
sé que al usarlo
00:32:37
debería meterlo
00:32:39
dentro de un try-catch
00:32:41
que recupere este tipo de excepción.
00:32:42
Esto lo veremos que algunos métodos
00:32:47
cuando vamos en el API, me dice
00:32:49
este método, throws, no sé qué.
00:32:51
Entonces, cuando yo lo lanzo, tengo que comprobar
00:32:53
que este método
00:32:55
esté bien. Lo veremos por ejemplo
00:32:56
en los ficheros, en la gestión de ficheros
00:33:00
todas las IOException
00:33:03
necesitan ser tratadas de esta forma.
00:33:05
Si un método lanza más de una excepción
00:33:09
se indicará detrás de TROs. O sea, TROs de 1
00:33:11
con MET2, con MET3, con MET4.
00:33:14
Para no que utilicemos métodos que lanzan por detrás de excepciones
00:33:25
o lo protegemos o no lo protegemos. Esto lo hemos dicho ya
00:33:29
sustancialmente, pero luego lo vemos en la práctica.
00:33:32
La última cosa que me interesa, sustancialmente, porque luego están las
00:33:37
excepciones personalizadas, que a lo mejor lo vemos en otro día así,
00:33:41
es la jerarquía de excepciones. Todas las excepciones son throwable, o sea, se
00:33:45
pueden lanzar, pero dentro de throwable hay dos tipos, hay los errores o las excepciones,
00:33:50
lo que decimos al principio
00:33:57
los errores son errores graves
00:33:59
de allí no te recuperas, es un problema
00:34:01
interno de la JavaScript Machine
00:34:03
ha acabado la memoria, pues si ha acabado la memoria
00:34:04
no puedes hacer nada
00:34:07
también porque la rama está muy cara
00:34:08
¿sí? entonces estos son
00:34:11
los que son bla bla bla error
00:34:13
bla bla bla error
00:34:15
¿sí?
00:34:16
mientras que las excepciones son errores
00:34:19
manejables o recuperables, esto algo
00:34:21
puede hacer, puede hacer un try catch para
00:34:23
intentar solucionar el problema
00:34:25
Y aquí dentro hay dos tipos.
00:34:27
Hay la RuntimeException y las otras.
00:34:30
Si soy RuntimeException, son errores que pueden pasar,
00:34:35
pero que son tan habituales, son tan comunes,
00:34:40
que no hace...
00:34:46
O sea, que tú puedes decidir de poner un trackecho o no.
00:34:48
Por ejemplo, el NullPointerException.
00:34:53
Null pointer exception es muy común
00:34:55
Si tú dijeras, oye no
00:34:58
Lo tienes que, siempre que
00:35:00
Hay la posibilidad de un null pointer exception
00:35:02
Tienes que hacer algo
00:35:04
Pues mi código estaría lleno de try-catch
00:35:04
Porque cualquier cosa que tú utilices
00:35:07
Cualquier objeto podría ser null
00:35:09
¿Sí?
00:35:10
Entonces se te rellenaría todo de try-catch
00:35:13
Entonces ellos dicen, vale, no
00:35:15
La null pointer exception
00:35:17
Es una runtime exception
00:35:19
Y la runtime exception
00:35:21
puedes decidir de no
00:35:23
no capturarlas
00:35:25
de dejarlas sin trigger
00:35:28
sin embargo
00:35:29
las que no son runtime exception
00:35:32
pues sí que tienen que ser
00:35:34
capturadas siempre
00:35:37
y son las que decía antes
00:35:37
si aquí como por ejemplo
00:35:39
aquí son ejemplos que no veremos nunca
00:35:41
si tú intentas hacer un método
00:35:44
que lanza una de estas
00:35:46
excepciones de aquí
00:35:48
no te permite el compilador
00:35:49
de compilar el código si tú no lo has
00:35:52
puesto dentro del tránsito.
00:35:54
Esto es un poco la estructura
00:36:00
de lo que hay por aquí. Todos son
00:36:02
trouble. Aquí están los errores, como por
00:36:04
ejemplo una virtual machine error
00:36:06
que aquí hereda
00:36:08
el out of memory error. No tengo
00:36:10
memoria, no puedo ejecutar.
00:36:12
El, no lo sé, stack
00:36:14
overflow error.
00:36:16
Y si no están las
00:36:19
excepciones, de aquí están la
00:36:20
runtime exception, que son las que
00:36:22
pueden ser no controlables
00:36:24
y todas las otras excepciones.
00:36:26
¿Sí? Estas
00:36:29
hay que controlarlas siempre,
00:36:30
como por ejemplo todas las
00:36:33
IOException, por eso cuando veremos
00:36:34
ficheros, pues estaremos siempre con
00:36:36
try-catch.
00:36:38
Estas en vez de son las que, oye,
00:36:40
mira, por ejemplo, array index
00:36:42
autobound. Nosotros
00:36:44
no hemos usado nunca try-catch,
00:36:46
pero sí hemos usado los
00:36:48
arrays, y podría ser que
00:36:50
habríamos podido acceder
00:36:52
fuera. De hecho, algunos ejercicios
00:36:54
os han dado ese error.
00:36:56
Pero no te esfuerza a
00:36:58
crearlo porque si no, deberías
00:37:00
estar todo dentro de lo que has hecho constantemente.
00:37:02
¿Vale? Entonces, estos errores aquí
00:37:04
son errores muy comunes
00:37:06
que pero te dicen, oye, mira, si quieres lo haces
00:37:07
y no, no.
00:37:10
¿Sí?
00:37:11
Y excepciones personalizadas me puedo crear
00:37:13
mis propias excepciones
00:37:16
y luego lanzarlas.
00:37:17
¿Vale?
00:37:21
miramos esto para entender
00:37:21
imaginaos, aquí me estoy creando
00:37:24
una divide by 0 exception
00:37:26
que estende una aritmética exception
00:37:28
esta es una clase mía
00:37:30
hago lo que tengo que hacer aquí dentro
00:37:32
y aquí tengo un método
00:37:34
el método dividir que pilla dos números
00:37:36
y que puede lanzar
00:37:39
la divide by 0 exception
00:37:41
lo estoy avisando
00:37:42
entonces, quien use
00:37:45
dividir con dos valores, debería
00:37:46
ponerlo dentro de un try catch porque podría
00:37:48
saltarla divideByZeroException, ¿entiendes?
00:37:50
Pero como la divideByZeroException
00:37:55
extiende la ArithmeticException
00:37:59
y la ArithmeticException es una RuntimeException,
00:38:01
por si no uso el Tracker, no me dice nada.
00:38:06
¿Sí? Vale. Y con esto,
00:38:11
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 5
- Fecha:
- 30 de enero de 2026 - 13:48
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 38′ 20″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 321.67 MBytes