Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 05-04-24 - 2 - 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:
Venga, pues vamos a seguir con lo siguiente que vamos a ver
00:00:00
Venga, relax
00:00:05
Bueno, pues a ver, ¿qué es esto de las excepciones?
00:00:08
Vale, bueno, hasta ahora ya no suenan
00:00:25
No suenan porque a veces no las hemos encontrado
00:00:29
Entonces, para nosotros, ahora mismo, hasta ahora, ¿qué es una excepción?
00:00:32
Una excepción es algo que ha aparecido de repente, no sabemos ni de dónde ha salido,
00:00:39
se supone que resulta de una sentencia que no ha funcionado correctamente y ha parado el programa.
00:00:46
Esa es nuestra experiencia hasta ahora con las excepciones.
00:00:53
Por ejemplo, pues nos la hemos encontrado en una situación como esta.
00:00:56
Por ejemplo, imaginaos que tenemos esto, un programa que tiene esto escrito
00:01:00
y ahora por ejemplo
00:01:08
imaginaos que tenemos esto aquí
00:01:11
bueno, pues imaginaos que tenemos
00:01:12
un código
00:01:20
con dos líneas de código que
00:01:21
tienen esto
00:01:24
entonces nosotros ya sabemos que pasa
00:01:25
cuando la máquina virtual se ponga a ejecutar
00:01:27
esto, cuando ya estamos en tiempo de ejecución
00:01:30
hace esta línea
00:01:32
y cuando va a hacer esta ya hemos visto
00:01:34
lo que pasa, ya hemos visto lo que pasa
00:01:36
que de repente
00:01:38
han salido una línea roja
00:01:39
ahí, en la consola
00:01:42
han salido una línea roja
00:01:44
donde ha aparecido
00:01:45
escrito algo como esto
00:01:48
¿vale?
00:01:50
ha aparecido escrito algo como eso
00:01:56
y además
00:01:58
el programa se ha detenido
00:01:59
todas las sentencias
00:02:02
que hubiera a partir de aquí
00:02:04
ya no se han ejecutado
00:02:06
porque el programa se ha parado
00:02:08
¿vale?
00:02:10
esta es nuestra experiencia hasta ahora
00:02:11
en tiempo de ejecución
00:02:14
con las excepciones
00:02:17
nos ha pasado también, pues a lo mejor
00:02:17
imaginaos que tenemos un código así
00:02:20
y de repente
00:02:22
tenemos a lo mejor esta línea
00:02:28
tenemos un código con estas líneas
00:02:30
bueno, pues la máquina virtual
00:02:34
ha hecho esta sentencia, muy bien
00:02:36
ahora se ha puesto a hacer esta, que implica
00:02:38
una división, ¿y qué nos ha pasado?
00:02:40
pues que de nuevo
00:02:43
han aparecido, una letra roja por ahí
00:02:44
donde ponía
00:02:46
algo como esto
00:02:48
y el programa además se ha parado
00:02:49
y todo lo que hubiera a continuación
00:02:59
ha dejado de ocurrir, esto es más o menos
00:03:00
lo que nos hemos encontrado
00:03:03
nosotros hasta ahora relacionado
00:03:04
con el término excepción
00:03:06
relacionado con el término excepción
00:03:08
bueno, pues la idea es que ahora entendamos
00:03:09
qué es una excepción y cómo usarlas
00:03:12
cómo utilizarlas
00:03:15
dentro de nuestros desarrollos
00:03:16
porque son una herramienta más
00:03:18
para hacer nuestros desarrollos, son una herramienta más
00:03:20
no son sólo algo que aparece
00:03:23
cuando hemos hecho algo mal
00:03:24
y que tenemos entonces que irnos
00:03:26
al código a cambiarlo para que no aparezca
00:03:29
no son sólo eso
00:03:30
hasta ahora sí han sido sólo eso para nosotros
00:03:32
algo que cuando ya estábamos
00:03:35
en tiempo de ejecución
00:03:37
aparecía y decíamos
00:03:38
uy, he hecho algo mal en el código
00:03:40
pues voy a entrar a cambiarlo
00:03:42
porque he hecho algo mal
00:03:45
hasta ahora es lo único que ha sido para todas las excepciones
00:03:46
pero repito, son más que eso, son una herramienta
00:03:49
más grande que podemos usar
00:03:51
dentro de nuestros desarrollos
00:03:53
para comunicar
00:03:55
cosas
00:03:57
que eso es justo lo que nos está pasando aquí
00:03:58
lo que nos está haciendo
00:04:01
Java aquí
00:04:03
es comunicarnos cosas
00:04:05
nos está comunicando, cállate
00:04:06
nos está comunicando, ojo
00:04:09
que estás dividiendo por cero
00:04:11
ojo que estás accediendo
00:04:12
a un objeto que es null
00:04:15
nos está comunicando cosas, nos está dando información.
00:04:17
Pues nosotros también podemos usar las excepciones
00:04:20
y hacer nuestras propias excepciones para comunicar cosas.
00:04:22
Cuando hacemos nosotros métodos,
00:04:27
podemos usar excepciones nuestras que creamos
00:04:29
y que nos inventamos para comunicar cosas.
00:04:33
Y para eso sirve.
00:04:35
Las excepciones son un mecanismo que tiene el software
00:04:37
para comunicar cosas que están pasando.
00:04:39
Eso es lo que es una excepción.
00:04:42
En realidad es eso.
00:04:45
es un mecanismo
00:04:46
un mecanismo, una herramienta más
00:04:51
de código, un mecanismo
00:04:53
para comunicar
00:04:55
cosas que están pasando
00:05:01
durante la ejecución de un código
00:05:03
eso es en general las excepciones
00:05:05
un mecanismo que tenemos que aprender a utilizar
00:05:27
para comunicar cosas
00:05:29
que pasan durante la ejecución de un código
00:05:30
vale, lo que pasa
00:05:33
es que las excepciones en particular
00:05:35
las cosas que comunican
00:05:36
son cosas que están pasando
00:05:38
mal, son cosas malas
00:05:41
para eso sirven, son una herramienta
00:05:43
para comunicar cosas malas que están
00:05:45
pasando, cosas que no deberían
00:05:47
¿vale? entonces estas
00:05:48
cosas que comunican las excepciones
00:05:51
pues están especializadas
00:05:53
sirven para comunicar
00:05:55
cosas que no deberían pasar
00:05:57
nos informan
00:05:59
oye, está pasando esto y no debería
00:06:01
¿vale? porque tenemos
00:06:03
otras herramientas para comunicar
00:06:10
cosas que no pasa nada
00:06:12
¿por qué pasa?
00:06:13
de hecho
00:06:15
es exactamente
00:06:16
lo mismo que he planteado antes
00:06:19
cuando explicaba el método replace
00:06:21
he dicho el replace
00:06:23
te devuelve un valor de retorno
00:06:24
ese valor de retorno
00:06:26
te sirve para verificar
00:06:28
si encontró el código o si no lo encontró
00:06:31
entonces mediante ese valor de retorno
00:06:33
también nos están informando
00:06:36
de cosas
00:06:37
pero eso que nos informan no tiene nada que ver con que
00:06:38
haya ocurrido algo que no tenga que ocurrir
00:06:41
No, el replace dice que existe, sustituyo, que no existe, no sustituyo, pero es un funcionamiento completamente normal, eso no significa que haya ocurrido algo fuera de control, entonces yo no lo comunico con una excepción, lo comunico con un valor de retorno, ¿vale?
00:06:43
bueno, pues las excepciones son una forma
00:07:02
de comunicar cosas
00:07:04
que no deberían ocurrir
00:07:06
nos alertan de cosas
00:07:09
que no deberían ocurrir
00:07:10
por eso, las excepciones
00:07:11
cuando aparecen, y ahora veremos
00:07:14
cómo aparecen, no es que aparezcan de la nada
00:07:16
no es que el ordenador se las saque de la manga
00:07:18
ahora veremos cómo aparecen
00:07:20
pues las excepciones cuando aparecen
00:07:22
además
00:07:25
además
00:07:27
paran la ejecución del código
00:07:28
detienen la máquina virtual
00:07:30
Entonces, esa es otra de sus particularidades. Cuando la excepción aparece, la máquina virtual detiene la ejecución del código, porque asume que eso que ha ocurrido no debería. Entonces, es importante, cuando la excepción aparece, además se detiene la ejecución del código, ¿vale?
00:07:32
entonces además
00:07:51
después de aparecer la excepción
00:07:55
la máquina virtual
00:07:57
que es
00:07:59
la que está interpretando las sentencias
00:08:01
la que está ejecutando las sentencias
00:08:03
ya sabéis que es la máquina virtual que va sentencia
00:08:05
por sentencia ejecutando
00:08:07
pues como resultado de ejecutar
00:08:09
una, si como resultado de ejecutar
00:08:11
una aparece esto
00:08:13
pues la máquina
00:08:15
virtual para
00:08:17
la máquina virtual para el código,
00:08:18
para la ejecución.
00:08:22
Y repito, precisamente por eso,
00:08:25
porque lo que nos comunican las excepciones
00:08:27
se supone que es algo que no debería ocurrir.
00:08:29
Por eso la máquina virtual para la ejecución.
00:08:31
Aún así, ya sabemos que tenemos una manera
00:08:35
de evitar que la máquina virtual
00:08:39
pare la ejecución,
00:08:42
aunque haya salido una de estas.
00:08:44
Porque eso también lo hemos usado.
00:08:46
¿vale? es la otra cosa
00:08:48
con la que también hemos
00:08:50
trabajado relacionada con excepciones
00:08:52
¿vale? es decir
00:08:54
relacionada con excepciones
00:08:56
ya estamos familiarizados con que aparezcan
00:08:57
cuando hacemos algo raro
00:09:01
como esto
00:09:02
como esto, ya estamos familiarizados
00:09:04
con que aparezcan y también ya
00:09:06
hemos visto alguna vez
00:09:08
que podemos evitar que el código se pare
00:09:09
aunque aparezca
00:09:12
entonces si nosotros no hacemos nada
00:09:14
y ponemos las sentencias tal cual
00:09:16
ya hemos verificado
00:09:18
porque nos ha pasado muchas veces
00:09:20
que el código se va a detener
00:09:21
eso es como funciona por defecto
00:09:22
pero si queremos evitar que la máquina virtual
00:09:25
pare la ejecución
00:09:28
ya sabemos que tenemos un truco
00:09:29
una herramienta de código para evitarlo
00:09:33
¿qué truco hemos usado
00:09:36
a veces para eso?
00:09:38
¿qué os suena?
00:09:39
para evitar que la máquina virtual pare la ejecución
00:09:41
cuando hay una excepción
00:09:43
¿os suena?
00:09:44
try cut
00:09:47
es decir
00:09:48
es decir, este código
00:09:50
este código tal cual está
00:09:57
con estas dos sentencias
00:10:01
aquí no hay tutía
00:10:03
cuando la máquina virtual se ponga a ejecutar
00:10:05
este código, va a salir
00:10:07
el null pointer exception
00:10:09
va a salir
00:10:11
y no solo va a salir el null pointer exception
00:10:14
sino que la ejecución
00:10:17
se va a parar
00:10:19
y se acabó
00:10:20
lo que viniera después no se va a ejecutar
00:10:22
porque se ha parado, está claro
00:10:25
con ese código así no hay alternativa
00:10:26
esto es lo que va a pasar
00:10:29
null pointer exception y la ejecución detenida
00:10:30
vale
00:10:33
que queremos impedir que la ejecución
00:10:34
se detenga
00:10:37
aunque haya salido la excepción
00:10:38
porque va a salir, eso sí que no puedo evitarlo con este código
00:10:40
si aquí tengo null y aquí a un objeto null
00:10:43
accedo a sus propiedades
00:10:45
no va a salir null pointer exception
00:10:47
bueno, pues si quiero evitar que se detenga la ejecución
00:10:48
aunque la excepción me salga, si quiere evitarlo
00:10:51
¿qué podemos hacer?
00:10:54
pues la sentencia
00:10:56
que creemos que va a provocar
00:10:57
ese problema, la que creemos
00:11:00
que puede provocarlo, la peligrosa
00:11:02
la metemos en un bloque
00:11:04
así, la metemos
00:11:06
entre llaves, en un bloque con un tray delante
00:11:08
y entonces le decimos
00:11:10
oye, inténtala
00:11:12
inténtala
00:11:14
que te sale
00:11:15
magnífico, la haces
00:11:17
y sigues con el código que venga debajo.
00:11:20
Que no te sale, porque te sale una excepción.
00:11:23
Pues entonces te metes aquí.
00:11:27
Es como si fuera un if-else, pero adaptado a excepciones.
00:11:29
Entonces, el try-catch tiene este formato.
00:11:34
Try, entre llaves, la o las sentencias,
00:11:37
aquí puede haber muchas, no tiene por qué haber una.
00:11:40
Entre llaves, el código que nos preocupa.
00:11:42
El código que creemos que puede que dé excepción
00:11:45
y por tanto pararse el programa.
00:11:48
hay el código que nos preocupa
00:11:50
y ahora catch
00:11:52
y aquí tenemos que escribir
00:11:53
la excepción que creemos que va a salir
00:11:54
¿vale?
00:11:57
esto con pequeños matices
00:12:00
que ya incorporaremos cuando tengamos más
00:12:01
entonces yo aquí creo que
00:12:04
puede que salga null pointer exception
00:12:05
por ejemplo
00:12:07
bueno, pues entonces tenemos que poner el catch
00:12:11
y entre paréntesis
00:12:18
como si pusiéramos la declaración
00:12:20
de un objeto
00:12:22
de un objeto
00:12:23
que pertenece a una clase
00:12:25
excepción con ese nombre
00:12:28
ahora nos meteremos más
00:12:29
nos meteremos más en
00:12:35
estos nombres
00:12:36
estos nombres de clase, nos meteremos más
00:12:38
ahora mismo lo que estoy simplemente poniendo es
00:12:41
cómo se hace un try-catch
00:12:43
bueno, pues un try-catch
00:12:44
básico se hace así
00:12:54
ya lo hemos usado en algún momento
00:12:56
cuando hacíamos la clase teclado
00:12:58
para evitar
00:12:59
tener que poner el throws, etc.
00:13:00
Lo usamos porque lo habíamos necesitado, pero todavía no teníamos muy claro por qué lo usábamos.
00:13:03
Bueno, pues ¿para qué lo usamos?
00:13:10
Para evitar que un código, en caso de generar excepción de algún tipo, pare la ejecución.
00:13:12
Si plantamos un try-catch, estas sentencias se ejecutan.
00:13:20
Y en caso de que salga la excepción que está en el catch, si sale la que está en el catch,
00:13:24
entonces la máquina virtual lo que hace es
00:13:29
se va aquí
00:13:32
y ejecuta lo que yo ponga ahí
00:13:33
lo que me dé la gana, como si pongo ahí mis líneas
00:13:35
hombre, no es la idea, porque si
00:13:38
yo he venido aquí al catch
00:13:39
es porque algo ha ido mal, si algo ha ido mal
00:13:41
lo más que querré hacer será
00:13:44
avisar y ya está
00:13:46
¿vale? pero ahí uno puede poner lo que quiera
00:13:47
es un bloque más de código
00:13:49
bueno, pues solamente incorporando el try catch
00:13:50
ya, la excepción sale igualmente
00:13:54
eso no lo hemos cambiado
00:13:56
porque si yo hago n.nombre
00:13:57
es que va a salir la excepción, pero
00:13:59
la máquina virtual ya no para el programa
00:14:01
y esto continúa por aquí tan tranquilo
00:14:02
¿vale? continúa por ahí y ya está
00:14:05
y además
00:14:07
se ejecuta lo que haya aquí dentro
00:14:09
que normalmente pues será
00:14:11
un aviso
00:14:13
una escritura
00:14:14
de archivo de logs para indicar
00:14:17
ha habido error de no sé qué, lo que sea
00:14:19
bueno, pues en resumen
00:14:21
una excepción es algo que se
00:14:25
genera, ahora veremos
00:14:28
como consecuencia de
00:14:30
la ejecución de una sentencia
00:14:32
de código que ha salido mal.
00:14:34
Que ha salido mal.
00:14:36
Entonces, como una sentencia de código
00:14:37
ha salido mal, pues la excepción
00:14:39
aparece.
00:14:42
Que está capturada
00:14:43
o lo que es lo mismo, que está dentro de un
00:14:45
try-catch, porque
00:14:47
estar dentro de un try-catch significa estar
00:14:49
capturada. Que está
00:14:51
capturada, que está dentro de un bloque try-catch,
00:14:53
no pasa nada.
00:14:56
La máquina virtual salta
00:14:58
automáticamente al catch
00:14:59
hace lo que tenga que hacer y continúa
00:15:01
el programa y no se para
00:15:03
entonces, eso hace que
00:15:05
sí, uy, gracias
00:15:07
eso hace
00:15:09
que el programa sea más robusto
00:15:13
porque no se para por cualquier tontería
00:15:16
pero claro, cuidado
00:15:17
porque ha habido un problema, entonces el resto
00:15:19
del programa tiene que estar
00:15:21
hecho de tal manera
00:15:23
que no arrastre estas complicaciones
00:15:24
claro, pero eso ya es tema del programador
00:15:27
de lo que esté haciendo
00:15:30
bueno, pues entonces
00:15:30
eso es una excepción, una forma de avisar
00:15:33
de que algo ha ido mal
00:15:36
y ahora ya la pregunta siguiente
00:15:37
sería, pero ¿de dónde sale?
00:15:40
¿cómo es que aparece?
00:15:42
yo sé que si tecleo esta línea
00:15:43
y la ejecuto, me salen palabras rojas
00:15:46
pero no sabemos más
00:15:48
no sabemos qué es lo que ha pasado ahí debajo
00:15:50
si ha salido un enano escribiendo
00:15:52
en el redal roja, qué es lo que ha salido ahí
00:15:54
no tenemos ni idea de cuál es el origen de eso,
00:15:55
que se ha desencadenado.
00:15:57
Bueno, eso es lo que tenemos que entender ahora.
00:15:59
Bueno, pues entonces, silencio.
00:16:05
Bueno, algunas excepciones ya nos suenan,
00:16:11
porque nos las hemos encontrado a veces.
00:16:16
Null pointer exception ya nos suena.
00:16:19
Sabemos que nos aparece cuando un objeto que es null,
00:16:21
un objeto que es null,
00:16:24
tratamos de acceder
00:16:26
o a propiedades o a métodos con el punto
00:16:28
como tratemos de acceder
00:16:30
al contenido o al comportamiento
00:16:32
con métodos de un objeto que es null
00:16:35
ya sabemos que esta nos sale
00:16:36
nos han salido más
00:16:38
nos han salido la divide by 0
00:16:40
esa excepción que he escrito antes
00:16:42
que nos ha salido cuando hemos tratado
00:16:45
de hacer una división por 0
00:16:46
pero nos han salido más
00:16:48
nos ha salido
00:16:50
esta también nos ha salido
00:16:51
esta excepción nos salía
00:17:04
cuando recorríamos un array
00:17:06
cuando tratábamos de acceder a una posición
00:17:08
que el array no tenía
00:17:11
el array tenía tres posiciones
00:17:13
y debíamos acceder a las siete
00:17:15
pues nos salía array index bound exception
00:17:16
también nos ha salido la string
00:17:18
index out of bound exception
00:17:21
cuando tratábamos de acceder a posiciones
00:17:22
de un string en las que no había tampoco
00:17:25
caracteres
00:17:27
bueno pues
00:17:28
nombrecitos de estos ya nos suenan
00:17:29
ya no suenan nombres de esos
00:17:32
bueno, pues esos nombres de dónde salen
00:17:34
estos nombres en realidad
00:17:36
son nombres de clases de Java
00:17:38
que ya están hechas
00:17:41
es decir
00:17:42
cada posible cosa rara
00:17:50
que puede ocurrir, cada posible cosa rara
00:17:52
dividir por cero
00:17:54
salirte de un array
00:17:55
acceder a un objeto nulo
00:17:57
acceder de forma concurrente a un recurso
00:17:59
que también nos ha salido el concurrent modification exception
00:18:02
nos salió con el for each y las colecciones
00:18:04
pues cada cosa rara
00:18:06
que puede ocurrir
00:18:08
tiene una clase declarada
00:18:10
asociada, tiene una clase
00:18:12
declarada
00:18:14
conclusión, tenemos
00:18:15
en la máquina virtual de Java, en la librería que tiene dentro
00:18:18
tropecientan mil clases de estas
00:18:21
tropecientan mil
00:18:23
una por cada cosa rara
00:18:24
que puede ocurrir, tropecientan mil
00:18:26
si las
00:18:29
miramos por aquí
00:18:31
a ver
00:18:39
bueno, a ver
00:18:40
vale, pues
00:19:38
la máquina virtual de Java
00:19:42
ya sabéis que incorpora
00:19:45
un montón de paquetes
00:19:47
tropecientos mil
00:19:49
tropecientos, estos son sólo los de
00:19:50
el JAR Java base
00:19:55
de ahí, pero aparte del JAR Java base
00:19:57
pues está este JAR
00:19:59
está este, o sea, hay tropecientos
00:20:00
donde
00:20:03
cada jar tiene un montón
00:20:04
de paquetes
00:20:06
y cada paquete, si uno se pone
00:20:07
a cotillear, se va a encontrar en cada
00:20:10
uno de ellos distribuido
00:20:12
clases que acaban con la palabra
00:20:14
excepción. Bueno, pues
00:20:16
las clases que representan cosas
00:20:18
raras que pueden ocurrir
00:20:20
por convenio, para
00:20:21
enterarnos todos y entendernos todos, tienen
00:20:24
el nombrecito que tengan
00:20:26
y acaban en excepción.
00:20:27
Entonces, esto en particular será
00:20:30
excepción de tipo NTLM
00:20:32
que vete a saber a qué se refieren las siglas estas
00:20:34
algo de seguridad de NTLM, yo que sé
00:20:36
aquí que lo entendemos mejor
00:20:38
pues por ejemplo
00:20:42
en este paquete están las clases relacionadas
00:20:43
con entrada y salida archivos
00:20:46
pues aquí nos encontramos muchas
00:20:48
que acaban en excepción
00:20:50
pues por ejemplo
00:20:51
esta
00:20:54
esto es
00:20:55
excepción de que has llegado
00:20:57
a fin de archivo, una cosa rara que te ha ocurrido
00:21:00
has llegado a fin de archivo, estás tratando de leer.
00:21:02
No puedo, has llegado al final.
00:21:04
Esta es una clase excepción programada
00:21:06
para esa situación.
00:21:08
Aquí abajo, pues tenemos otra.
00:21:10
Esta es una excepción programada
00:21:13
para la situación, el fichero no existe.
00:21:14
Al que tratas de acceder no existe.
00:21:17
Quiero decir,
00:21:20
hay tropecientas
00:21:22
clases excepción ya hechas,
00:21:23
tropecientas hechas, que están
00:21:25
asociadas a cosas raras que pueden ocurrir.
00:21:27
¿Vale? Ya nos hemos encontrado,
00:21:29
repito, el array inDesbound,
00:21:31
el pointer exception, etc.
00:21:33
Bueno, pues esas clases
00:21:35
de esas clases se instancian objetos
00:21:37
de esas clases
00:21:41
y esos objetos son los que aparecen
00:21:43
cuando ha ocurrido
00:21:45
alguna de esas cosas raras.
00:21:47
Así es como funciona esto.
00:21:49
Por ejemplo, a ver
00:21:52
ahí he cerrado esto, mierda.
00:21:53
Vale, pues a ver
00:22:31
vamos por ejemplo
00:22:32
a abrir la clase string
00:22:35
que la clase string
00:22:37
alguno de los métodos que tiene
00:22:39
alguno de los métodos tendrá contemplado
00:22:40
que si hace algo raro avise con alguna excepción
00:22:43
pues vamos a mirar
00:22:45
cómo está avisando
00:22:47
cómo es eso de que se cree
00:22:48
el objeto, este que digo, que se crea
00:22:51
cuando pasa eso raro
00:22:53
aquí seguro que tengo una clase
00:22:54
string por algún lado
00:22:57
sí, no sé, lo que quiero es entrar en una clase de la máquina
00:22:58
Y entrar desde aquí, porque si entro desde el otro lado
00:23:04
Tarda mucho en abrirlo
00:23:06
Aquí, quiero entrar
00:23:07
Implementación de la clase string
00:23:10
Vale
00:23:12
Entonces
00:23:13
A ver si encuentro rápido
00:23:15
Un throw
00:23:21
Por ahí
00:23:26
Espera, vamos a buscar aquí
00:23:27
Control F
00:23:36
Vale, este método
00:23:37
Lanza
00:23:52
vale, pues por ejemplo
00:23:54
a ver, la clase string
00:24:06
tiene aquí un método
00:24:10
bueno, es que perdí antes el constructor
00:24:12
vamos a coger otro método cualquiera
00:24:14
que se entenderá mejor
00:24:17
throws este, por ejemplo
00:24:18
vale, pues por ejemplo
00:24:35
la clase string, que la clase string ya está hecha
00:24:50
la clase string ya está hecha
00:24:52
pues la clase string tiene métodos para hacer cosas
00:24:54
entonces
00:24:56
cuando nosotros llamamos a
00:24:58
por ejemplo a este método
00:25:00
checkIndex de la clase string
00:25:02
que habría que ver para qué es
00:25:04
pero bueno, es para
00:25:07
verificar algo del índice, dentro de la longitud
00:25:08
es lo de menos, cuando llamamos a este método
00:25:10
este método a su vez
00:25:13
se basa llamando
00:25:14
a este otro de esta clase
00:25:16
llama a este método
00:25:18
y fijaos que hace este método
00:25:20
pues este método cuando ocurre una cosa
00:25:22
que el index
00:25:25
es menor que 0
00:25:27
o mayor que la longitud
00:25:29
del string
00:25:31
silencio, ¿qué hace?
00:25:32
hace esto, que esto hasta ahora no nos lo habíamos
00:25:35
encontrado, no nos lo habíamos
00:25:36
encontrado, vale, pues
00:25:38
esta sentencia throw ¿qué hace?
00:25:40
esta sentencia throw
00:25:43
es la que hace que
00:25:44
aparezca una instancia
00:25:46
de un objeto de la excepción que yo he puesto
00:25:48
aquí, que aparezca
00:25:50
y en ese momento es cuando aparece la excepción.
00:25:52
Entonces la máquina virtual
00:25:55
cuando va ejecutando,
00:25:57
va ejecutando, va ejecutando y se encuentra
00:25:58
un throw. Se encuentra un throw
00:26:00
pues cuando se encuentra el throw
00:26:03
la máquina virtual dice, ojo,
00:26:04
apareció una excepción.
00:26:06
Apareció una excepción. Y en ese
00:26:08
momento es cuando
00:26:10
para la máquina virtual.
00:26:12
Para la ejecución.
00:26:14
Cuando la máquina virtual se encuentra un throw.
00:26:16
Entonces la sentencia
00:26:19
throw es la sentencia que hace
00:26:20
que aparezca un objeto de la
00:26:22
excepción correspondiente, que aparezca
00:26:24
y la máquina
00:26:27
virtual cuando llega a ella y dice
00:26:28
toca lanzar excepción
00:26:30
toca lanzarla
00:26:32
pues lanzar excepción ¿qué significa?
00:26:33
que la máquina virtual para el
00:26:37
programa a menos que tengamos un try catch
00:26:38
en esa sentencia
00:26:40
¿vale? bueno pues las
00:26:41
excepciones no es que aparezcan de la
00:26:44
nada, las excepciones
00:26:46
aparecen también porque alguien ha programado
00:26:48
que aparezcan.
00:26:50
Aparecen porque alguien ha programado que aparezcan
00:26:52
cuando ha visto que algo no le gusta.
00:26:54
Entonces, Java,
00:26:57
cuando hace lo de dividir,
00:26:59
cuando Java ve la esta de dividir,
00:27:00
a su vez salta un código
00:27:03
para hacer cosas.
00:27:04
Ese código tendrá un
00:27:06
si divisor igual a cero,
00:27:08
throw.
00:27:10
Luego las excepciones aparecen
00:27:12
porque están programadas, porque alguien las ha programado
00:27:13
cuando pasa algo que no gusta
00:27:16
aparece
00:27:18
cuando la máquina virtual
00:27:19
a respeto de la ejecución llega al throne
00:27:21
en ese momento es en el momento en el que
00:27:24
la excepción nace
00:27:26
y aparece
00:27:28
y a partir de ahí que pasa, lo que ya hemos visto
00:27:29
que no está capturada
00:27:32
con el try-catch, se detiene
00:27:34
que está capturada con el try-catch
00:27:36
se hace lo que hay en el catch
00:27:38
y se sigue, ¿vale?
00:27:40
luego ese es el momento en el que aparece
00:27:42
y ahí hay dos caminos
00:27:43
Bueno, pues nosotros también podemos jugar con este throw
00:27:45
Y hacer aparecer excepciones
00:27:49
Y pasan cosas que no nos gustan
00:27:51
¿Vale?
00:27:53
Por ejemplo
00:27:56
Vamos a
00:27:57
A ver
00:27:59
Muy rápidamente
00:28:02
Para irnos con la idea un poco entendida
00:28:05
Esto lo acabo de decir
00:28:07
Porque lo del throw se habrá hecho un poco raro
00:28:08
Muy así un poquito por encima
00:28:10
Para acabar de entenderlo y ya nos vamos
00:28:12
A ver
00:28:14
vamos a hacer un proyecto, ejemplo excepciones
00:28:16
vale, pues
00:28:18
bueno, voy a hacer un paquete
00:28:36
que siempre queda más bonito en un paquete, pero da igual
00:28:46
vale, pues vamos a
00:28:48
lanzar nosotros
00:28:50
una excepción como programadores
00:28:52
para avisar de que algo ha pasado
00:28:54
y así entendemos un poquito
00:28:56
cómo aparecen las excepciones
00:28:58
vamos a lanzar nosotros una
00:29:00
para ver cómo aparecen, hasta ahora nosotros nos hemos
00:29:01
encontrado que las lanzaba
00:29:04
código al que hemos llamado
00:29:06
cuando hemos llamado a código
00:29:08
nos hemos encontrado que la lanzaban
00:29:10
y ya he explicado yo
00:29:12
que es lo que ha ocurrido en realidad
00:29:14
que cuando hemos llamado a ese código, la máquina virtual ha entrado
00:29:15
se ha encontrado un throw
00:29:18
y entonces ha aparecido la excepción
00:29:19
pues vamos a hacer eso mismo nosotros
00:29:22
que nos hemos encontrado que alguien ya ha hecho
00:29:24
vamos a programarlo nosotros para entender un poco
00:29:25
como aparece
00:29:27
pues venga, vamos a hacer una clase
00:29:28
pues venga, yo que sé, main
00:29:30
y vamos a hacer un método
00:29:35
para que alguien nos llame
00:29:42
desde el main
00:29:44
pues venga, vamos a hacer aquí un
00:29:46
static void
00:29:49
método
00:29:52
al que le pasamos un numerito entero
00:29:54
y ya está
00:29:56
entonces este método
00:29:57
adiós
00:29:59
imagínate que tiene que hacer algo
00:30:02
sin acritud
00:30:04
que luego os enfadáis
00:30:05
que este método tiene que hacer algo con n
00:30:07
Cualquier cosa
00:30:12
Pero si n es negativo
00:30:13
A este método no le mola
00:30:15
Que n sea negativo
00:30:18
Porque lo que hace necesita que n sea positivo
00:30:19
No le mola
00:30:22
¿Vale?
00:30:23
Entonces, aquí el que desarrolla
00:30:26
Tiene muchas posibilidades
00:30:28
Pues decir, a ver
00:30:29
Voy a verificar si n es negativo
00:30:32
Y si lo es
00:30:34
Muestra un mensajito
00:30:36
Bueno, es una forma, pero claro
00:30:37
Tiene que estar alguien sentado en la consola
00:30:40
Ahí para verlo
00:30:42
¿Vale? Por ejemplo
00:30:44
Si n es negativo, pues uno
00:30:48
Podríamos avisar de lo que no nos gusta
00:30:50
De esta manera
00:30:52
A la es negativo
00:30:53
Y luego aquí haríamos un retun
00:30:58
Para terminar
00:31:06
¿Vale?
00:31:07
Y si es positivo, pues ya lo que fuera
00:31:12
Que queremos hacer con ese número n
00:31:14
¿Qué podemos querer hacer con un número n
00:31:16
Que solo nos gusta hacer con los positivos?
00:31:19
pues la raíz normalmente puede ser o algo así
00:31:21
pues
00:31:23
yo que sé, pues esto
00:31:24
por ejemplo, esto mismo
00:31:27
imaginaos que tenemos aquí un método
00:31:33
que solo quiere operar, solo quiere
00:31:37
trabajar si n es positivo
00:31:41
o cero, si es negativo no quiere
00:31:43
entonces claro
00:31:45
aquí no hay forma de restringirlo
00:31:47
mediante el parámetro
00:31:49
porque el tipo de dato número positivo no existe
00:31:50
existe el tipo de dato entero
00:31:53
pero el tipo de dato de un número natural no existe
00:31:56
a ver, podría ocurrir, podría haber un lenguaje
00:31:58
de programación que tuviera un tipo de dato
00:32:00
que fuera int positivo
00:32:03
pero no es el caso, no existe
00:32:04
entonces restringirlo por tipo de
00:32:06
dato no podemos
00:32:08
bueno, pues entonces tenemos que
00:32:09
aquí programar
00:32:13
de tal manera que avisemos, que
00:32:14
concibamos, que consideremos que hacer si n es negativo
00:32:16
bueno, pues esta sería una opción
00:32:19
es decir, si n es negativo
00:32:21
te aviso y no hago nada
00:32:22
bueno, vale
00:32:24
a ver, es una opción fea
00:32:26
porque entonces necesitamos que haya alguien aquí
00:32:27
necesitamos que haya
00:32:30
alguien aquí sentado
00:32:38
para enterarse de esto
00:32:39
entonces si no hay alguien aquí sentado para enterarse de esto
00:32:44
pues no
00:32:49
y claro, no siempre hay un humano
00:32:51
ahí sentado, ¿por qué?
00:32:53
porque las salidas de los métodos
00:32:55
lo que hace un método, muchas veces
00:32:57
va a otro método o va a otro
00:32:59
programa, va a otro programa
00:33:01
y ese otro método
00:33:03
al que va el resultado de esto
00:33:05
no es un señor ahí sentado mirando
00:33:07
entonces, la solución
00:33:08
de avisar por consola en situaciones
00:33:11
será útil y en otras no tendrá ningún sentido
00:33:13
no tendrá ningún sentido
00:33:15
bueno, pues cuál es la siguiente
00:33:16
cosa que se puede hacer
00:33:19
la hemos mencionado antes con el replay
00:33:20
aviso con el valor
00:33:23
de retorno
00:33:25
aquí en este caso
00:33:25
vale, este método se supone
00:33:28
que si hace la raíz, hombre, debería devolverla
00:33:31
porque si no es un poco tonto esto
00:33:33
vale, entonces
00:33:35
return
00:33:37
y aquí
00:33:38
return
00:33:40
vale, pues esta sería
00:33:43
otra opción, decir
00:33:53
me las ingenio
00:33:54
si es que puedo, para utilizar
00:33:56
el valor de retorno como aviso
00:33:58
y digo, y lo comento, porque si no
00:34:00
lo comento, pues estoy siendo
00:34:03
un programador horrible, lo comento
00:34:04
y digo, a ver, que devuelve
00:34:07
menos 1 si n es negativo
00:34:09
¿qué devuelve?
00:34:13
pues devuelve la raíz
00:34:17
si n es mayor o igual que 0
00:34:19
vale, pues aquí estoy avisando con el valor de retorno
00:34:23
entonces el que me usa
00:34:29
ya sabe que si ha devuelto menos 1
00:34:30
el número es negativo
00:34:33
esto de todas maneras estaría un poco mal hecho
00:34:34
porque existen números para los cuales la raíz es menos 1
00:34:38
entonces había confusión
00:34:41
Si devuelves menos 1, oye, ¿estás haciendo la raíz de 1, que también es menos 1?
00:34:43
¿O es que el número es negativo?
00:34:48
Pero bueno, os lo digo como ejemplo de que cuando uno tiene que avisar de cosas relacionadas con lo que está pasando,
00:34:50
pues tiene primero, opción, avisar por consola.
00:34:56
Buena, si es que ese método lo va a usar alguien que está ahí sentado.
00:35:00
Mala, si eso no va a ser así.
00:35:04
Opción B, avisar con el valor de retorno si podemos.
00:35:08
si eso no volvía a nada
00:35:11
porque hay un voy, lo tengo clarísimo
00:35:13
pues como el replace, te devuelve null
00:35:15
si no está, por ejemplo
00:35:17
pues así, menos uno si es
00:35:19
negativo, la propia raíz
00:35:21
si no lo fuera, puede avisar por valor de retorno
00:35:23
y tres
00:35:25
otra forma de avisar
00:35:27
si ocurre lo que yo no quiero que ocurra
00:35:29
que es que sea negativo
00:35:32
lanzar una excepción
00:35:33
esa sería la tercera forma de avisar
00:35:35
y la mejor
00:35:37
porque no tengo que usar el valor de retorno.
00:35:38
No tengo que usarlo.
00:35:41
Y en este caso sería el ideal
00:35:43
porque el valor de retorno tiene una función
00:35:44
que es el propio resultado del método.
00:35:46
El propio resultado.
00:35:49
Entonces, dejemos el valor de retorno
00:35:51
para guardar el resultado del método
00:35:53
y aviso de que ha pasado algo raro
00:35:55
lanzando una excepción.
00:35:57
Esa sería la tercera manera y la buena
00:35:59
de avisar de que algo raro ha pasado
00:36:02
lanzando una excepción.
00:36:04
¿Y cómo se lanza una excepción?
00:36:06
bueno, tendríamos que lanzarla en este punto
00:36:07
aquí, que es donde
00:36:09
ha pasado lo raro
00:36:11
donde ha pasado lo raro es aquí
00:36:12
cuando él es negativo, ¿cómo se lanza
00:36:15
una excepción? pues
00:36:17
escribiendo la sentencia
00:36:19
throw
00:36:21
la sentencia throw, lanzo la excepción
00:36:21
¿y ahora qué tengo que lanzar ahí?
00:36:25
tengo que lanzar un objeto
00:36:27
de la clase exception
00:36:29
asociada a esta cosa rara
00:36:31
un objeto de la clase exception
00:36:33
asociada a esta cosa rara
00:36:37
hemos dicho ya que objetos
00:36:38
excepción, perdón, que clases excepción
00:36:40
hay ya un montón creadas
00:36:43
cada una asociada a una cosa
00:36:45
rara concreta, objeto nulo
00:36:47
lo que pasa es que esta en particular
00:36:49
que el número sea negativo
00:36:51
eso por defecto no es nada
00:36:52
malo, no es malo
00:36:55
entonces
00:36:56
así que tengo que hacer
00:36:58
crearme yo mi propia excepción
00:37:00
que eso ya lo dejaremos para el otro día
00:37:02
pero que queremos reutilizar
00:37:05
a ver si me deja, que no lo tengo claro
00:37:07
como no tenemos tiempo a crear nuestra propia excepción
00:37:08
que es lo que tendríamos que hacer, vamos a decir
00:37:10
bueno, si pasa esta cosa rara voy a lanzar una excepción
00:37:12
pero de las que ya están creadas, null pointer exception
00:37:14
aunque no pega ahí, porque el problema aquí
00:37:16
no es null pointer exception, el problema aquí
00:37:18
es número negativo
00:37:21
pero vamos a intentar, aunque yo creo
00:37:22
que el constructor
00:37:24
va a ser privado, sí que no me va a dejar
00:37:26
lanzar esta
00:37:29
pero bueno, voy a probar por si
00:37:30
ah mira, sí que me deja
00:37:32
no es privado el constructor de null pointer exception
00:37:35
pues fijaos lo que estoy haciendo aquí
00:37:37
lo que estoy haciendo aquí es
00:37:39
si n es negativo
00:37:41
estoy haciendo yo por código
00:37:43
que se lance la excepción
00:37:45
de tipo null pointer exception
00:37:47
no es un aviso muy claro
00:37:50
porque de lo que yo estoy avisando
00:37:53
yo estoy avisando
00:37:55
de que ha habido un problema
00:37:57
de objeto nulo y no es verdad
00:37:59
el problema no ha sido de objeto nulo
00:38:01
pero bueno he cogido esa porque no hemos hecho
00:38:02
una que se adapte a lo nuestro
00:38:04
bueno, pues mi método ya está estupendo
00:38:06
mi método ya recibe el valor
00:38:08
que le gusta
00:38:10
devuelve el valor de retorno
00:38:12
que no le gusta, avisa lanzando
00:38:14
una excepción, ¿vale?
00:38:16
y magnífico
00:38:18
esto está mucho mejor programado
00:38:19
ahora nosotros ejecutamos esto
00:38:22
ejecutamos nuestro main
00:38:24
que llama a este método
00:38:26
y efectivamente nos ha salido
00:38:27
null pointer excepción
00:38:32
el método nos ha avisado
00:38:34
de que ha habido una excepción o un puente de excepción
00:38:36
a ver, muy mal avisado
00:38:38
claro, ha avisado
00:38:40
de lo que yo le he dicho que avise
00:38:42
ha avisado de lo que yo le he dicho que avise
00:38:43
vale
00:38:46
pero entendéis, lo que quiero que entendáis es
00:38:47
que las excepciones cuando os han
00:38:50
aparecido, cuando nos han aparecido
00:38:52
ejecutando cosas, no es que ya se hayan
00:38:54
generado de la nada, que la red roja
00:38:56
la se haya escrito ahí uno que estaba ahí dentro
00:38:58
no, cuando aparece una excepción
00:38:59
es porque la máquina virtual
00:39:02
se ha puesto a ejecutar lo que le hemos pedido
00:39:05
y como consecuencia de entrar
00:39:07
en los métodos, los métodos ir ejecutando
00:39:08
se ha encontrado un throw
00:39:10
entonces se ha encontrado un throw
00:39:12
pues
00:39:14
el throw es una sentencia más
00:39:16
y el throw que hace, hace aparecer
00:39:18
un objeto de este tipo
00:39:21
te pone las letritas rojas
00:39:23
correspondientes, ¿qué te pone letras rojas?
00:39:26
lo que está configurado en esta clase
00:39:28
que eso no lo hemos hecho nosotros
00:39:30
porque la clase ya está hecha, te hace aparecer esos mensajitos
00:39:32
correspondientes y para
00:39:35
la ejecución, y la para
00:39:37
eso es lo que hace la máquina virtual cuando se encuentra
00:39:38
al centro, entonces es una sentencia más
00:39:40
cuando nos han aparecido por tanto
00:39:42
estas cosas aquí
00:39:44
estas cosas
00:39:45
era simplemente porque la máquina
00:39:48
virtual, pipipipi, ha visto un throw
00:39:50
y ya está, ha visto un throw
00:39:52
nos ha puesto el mensaje y ha parado
00:39:54
¿vale?
00:39:56
entonces, nosotros ya
00:39:59
como programadores que somos los que decidimos
00:40:00
lo que hace el programa, como pasan
00:40:03
las cosas, ¿cuándo
00:40:05
pondremos un throw? Pues pondremos
00:40:06
un throw cuando queramos avisar
00:40:08
de que ha pasado una cosa muy rara que no
00:40:11
debería pasar y queremos
00:40:12
avisar lanzando
00:40:14
un objeto excepción, porque para eso los
00:40:16
usamos, para avisar de que han pasado cosas
00:40:18
raras, no usamos los objetos
00:40:20
de excepción para avisar de algo que no tiene importancia
00:40:22
no, los usamos
00:40:25
para avisar de que han pasado cosas raras
00:40:26
porque sabemos que la implicación que tiene es que el programa
00:40:28
para, entonces con el programa parar
00:40:31
lo usamos si es que ha ocurrido
00:40:33
algo raro, el throw
00:40:35
y repito, aún así
00:40:37
yo puedo salvarme de que el programa
00:40:40
pare capturando
00:40:43
imaginaos que aquí tengo otra sentencia
00:40:44
esta
00:40:46
si yo ejecuto mi programa
00:40:47
ahora, ya sabemos
00:40:51
que cuando yo ejecuto esto
00:40:53
como la excepción ha saltado
00:40:54
aquí, ni adiós ni nada
00:40:56
porque aquí se paró
00:40:58
aquí el programa se ha parado
00:41:00
porque sabemos que esa es la consecuencia
00:41:02
del throw que hay aquí dentro
00:41:04
pero que yo
00:41:06
no quiero que el programa pare porque es fundamental
00:41:08
lo que viene después, que muestre la dios, lo que sea
00:41:10
no quiero que pare, pues no pasa nada
00:41:12
voy a capturar la excepción
00:41:15
la capturo
00:41:17
como hemos dicho antes
00:41:21
la capturo
00:41:26
y ahora que va a ocurrir
00:41:35
el throw se va a ejecutar igualmente
00:41:37
cuando haya método raíz menos 12
00:41:39
el throw se va a ejecutar, pero la máquina
00:41:41
virtual ya ni saca
00:41:43
letras rojas, ni para el programa
00:41:45
ni hace nada, lo que hace
00:41:47
es lo que hay en el catch
00:41:50
es lo que hace, luego si no está
00:41:51
el try catch, saca
00:41:53
letras rojas y para
00:41:56
el programa
00:41:57
si hay un try catch
00:41:58
el throw se ejecuta igualmente
00:42:01
porque el throw está, porque el número es negativo
00:42:03
pero la máquina virtual
00:42:05
no hace nada más, ni para el
00:42:07
programa, ni saca de tarroja, ni nada
00:42:09
hace lo que hay en el catch
00:42:11
que en el catch hay algo, lo hace, que en el catch no hay nada
00:42:13
no lo hace, no hace nada
00:42:15
entonces cuando yo ejecute esto ahora
00:42:17
llamaremos a método raíz
00:42:18
método raíz entraremos
00:42:21
a método raíz, hará esto
00:42:23
bla bla bla, llegará el throw
00:42:25
una vez que llega el throw, ya está
00:42:27
el método este ya sí que termina
00:42:29
porque es un throw, esto es como si fuera un return
00:42:31
llega el throw, termina, subimos arriba
00:42:33
otra vez
00:42:35
como está capturada
00:42:36
como está capturada
00:42:38
ya ni se para
00:42:40
ni hay letras rojas
00:42:41
si no estuviera capturada
00:42:43
ya la segunda parte sería
00:42:44
parar la ejecución
00:42:46
y sacar las letras rojas
00:42:48
como está capturada
00:42:49
ni lo para
00:42:50
ni saca letras rojas
00:42:51
y se va al catch
00:42:52
se va ahí
00:42:53
hace eso
00:42:54
y luego continúa tan feliz
00:42:55
¿vale?
00:42:57
continúa tan feliz
00:43:00
aunque haya salido el throw
00:43:01
entonces ejecutamos esto
00:43:02
pues vale
00:43:03
Ha pasado esto y ya está
00:43:04
Ha salido la excepción
00:43:07
Pero a resulta de la excepción
00:43:09
No ha pasado nada
00:43:12
Porque en el catch no hay nada
00:43:13
Y luego ha seguido
00:43:14
¿Vale?
00:43:15
Venga, pues ahora sí que paramos aquí
00:43:19
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 15
- Fecha:
- 7 de abril de 2024 - 13:48
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 43′ 23″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 555.96 MBytes