Clase 08-04-24 - 1 - 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:
Que aunque se vea al revés, lo que importa es hacerse una idea de lo que se ha contado
00:00:00
y volver a oírlo por si algo no ha quedado claro, simplemente.
00:00:04
Bueno, vamos a completar con lo de excepciones.
00:00:09
Lo que contamos el otro día era simplemente que las excepciones son una forma
00:00:13
que tiene el código de avisar de que ha pasado algo raro.
00:00:21
entonces un código
00:00:25
siempre puede avisar
00:00:27
si nosotros lo programamos así, claro
00:00:29
de que han pasado cosas de mil maneras
00:00:31
pues puede avisar
00:00:34
mostrando un mensaje por consola
00:00:36
puede avisar
00:00:38
en el caso de que estemos haciendo un método
00:00:40
puede avisar
00:00:42
mediante el valor de retorno
00:00:46
y lo ponemos aquí
00:00:48
si el valor de retorno es cero
00:00:50
es que ha pasado no sé qué
00:00:52
eso lo estuvimos viendo el otro día
00:00:53
puede avisar de muchas formas
00:00:55
pero cada una de ellas tiene sus
00:00:57
inconvenientes, esta
00:01:00
que este aviso para qué sirve
00:01:01
pues solo porque si hay alguien sentado delante en la consola
00:01:03
lo lea
00:01:06
lo lea y decida parar
00:01:07
en el programa y decida hacer algo
00:01:09
vale
00:01:11
bajo esas circunstancias que son un poco raras
00:01:12
que haya alguien sentado para leerlo y entonces
00:01:16
decidir cómo actúa
00:01:18
y esto de aquí lo mismo, vale
00:01:19
si es que este valor de retorno no tiene ya
00:01:21
un uso concreto
00:01:23
si este valor de retorno tiene un uso concreto
00:01:24
que es devolver el resultado
00:01:27
de este método
00:01:29
pues si tiene ese uso concreto
00:01:30
no podemos usarlo como código
00:01:33
de error o como código de lo que ha pasado
00:01:35
¿vale? no podemos
00:01:37
porque ya tiene un uso concreto que es
00:01:39
devolver la suma, la multiplicación, lo que sea
00:01:41
que sea de aquí
00:01:43
entonces hay un mecanismo para avisar de que algo
00:01:44
raro ha pasado, que es el de excepciones
00:01:47
que
00:01:49
se puede hacer
00:01:51
en cualquier momento del código
00:01:54
escribiendo esto
00:01:56
como vimos el otro día
00:01:58
esto y aquí un objeto excepción
00:01:59
un objeto excepción
00:02:04
el que sea
00:02:07
¿vale?
00:02:07
esta es una sentencia más de código en Java
00:02:12
el throw
00:02:14
entonces
00:02:14
cuando la máquina virtual
00:02:16
se encuentra esta sentencia escrita
00:02:19
lo que hace es
00:02:21
crear un objeto
00:02:23
de este tipo
00:02:25
instanciar un objeto como este
00:02:27
instanciarlo
00:02:29
y si
00:02:31
no hay nada más, si no hay más indicaciones
00:02:33
que esto, no hay nada más puesto en el código
00:02:35
lo que hace es
00:02:37
mostrar un aviso
00:02:38
mediante letras rojas en la consola que estamos
00:02:41
acostumbrados a verlo, un aviso con letras rojas
00:02:43
en la consola que estamos acostumbrados
00:02:45
y además
00:02:47
parar el programa, eso es lo que hace
00:02:48
muestra
00:02:51
una traza roja
00:02:52
con información sobre lo que ha pasado
00:02:54
y para el programa.
00:02:56
Eso es lo que hace la máquina virtual
00:02:58
cuando se encuentra esta sentencia.
00:02:59
¿Vale?
00:03:03
Y eso nos ha pasado un montón de veces.
00:03:04
El ver que salían letras rojas
00:03:06
y que el programa paraba.
00:03:08
Nos ha pasado un montón de veces.
00:03:09
¿Por qué?
00:03:11
Porque hemos llamado a métodos,
00:03:12
hemos hecho cosas
00:03:14
que cuando se ha entrado en ese método
00:03:14
la máquina virtual se ha encontrado esto.
00:03:17
¿Vale?
00:03:21
pues cuando hemos tratado de acceder a objetos que eran nulos
00:03:21
cuando hemos llamado a métodos de leer por teclado
00:03:25
por ejemplo next in
00:03:28
y lo que le hemos pasado era una cadena con caracteres
00:03:30
entonces ese next in ha entrado dentro y ha visto
00:03:34
uy es un carácter, pues ese next in tiene dentro el throw
00:03:36
entonces cuando una excepción aparece
00:03:39
no es que se haya roto algo
00:03:43
es simplemente que se ha ejecutado una línea de código como esta
00:03:44
ya está, se ha ejecutado una línea de código como esa
00:03:49
esa línea de código
00:03:51
lo normal es que vaya lógicamente
00:03:53
dentro de un if, claro
00:03:55
un if
00:03:57
de verificación, ¿qué ha pasado esa cosa
00:03:59
rara? que yo me esperaba
00:04:01
un número y tengo un carácter
00:04:03
que este objeto es nulo
00:04:05
lo que sea, ¿qué ha pasado una cosa
00:04:07
rara? pues throw
00:04:09
lo normal es que esos throw por tanto estén dentro de if
00:04:10
y si ha pasado algo
00:04:13
uno decida que se lance excepción
00:04:15
Entonces, es la mejor manera de avisar de que algo ha pasado, ¿vale? Y repito, la respuesta de la máquina virtual a esta sentencia cuando se la encuentra, si no hay nada más que esto, si no hay nada más, es mostrar la traza roja con información y detener la ejecución, ¿vale? Detenerla y ya está, detenerla.
00:04:17
vale, entonces
00:04:41
¿qué vimos el otro día? bueno, pues cuando
00:04:42
pasa esto, cuando
00:04:44
la máquina virtual encuentra
00:04:46
este throw y lanza la excepción
00:04:48
y se para
00:04:51
la máquina virtual, sabemos que
00:04:53
tenemos una manera de alterar este
00:04:54
funcionamiento, de alterarlo
00:04:56
tenemos una manera de alterarlo, y es
00:04:58
oye, en este código
00:05:00
que me puede lanzar
00:05:02
por ejemplo, nosotros tenemos
00:05:05
un objeto scanner
00:05:06
que va a leer
00:05:08
tenemos esta sentencia
00:05:10
¿vale? tenemos esta sentencia de aquí
00:05:14
nextIn
00:05:17
entonces este es un método
00:05:17
este es un método al que la máquina virtual salta
00:05:19
la máquina virtual salta
00:05:22
y se pone a leer
00:05:25
del teclado, a hacer cositas
00:05:27
entonces si detecta
00:05:29
que lo que ha leído son caracteres
00:05:30
si detecta que lo que ha leído son caracteres
00:05:33
pues hace el throw
00:05:35
el throw este
00:05:36
y este throw en particular
00:05:38
que hace el next in dentro
00:05:41
será un throw del tipo
00:05:42
algo así
00:05:45
creo que se llamaba así
00:05:47
la excepción que nos salía cuando intentábamos
00:06:09
leer un número
00:06:11
y resulta que no era número
00:06:12
sino que era carácter
00:06:15
ah, no era number format exceptio
00:06:16
una de las dos, o input type o number format
00:06:21
da igual
00:06:23
vale
00:06:25
Bueno, pues esto de aquí estará dentro del método NextIn, ¿verdad? Estará dentro.
00:06:47
El método NextIn se pone a coger del buffer, del teclado, se pone a verificar cosas,
00:06:53
si verifica que la cadena no son números, hace el throw, ¿vale?
00:06:58
Todo esto estará dentro de ese método NextIn.
00:07:03
Nosotros cuando hemos llamado a NextIn, pues esperábamos que pasara todo lo necesario para leer del teclado,
00:07:06
lo que fuera, bueno, pues todo eso está dentro de NextIn, ¿vale?
00:07:12
Entonces dentro de next in habrá todo el código para leer y dentro de ese código habrá algo de este estilo, habrá algo de este estilo que será, oye, si esta cadena que yo me he encontrado en el buffer del teclado no son números, lanza esta excepción, ¿vale?
00:07:15
Por eso cuando nosotros hemos ejecutado esta sentencia y le hemos pasado una cadena que no eran números, nos hemos encontrado las letras rojas que nos decían number for my exception y se ha detenido la ejecución.
00:07:31
bueno, nos hemos encontrado eso
00:07:44
porque al entrar dentro de NextInt
00:07:46
la máquina virtual ha ejecutado esta sentencia
00:07:48
por eso nos hemos encontrado eso
00:07:50
pues las letritas rojas
00:07:52
y además que la ejecución se para
00:07:54
eso es lo que nos hemos encontrado
00:07:56
vale, bueno, pues también
00:08:00
sabemos que, oye
00:08:02
quiero alterar este funcionamiento
00:08:04
no quiero que aunque
00:08:05
NextInt se encuentre
00:08:08
números, perdón, caracteres
00:08:10
en vez de números, no quiero
00:08:12
que se pare el programa, porque
00:08:14
es muy radical, que por cualquier cosita que pase
00:08:16
se tenga que parar el programa, es muy
00:08:18
radical, uno
00:08:20
en su ejecución de su código, en su
00:08:21
diseño puede decir, oye, si no
00:08:24
es un número, sino que
00:08:26
son caracteres, pues mala suerte
00:08:28
ya sobreviviré de otra manera, pero
00:08:30
no detengas el programa por eso
00:08:32
entonces uno puede alterar este funcionamiento básico
00:08:34
puede alterarlo
00:08:36
¿vale? ¿y cómo lo altera? pues como dijimos
00:08:38
también el otro día y como hemos hecho otras veces
00:08:40
esta sentencia que es la peligrosa
00:08:42
porque es la que cuando saltamos
00:08:45
dentro tiene el throw
00:08:46
tiene el throw si pasa algo raro
00:08:48
y ya sabemos que el throw es el que
00:08:50
provoca esto
00:08:52
pues esta sentencia la capturamos
00:08:53
¿no?
00:08:56
y la capturamos de esta manera
00:08:58
ahora ya simplemente metiendo esta
00:09:20
sentencia en try catch, aquí
00:09:22
la excepción que queremos capturar
00:09:24
y aquí
00:09:27
lo que queramos en el catch
00:09:28
simplemente así alteramos
00:09:31
el funcionamiento, la sentencia se va a ejecutar
00:09:33
igualmente
00:09:35
que no hay problema
00:09:36
se ha ejecutado sin ningún error
00:09:38
y no hemos llegado al throw
00:09:41
porque este
00:09:43
if era falso
00:09:45
pues el programa sigue por aquí tan feliz
00:09:46
que si ha habido un problema
00:09:49
porque al saltar a next in
00:09:51
esto ha sido true
00:09:53
la máquina virtual ha hecho el throw
00:09:55
vale, pues si, la máquina virtual ha hecho el throw
00:09:57
pero ya no saltamos a mostrar líneas rojas
00:09:59
y stop, ha hecho el throw
00:10:01
pero la máquina virtual lo que hace ahora
00:10:03
es saltar al catch
00:10:05
luego la máquina virtual
00:10:06
a resultas de ejecutar un throw
00:10:09
tiene dos caminos, que la excepción
00:10:11
no esté capturada, no haya un try catch
00:10:13
letras rojas
00:10:15
y parada de ejecución
00:10:17
que la sentencia si esté
00:10:18
capturada, la excepción si esté capturada
00:10:21
pues entonces va al otro camino
00:10:23
que es ejecutar lo que hay en el catch
00:10:25
lo que uno haya escrito, lo que le dé la gana
00:10:27
como si es nada, en blanco
00:10:29
ejecuta eso
00:10:30
y luego continúa el programa sin pararlo
00:10:32
continúa el programa sin pararlo
00:10:35
son las dos posibilidades
00:10:37
que tiene la máquina virtual cuando se encuentra
00:10:39
un flow
00:10:41
y va a depender de si está capturada
00:10:42
o no está capturada esta excepción
00:10:45
¿vale?
00:10:47
porque podría estar capturada la otra
00:10:50
imaginaos que yo aquí
00:10:51
tengo este mismo
00:10:53
try-catch
00:10:55
pero en lugar de
00:10:56
tener ahí number for my exception
00:10:58
tengo por ejemplo null pointer exception
00:11:00
tengo esta, tengo un try catch
00:11:03
que pone null pointer exception
00:11:06
vale, pues entonces, la máquina virtual
00:11:07
entra al next thing
00:11:10
se encuentra
00:11:12
la cadena del buffer que estoy leyendo
00:11:13
no son números, throw
00:11:16
pero la que lanza es esta
00:11:18
esta está capturada, no
00:11:19
la que está capturada es esta otra
00:11:21
y no es la que hemos lanzado
00:11:24
es esta, con lo cual
00:11:25
a resultas de este throw nos iríamos
00:11:28
a este camino, nos iríamos a letras rojas
00:11:30
y esto, porque a mí me has dado
00:11:32
indicaciones solo para esta
00:11:34
me has dado indicaciones para esta, para esta no me has dado
00:11:36
con lo cual
00:11:38
aunque esto esté en un try-catch
00:11:40
como la que está capturada no es la que se ha lanzado
00:11:42
pues
00:11:45
procederíamos a letras rojas y esto
00:11:46
sin embargo
00:11:48
imaginaos que aquí lo que ha ocurrido
00:11:50
que scan yo no lo he instanciado
00:11:52
y scan es null
00:11:53
porque no lo he instanciado
00:11:55
si me he olvidado
00:11:57
hacer el new scanner
00:11:58
vale
00:11:59
pues entonces
00:12:00
este try catch entramos
00:12:00
y la excepción
00:12:02
que saldría aquí
00:12:03
si sería
00:12:03
null pointer exception
00:12:05
porque scan es null
00:12:06
null
00:12:07
intenta llamar a algo
00:12:08
y ya le sale
00:12:09
el null pointer exception
00:12:10
entonces
00:12:11
esta si estaría capturada
00:12:12
con lo cual
00:12:14
la de null pointer exception
00:12:16
no detendría el programa
00:12:18
aunque scan fuera null
00:12:19
no lo detendría
00:12:20
se iría
00:12:21
a lo que hay aquí
00:12:23
Y luego continuaríamos.
00:12:24
¿Vale?
00:12:27
Bueno, pues lo importante,
00:12:29
sobre todo lo que aportamos ahora,
00:12:31
porque más o menos cómo funcionaba el try-catch,
00:12:32
más o menos podíamos tenerlo
00:12:35
de alguna vez que lo hemos tenido que usar,
00:12:36
es por qué aparecen las excepciones.
00:12:38
Son una sentencia más de código
00:12:40
que aparecen a resultas
00:12:42
de que la máquina virtual ejecuta un throw.
00:12:43
¿Y qué implica la ejecución de un throw?
00:12:47
Pues implica o esto o esto.
00:12:49
Depende de si hay captura
00:12:52
o no hay captura, ya está
00:12:53
¿vale?
00:12:55
entonces también dijimos
00:12:59
el otro día, oye y objetos excepción
00:13:00
¿cuántos tipos distintos hay?
00:13:02
pues tropecientos mil
00:13:04
conocemos muchos
00:13:05
null pointer exception, string line desbound exception
00:13:07
number formal exception
00:13:10
divide by zero exception
00:13:12
conocemos muchos ya porque nos han
00:13:14
aparecido, pero hay muchísimos
00:13:16
más, cada uno
00:13:18
de ellos asociado a una
00:13:20
causa de error específica
00:13:22
¿vale?
00:13:24
entonces el throw
00:13:26
instancia el objeto
00:13:27
asociado que él cree
00:13:29
que está asociado a esa causa de error
00:13:32
ya hicimos el otro día un ejemplo
00:13:34
en el cual
00:13:36
lanzábamos nosotros
00:13:37
nuestra propia excepción
00:13:39
lanzábamos nosotros un null pointer exception
00:13:41
asociado a otra cosa
00:13:44
entonces bueno, no pegaba mucho pero podíamos lanzarlo
00:13:45
¿vale?
00:13:48
vale, entonces
00:13:50
ahora que estamos aquí
00:13:53
antes de ver ya el ejemplo y todo eso
00:13:56
vamos a terminar un poco con los try-catch
00:13:58
entonces esta es la
00:14:00
la estructura básica de un try-catch
00:14:05
es esta que ya hemos visto
00:14:07
la que hemos mencionado
00:14:09
pues dentro del try-catch
00:14:12
se ponen la
00:14:16
o las sentencias que uno quiera
00:14:18
se puede poner aquí muchas sentencias
00:14:19
da igual, cállate
00:14:22
¿vale?
00:14:26
y aquí se pone un tipo de excepción
00:14:29
un tipo de excepción
00:14:33
imaginaos que pongo esta
00:14:34
un tipo de excepción y aquí un nombre de variable
00:14:36
esto es como si fuera
00:14:41
la lista de parámetros
00:14:43
que recibe un método
00:14:45
la lista de parámetros que recibe un método
00:14:46
¿vale?
00:14:49
Andrés
00:14:52
¿vale?
00:14:52
esta es la estructura del try-catch básica
00:14:55
entonces, ¿esto qué significa?
00:14:57
la sentencia o las sentencias
00:15:02
se intentan ejecutar
00:15:04
si una de ellas
00:15:05
tiene como consecuencia
00:15:07
una excepción de este tipo
00:15:10
de este tipo
00:15:12
de este tipo
00:15:13
pues entonces saltamos al catch
00:15:15
y esto es como si fuera un método en realidad
00:15:17
y a este método
00:15:20
se le pasa como parámetro
00:15:22
un objeto excepción de este tipo
00:15:24
entonces el objeto excepción
00:15:26
lo instancia la máquina virtual
00:15:28
o sea el propio throw de hecho lo tenía
00:15:30
el throw decía
00:15:32
throw new la excepción que sea
00:15:34
¿veis? el propio throw
00:15:37
ya instancia
00:15:44
un objeto excepción
00:15:45
y ese objeto excepción es el que recibe
00:15:47
el catch como parámetro, lo recibe aquí
00:15:49
¿vale?
00:15:51
el catch recibe como parámetro un objeto
00:15:53
excepción que es el que se ha instanciado
00:15:55
como consecuencia de hacer el throw
00:15:58
entonces yo aquí le puedo llamar
00:16:00
le podéis llamar como os dé la gana
00:16:02
a este objeto excepción
00:16:03
esto vedlo como si fuera
00:16:05
la cabecera de un método
00:16:07
este es el objeto parámetro
00:16:09
que recibe
00:16:12
este método
00:16:12
y el objeto parámetro que recibe es el objeto
00:16:14
excepción que se ha instanciado
00:16:18
cuando se hizo el throw
00:16:20
entonces
00:16:21
recopilamos
00:16:23
esto, hemos saltado al código
00:16:25
de nextIn
00:16:28
ha hecho un throw
00:16:28
bueno, la que sea
00:16:31
ha hecho un throw
00:16:33
la máquina virtual al ver el throw
00:16:34
ha generado este objeto, lo ha instanciado
00:16:36
y ahora se pone a mirar
00:16:40
¿la sentencia que ha generado este throw
00:16:43
está dentro de un try-catch?
00:16:48
no, letra roja, sí, stop
00:16:51
sí, vale, ¿ese catch se corresponde
00:16:54
con la excepción que yo he instanciado?
00:16:58
no se corresponde, letra roja, sí, stop
00:17:01
si se corresponde, pues ahora ya
00:17:04
entramos en el catch
00:17:07
pasándole como parámetro
00:17:09
este objeto que acabamos de instanciar
00:17:10
¿vale?
00:17:13
ya está, ese es el funcionamiento
00:17:15
y ahora con este objeto que acabamos de instanciar
00:17:17
uno puede hacer aquí lo que le dé la gana
00:17:19
lo que normalmente
00:17:21
queremos hacer con este objeto
00:17:23
es simplemente sacar
00:17:25
información sobre la excepción, nada más
00:17:27
entonces este objeto x
00:17:29
o e, como lo queráis haber llamado
00:17:30
es un objeto excepción
00:17:33
que tiene dentro información
00:17:34
varia sobre la excepción
00:17:36
y podemos sacarla mediante sus métodos
00:17:37
si nosotros hacemos aquí a ver que métodos tiene
00:17:40
pues tienen métodos relacionados con
00:17:42
pues dame el objeto que generó el método
00:17:44
que llamó la excepción, información varia
00:17:46
entre ellas el método
00:17:48
más importante, más usado
00:17:50
es este, este método
00:17:52
es un método
00:18:01
de los objetos exception
00:18:03
de las clases excepción que lo único
00:18:05
que hace es hacer unos system
00:18:07
OutprintDLN con un montón
00:18:09
de información sobre la excepción.
00:18:11
En qué línea se produjo de código,
00:18:13
quién le había llamado, es decir,
00:18:15
esto muestra
00:18:17
y además las muestra en colorcito
00:18:19
rojo. Esto muestra
00:18:21
los mismos
00:18:23
mensajes que vemos nosotros
00:18:25
cuando la excepción no es capturada.
00:18:27
Los mismos, coinciden, son los mismos.
00:18:30
Entonces, si la excepción
00:18:32
no es capturada, ya hemos visto que la máquina virtual
00:18:33
muestra unos mensajes
00:18:35
y además para, pues los mensajes
00:18:36
que muestra, los saca
00:18:39
de aquí también, los genera
00:18:41
también la máquina virtual con este método
00:18:43
¿vale? pero bueno, eso es lo de menos
00:18:45
entonces, este objeto
00:18:47
repito, lo podemos usar aquí dentro
00:18:51
para ver cosas
00:18:53
de la excepción si queremos
00:18:55
o podemos pasar de él y limitarnos a
00:18:56
poner aquí, pues ha habido un error
00:18:59
lo que yo quiera, o un retun
00:19:01
para que el método salga
00:19:04
lo que a mí me dé la gana, puedo poner
00:19:05
entonces cuando estoy todavía
00:19:07
en fase de desarrollo de pruebas
00:19:12
de mi código, no lo he entregado
00:19:14
al cliente, estoy todavía haciendo
00:19:16
pruebas, siempre tendremos
00:19:18
esto puesto, siempre
00:19:20
porque lo que yo quiero es
00:19:22
si hay un error
00:19:24
ver toda la explicación, quiero verla
00:19:25
entonces cuando estamos en esa fase en la que yo
00:19:28
como programador estoy haciendo pruebas
00:19:32
yo si ha habido un problema y me he ido
00:19:33
al catch, quiero ver todos los detalles de lo que
00:19:36
ha pasado, pues entonces llamo a esto
00:19:38
pondré esto dentro
00:19:40
pero claro, cuando ya
00:19:41
he entregado el software y ya se lo he
00:19:44
dado al cliente, esto
00:19:46
lo comentaremos y lo quitaremos
00:19:48
porque
00:19:50
en el caso de que haya una excepción
00:19:52
yo ya en el tiempo de explotación
00:19:54
de la aplicación, no quiero que le salgan
00:19:56
letras rojas que no va a entender
00:19:58
al que la está ejecutando
00:20:00
lo más que puedo querer es
00:20:02
que le salga un mensajito de disculpe
00:20:04
ha habido un error, contáctenos el sitio técnico
00:20:06
a lo mejor si puedo querer que le aparezca eso
00:20:08
pues pondría aquí un mensaje
00:20:10
con eso, o una escritura
00:20:12
en el archivo de logs
00:20:14
lo habitual, vale, entonces
00:20:15
en tiempo de desarrollo
00:20:20
esto
00:20:22
es fundamental que esté, porque me va a ayudar
00:20:23
si mi aplicación está dando errores
00:20:26
me va a ayudar a explicarme
00:20:28
a entenderlo, cuando ya entrego
00:20:29
la aplicación, todo esto lo voy comentando, lo quito
00:20:32
porque en ese caso
00:20:34
cuando hay error, la información
00:20:36
es al cliente, no es al desarrollador
00:20:38
y la información para el cliente
00:20:40
para el usuario del software no es
00:20:42
main, la línea, no sé qué
00:20:44
no es esa, la información para el cliente
00:20:46
para el usuario de la aplicación es
00:20:49
ha habido un error, no se pudo ejecutar
00:20:50
o la que uno decida
00:20:53
¿vale?
00:20:54
bueno, por eso por un lado
00:20:58
vale, luego los cats admiten
00:21:00
diferentes
00:21:02
variantes
00:21:03
para dejar a lo mejor más completo
00:21:06
más bonito, variantes que se han ido incorporando
00:21:08
según las versiones, por ejemplo
00:21:10
está el try, el multicatch
00:21:12
si yo quiero capturar
00:21:14
varias excepciones, por ejemplo
00:21:17
uno podría decir, el scan next in
00:21:19
me puede generar la number
00:21:21
formal exception, que ya lo sabemos, vale
00:21:23
pues yo capturaría la number formal exception
00:21:25
y aquí pongo
00:21:27
pues lo que quiera yo, que se ejecute
00:21:42
cuando se da la number formal exception
00:21:44
pero puede decir, ya, pero aquí también
00:21:45
en estas sentencias, también puede
00:21:48
ser que ocurra otra, puede ser que ocurra
00:21:50
por ejemplo la null pointer exception
00:21:52
vale, pues entonces ponemos
00:21:53
otro catch, este es el
00:21:56
multicatch, asociado a un mismo
00:21:58
try, podemos poner un montón de catch
00:22:00
distintos, cada una de ellas con
00:22:02
diferentes excepciones
00:22:04
y así podríamos poner tropecientos
00:22:05
catch, si es que el código
00:22:18
que yo tengo aquí, puede que
00:22:19
genere muchos diferentes tipos de
00:22:21
excepciones y yo quiero capturarlas todas
00:22:23
pues podría hacer un multicatch
00:22:25
y ahora ya pues esto funciona
00:22:28
esto se intenta ejecutar
00:22:31
que no hay ningún problema, fenomenal
00:22:33
saltamos por aquí y pasamos de los
00:22:35
cats y seguimos
00:22:37
que sale esta excepción
00:22:38
se salta el cats, se ejecuta esto
00:22:40
y continuamos
00:22:43
el programa no se para, el resto de los cats
00:22:45
se ignoran, que la excepción
00:22:47
que salta es esta
00:22:49
pues entonces se ejecuta este cats
00:22:50
y ya seguimos por el final
00:22:53
entonces si sale una excepción
00:22:54
la máquina virtual va a ir catch por catch
00:22:56
desde arriba hasta que encuentre
00:22:59
el primero en el cual se
00:23:01
corresponde la excepción generada con esta
00:23:03
en cuanto lo encuentra
00:23:05
entra adentro, hace lo que tenga que hacer
00:23:06
y ya está, y sale
00:23:09
entonces es el multicatch
00:23:10
y así yo puedo tratar de forma diferente
00:23:13
diferentes excepciones
00:23:15
No, a ver, el throw
00:23:17
genera una excepción
00:23:27
o sea, si hay un método que tú
00:23:29
generas varias, pues dependerá
00:23:31
que no hay números en la cadena
00:23:32
throw new exception
00:23:35
que el scan es nulo
00:23:36
pues throw new number formal exception
00:23:39
throw null pointer exception
00:23:41
o sea, el throw, cada throw
00:23:43
te lanza una única excepción
00:23:45
te lanza la que corresponda
00:23:47
a eso que tú has verificado
00:23:50
pero un solo método, pues puede tener
00:23:51
diferentes throw, si pasa
00:23:54
esto, throw esta, ahora sigues
00:23:56
haciendo cosas, que pase esto, throw
00:23:58
esa otra cosa, o sea el throw
00:23:59
te lanza un objeto de excepción
00:24:02
pero claro, un mismo método en función
00:24:04
de lo que ha pasado, pues puede ejecutar un throw
00:24:06
o puede ejecutar otro, el que sea
00:24:08
en cada momento dado
00:24:09
este next in puede haber
00:24:11
ocurrido que te genere la number
00:24:13
formar exceptio, porque el throw
00:24:16
que se ha lanzado es este
00:24:17
porque la condición que fue true es esta
00:24:19
pero en otro momento dado, esta misma
00:24:21
sentencia puede que te lance otro throw
00:24:24
porque no entró por este if
00:24:26
sino que entró por otro, y tenía otro throw
00:24:27
a eso me refiero
00:24:29
que a todos casi tienen
00:24:31
tanto, pero tienen
00:24:33
sí, pero
00:24:34
piensa que aquí no tienes por qué tener solo una sentencia
00:24:40
puedes tener muchas
00:24:42
puedes tener muchas
00:24:43
lo que tú puedes es
00:24:45
¿Cuál ha sido? ¿Cuál de ellos posibles ha sido?
00:24:46
Entonces, claro, tú aquí
00:24:50
los cats que pongas
00:24:52
en este código de una o más
00:24:54
sentencias, se supone que en algún sitio
00:24:56
habrá un throw al menos
00:24:58
correspondiente a esto
00:25:00
si es tu pregunta, de hecho es que si no lo hay
00:25:01
el compilador te va a decir
00:25:04
uy
00:25:06
esta excepción no es posible
00:25:07
que se lance, o sea, como
00:25:10
en la máquina virtual, el compilador
00:25:11
tiene acceso al código
00:25:14
si tú pones aquí una sentencia
00:25:15
que ese throw no lo tiene en ningún sitio
00:25:17
te va a decir
00:25:20
esta excepción es imposible
00:25:21
que la puedas lanzar, es imposible
00:25:24
¿vale? entonces en alguna
00:25:26
de las ramas del next in
00:25:28
tendrá que haber un throw
00:25:29
correspondiente a esta y a esta
00:25:32
y a esta, todas las que tú pongas ahí
00:25:34
¿vale? pero cada throw te lanza una sola
00:25:35
otra cosa es que dentro de este código
00:25:38
que puede ser de una o muchas
00:25:40
pues hay un montón de throws en diferentes sitios
00:25:42
en función de los if
00:25:44
en función de los if
00:25:45
¿vale?
00:25:47
pues sería el multicatch
00:25:49
que se puede poner también
00:25:50
desde cierta versión
00:25:52
pues como or
00:25:54
pero bueno
00:25:55
eso cuando hagamos un ejemplo
00:25:55
lo podemos ver
00:25:56
pues numbers for exception
00:25:57
o null pointer exception
00:25:58
o
00:26:00
y así se pone un único catch
00:26:00
tan largo
00:26:01
también se puede poner
00:26:02
y ya por último
00:26:03
porque debe estar a
00:26:05
a no
00:26:06
son las 11 todavía
00:26:07
vale
00:26:08
para cerrar un poco
00:26:10
esto de
00:26:11
la sintaxis del try catch
00:26:12
el try-catch puede finalizar
00:26:14
opcionalmente
00:26:16
si uno quiere, no es obligatorio
00:26:17
con una cláusula
00:26:20
que se llama la final
00:26:22
después de los try-catch
00:26:23
si uno quiere puede poner el
00:26:28
final y ya ves
00:26:30
otra vez que es
00:26:32
una especie de epilo
00:26:34
lo que tú quieres que se haga
00:26:36
tanto si
00:26:38
ejecutó el try
00:26:40
porque no hubo excepciones, como si
00:26:41
ejecutó cualquiera de los catch.
00:26:44
Es una especie de epílogo, que sería,
00:26:46
intenta hacer esto, que funciona, fenomenal,
00:26:48
que no funciona, ejecuta el catch que toque.
00:26:52
Y ahora, en cualquiera de esas opciones,
00:26:55
para terminar, ejecuta el final.
00:26:57
Entonces es, por ejemplo,
00:27:03
cuando se abre un recurso, un fichero,
00:27:05
se abre una tubería, se abre un hilo, cualquier cosa,
00:27:08
que son recursos que luego hay que cerrar
00:27:11
esos recursos hay que cerrarlos siempre
00:27:14
haya funcionado la lectura
00:27:16
sobre ellos o no haya funcionado
00:27:18
entonces a la estructura típica
00:27:20
pues en el finally poner sentencias de cierre
00:27:21
de recursos, porque esos recursos
00:27:24
a los que has querido acceder
00:27:26
los vas a cerrar
00:27:28
bien si los has usado con éxito
00:27:29
o aunque no los hayas usado con éxito porque han cascado
00:27:32
en cualquier caso los quieres cerrar
00:27:34
pues las sentencias de cerrado
00:27:36
se podrían poner aquí, es el ejemplo más habitual
00:27:38
en el cual un finally viene bien
00:27:40
pero no es obligatorio ponerlo
00:27:42
uno podría poner esos cerrados tanto aquí como aquí
00:27:44
los tendría que duplicar en todas partes
00:27:46
pues para evitar duplicarlos en todas partes
00:27:48
te haces un finally y lo pones solo aquí
00:27:51
¿vale?
00:27:52
entonces uno usa esta cláusula
00:27:55
final si quiere y si no, no
00:27:56
vale, ya por último, antes de irnos
00:27:58
aquí como en
00:28:03
cualquier
00:28:05
conjunto de clases
00:28:06
que ya están hechas en Java
00:28:09
existe una estructura
00:28:10
jerárquica por detrás
00:28:13
en las colecciones ya la hemos visto
00:28:14
clases de colección hay un montón
00:28:16
los tricet, los linked list
00:28:19
los hash map
00:28:21
hay un montón
00:28:23
y todas están en una jerarquía
00:28:25
de clases, las de colecciones
00:28:27
heredan todas de iterable
00:28:29
de colección, luego las de list
00:28:30
hay una jerarquía
00:28:33
perdón
00:28:34
No te entiendo
00:28:37
A ver, todas heredan de object en cualquier caso
00:28:42
Entonces
00:28:44
Las clases excepción
00:28:46
IOSception, FileNotFoundException
00:28:48
NumberFormatException, son clases excepción que ya están hechas
00:28:50
Y todas
00:28:53
Heredan de
00:28:54
De object por supuesto, porque todas heredan de object
00:28:56
Pero luego de object a su vez
00:28:58
Hay una que se llama
00:29:00
Probable, que es una
00:29:02
Clase abstracta, una interfaz
00:29:03
throwable, que significa
00:29:05
pues lanzable, porque las excepciones
00:29:07
son lanzables
00:29:09
bueno, pues de throwable hereda ya
00:29:10
exception
00:29:13
y error
00:29:16
que luego mencionamos que es error
00:29:19
pero es muy parecido
00:29:22
exception es la superclase de todas
00:29:23
las excepciones, es la superclase de todas
00:29:27
es como
00:29:29
collection, que es la superclase de todas
00:29:30
las colecciones, pues exception
00:29:33
es la superclase de todas
00:29:35
exception a su vez
00:29:36
tiene una heredera
00:29:38
que es runtime exception
00:29:40
y otra
00:29:41
que, ah no, perdón, bueno, tenemos que ver
00:29:46
el cuadro, ¿vale? porque exactamente
00:29:49
yo creo que runtime exception hereda
00:29:51
de throwable directamente
00:29:53
pero vamos, lo que quiero decir
00:29:54
¿vale?
00:29:57
lo que quiero decir es que todas las excepciones
00:29:59
que ya están hechas
00:30:01
están en una jerarquía de clases
00:30:02
y en última instancia
00:30:05
heredan todas
00:30:07
de throwable
00:30:08
en última instancia eran todas de throwable
00:30:10
y luego algunas heredan de exception
00:30:11
otras heredan de runtime exception
00:30:13
que ahora veremos la diferencia
00:30:15
¿vale? entonces
00:30:17
¿qué quiero decir?
00:30:19
que este tricats tiene en cuenta
00:30:22
esa estructura jerárquica
00:30:23
y por ejemplo
00:30:25
imaginaos que yo aquí pongo
00:30:27
esto
00:30:29
exception, que es una clase más
00:30:31
es una clase más de la jerarquía
00:30:35
aunque sea una superclase
00:30:37
abstracta, es una clase más
00:30:39
pues como ya conocemos cómo funciona la herencia
00:30:40
si yo pongo aquí
00:30:43
exception, aquí se lanza
00:30:45
la excepción
00:30:47
imaginemos, number format exception
00:30:48
la máquina virtual
00:30:51
iría uno por una, diría number format exception
00:30:53
es esta
00:30:55
pues sí, porque como ya
00:30:57
sabéis, un objeto
00:30:59
pertenece tanto a su clase
00:31:01
como a cualquiera de las superclases
00:31:03
que están por encima de su clase
00:31:05
con lo cual un number
00:31:07
formal exception es number
00:31:09
formal exception pero también es exception
00:31:11
porque es super clase
00:31:13
de ella y todas las clases de exception
00:31:15
heredan de esta en última instancia
00:31:17
entonces este try-catch
00:31:18
los catch a partir de aquí
00:31:25
ya estarían de más
00:31:27
porque sea cual sea la excepción
00:31:29
que se genere, todas van a caer en este
00:31:31
me da igual que sea null
00:31:33
pointer exception, que sea todas porque como son herederas
00:31:35
de estas, de hecho si
00:31:37
escribimos esto, luego
00:31:39
lo escribimos, el compilador me dirá, oye, nunca
00:31:41
vas a llegar a este catch, claro
00:31:43
que nunca vas a llegar, porque es que, aunque
00:31:45
sea null point de excepción la que te
00:31:47
genere, esa ya va a
00:31:49
casar aquí, ya va a casar aquí, porque
00:31:51
aquí van a casar todas las que den de
00:31:53
excepción, todas.
00:31:55
Entonces, esto, cuando
00:31:57
uno quiere capturar, quiere hacer un
00:31:59
código súper mega potente
00:32:01
que no se pare nunca,
00:32:03
se hace un try-catch de excepción
00:32:05
y sea cual sea la excepción que se genere,
00:32:06
cualquiera, incluso la que él ni sabía
00:32:08
que existía y que se puede generar
00:32:11
porque no podemos, hay métodos
00:32:13
que hombre, meternos en ellos
00:32:15
para ver todas las posibilidades que pueda generar
00:32:17
es muy complejo, entonces nosotros podemos
00:32:19
de este, pues yo
00:32:21
puedo recordar que me puede generar
00:32:23
la number former exception
00:32:25
pero a lo mejor también hay otra que me pueda generar
00:32:26
que yo la desconozco, que me la genera
00:32:29
cuando pasa algo muy raro, cuando llueve
00:32:31
pues cuando llueve me la genera, no puedo
00:32:33
saberlas todas, entonces
00:32:35
si me hago un catch exception
00:32:37
en ese sentido es el código más robusto
00:32:38
del mundo, porque pase
00:32:41
lo que pase, vayamos al
00:32:43
throw que vayamos, sea el throw
00:32:45
porque llueve exception, sea el throw
00:32:47
porque no me apetece exception, sea el throw
00:32:49
que sea, da igual
00:32:51
va a caer en este catch, va a caer
00:32:53
luego el programa nunca
00:32:55
se va a parar jamás, porque va a estar
00:32:57
capturada cualquier excepción, porque cualquiera
00:32:59
es heredera de exception, cualquiera
00:33:01
entonces, esta sería
00:33:03
la forma más cómoda
00:33:05
de hacer un programa que no se va a parar nunca.
00:33:07
Nunca se va a detener.
00:33:10
Nunca se va a dejar al usuario ahí parado.
00:33:11
En ese sentido, muy robusto.
00:33:14
Pero, hombre, muy poco amigable.
00:33:16
Porque yo aquí en el cache no puedo dar ninguna explicación
00:33:20
porque no tengo ni idea de qué ha pasado.
00:33:23
Si yo voy separando excepción por excepción,
00:33:25
puedo decirle al usuario,
00:33:27
lo siento, pero has metido una cadena mala aquí.
00:33:29
Lo siento, pero no has instanciado el objeto escáner o lo que sea.
00:33:31
Lo siento, pero no sé qué.
00:33:34
puedo distinguir en cada catch
00:33:35
lo que ha pasado y darle explicaciones
00:33:37
pero
00:33:39
si yo lo capturo todo en un único catch
00:33:41
el programa no se va a parar
00:33:43
pero no tengo manera de programar aquí
00:33:44
decirle oye lo que ha pasado, porque yo aquí
00:33:47
no sé qué habrá pasado
00:33:49
sé que voy a saltar cuando se haga una excepción
00:33:51
pero a saber cuál habrá saltado
00:33:53
no tengo ni idea
00:33:55
entonces es un programa que no se para nunca
00:33:56
pero
00:33:59
poco útil
00:34:00
en ese sentido
00:34:03
poco útil porque
00:34:04
puede seguir, va a seguir
00:34:05
pero puede seguir funcionando mal
00:34:08
porque yo no sé qué ha pasado
00:34:11
no sé qué ha pasado para que fuéramos al catch
00:34:12
y por tanto no he podido arreglarlo de forma
00:34:15
personalizada, no he podido arreglarlo de forma personalizada
00:34:17
¿vale?
00:34:19
pero bueno, lo que nos importa
00:34:23
ahora mismo de todo esto que estoy diciendo es
00:34:24
que las clases que ya están hechas en
00:34:27
Javel y las que nos aprovechamos nosotros
00:34:29
todas están diseñadas
00:34:31
en una estructura de superclases
00:34:33
y subclases, porque eso facilita
00:34:35
su uso, y lo estamos
00:34:37
viendo continuamente, lo hemos visto en las colecciones
00:34:39
y aquí también lo vemos
00:34:41
si yo quiero capturar un montón de clases de golpe
00:34:42
pues pongo la superclase y ya está
00:34:45
¿vale? gracias
00:34:47
a esa ventaja de la herencia
00:34:49
que si hay una estructura de superclase
00:34:50
y subclase, todos los
00:34:53
objetos de las subclases caen
00:34:55
en las referencias suyas
00:34:57
propias, pero también encajan
00:34:59
en las de las superclases
00:35:01
y esa tontería
00:35:02
que un objeto encaje
00:35:04
en su clase y encaje
00:35:06
en cualquiera de sus superclases
00:35:08
esa tontería
00:35:10
es lo que permite que la aprobación de todos los objetos
00:35:11
sea potente
00:35:14
porque es mucho más fácil el desarrollo de código
00:35:15
solamente ese detalle
00:35:18
esa es en realidad
00:35:20
el invento de la aprobación de todos los objetos
00:35:21
la herencia, es el verdadero invento
00:35:24
¿vale? y como a través
00:35:27
de esa herencia podemos reutilizar
00:35:28
y podemos hacer códigos mucho más sencillos
00:35:30
bueno, pues en cuanto a try-catch
00:35:33
lo podemos dejar aquí y nada más
00:35:35
y ya a la vuelta del recreo
00:35:37
pues ya vemos cómo hacer nuestras propias excepciones
00:35:41
y damos algún ejemplo
00:35:43
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 9
- Fecha:
- 8 de abril de 2024 - 19:31
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 35′ 51″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 1.11