20260309 Exception_3 - 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:
Bueno, pues, venga.
00:00:00
Venga, pues, ya habíamos refactorizado nuestro método
00:00:04
este getVoto estupendo, ¿vale?
00:00:07
Entonces, ahora ya, ahora hemos decidido diseñar nuestro
00:00:11
código, ahora sí.
00:00:18
Ahora, nuestro código llama a un método getVoto y ese método
00:00:20
getVoto está encerrando demasiada complejidad.
00:00:25
Ahí, la idea es que los métodos sean lo más atómicos posibles, ¿vale? Entonces, este método está ahí metiendo validación, a ver, que yo esto también lo estoy diciendo, pues porque me facilita el hilo de la explicación, pero en general tiene sentido.
00:00:28
bueno, pues este método está haciendo
00:00:45
una validación, validación
00:00:47
y cuando yo llame a ese método
00:00:48
cuando llame a ese método
00:00:50
llamo y confío
00:00:51
en que el usuario
00:00:55
que va a votar vote un candidato válido
00:00:57
porque como no vote un candidato
00:00:59
válido, me voy a estar esperando
00:01:01
años y años, porque aquí voy a tener
00:01:03
un bucle infinito
00:01:05
bueno, es una posibilidad de diseño
00:01:06
mi código llama a este voto
00:01:08
y ahí se queda horas y horas
00:01:10
y horas, esperando que
00:01:13
el votante emita un voto válido.
00:01:14
Pero podríamos hacer otra filosofía,
00:01:18
que es, no, no. Yo te doy la opción
00:01:20
de votar y no me estoy ahí esperando
00:01:22
delante de la urna años
00:01:24
si hace falta hasta que tú decidas escribir
00:01:26
en la papeleta lo que toca.
00:01:28
Eso no lo voy a hacer.
00:01:30
Yo te voy a
00:01:32
pedir que votes
00:01:33
y si votas bien,
00:01:35
magnífico, pero y si votas mal,
00:01:38
yo aviso, este ha votado mal y se acabó.
00:01:40
Nada de estarme aquí esperando años
00:01:43
y años y años a que tú votes bien
00:01:44
no, tú vota
00:01:46
que tu voto no es válido, el voto de este tío
00:01:48
no es válido, tú verás qué haces con él
00:01:50
si lo llevas a la cárcel o le das otra oportunidad
00:01:51
lo que tú quieras
00:01:54
esa es una mejor filosofía de diseño
00:01:55
¿vale?
00:01:58
los métodos, las cosas más atómicas posibles
00:02:00
y que las decisiones
00:02:02
estratégicas
00:02:04
como te dejo votar otra vez o te llevo a la cárcel
00:02:05
las decisiones estratégicas
00:02:08
se deleguen para arriba
00:02:09
sería en principio
00:02:11
mejor diseño
00:02:14
vale, pues entonces
00:02:15
eso que implicaría aquí, en esta versión B
00:02:17
de votaciones, este bucle
00:02:20
lo quito
00:02:22
y leo el voto sin más
00:02:22
si el voto
00:02:26
es válido, genial, lo devuelvo
00:02:28
y si no es válido
00:02:30
aviso de que no ha sido válido
00:02:32
vale, eso sería
00:02:34
lo ideal, y ya el de arriba
00:02:36
que decida que hace con ese voto no válido
00:02:38
si le da otra oportunidad o no le da ninguna
00:02:40
bueno, pues ese
00:02:43
aviso de que el voto no ha sido
00:02:44
válido, tiene que ser
00:02:47
mediante una excepción, porque esa es la forma
00:02:49
en la que los métodos avisan
00:02:50
al de arriba de que algo raro
00:02:53
ha pasado, ¿vale?
00:02:55
hasta ahora esos avisos
00:02:57
si hemos querido hacerlos, los hemos hecho
00:02:58
usando el valor de retorno
00:03:01
es decir, yo puedo
00:03:02
hacer un método que me devuelva boolean
00:03:05
si el boolean es falso
00:03:06
ese método no funcionó
00:03:08
no es válido, algo raro pasó
00:03:11
y si el valor de retorno
00:03:13
es true, ese método funcionó correctamente
00:03:15
pero en este caso no podemos usar
00:03:17
el valor de retorno, porque ya está
00:03:19
usado para el voto, ya está usado
00:03:20
para el nombre del candidato
00:03:23
luego no puedo usar un boolean de retorno
00:03:24
para avisar si las cosas han ido bien o mal
00:03:26
no puedo
00:03:28
aún así, tendríamos
00:03:29
otra forma de avisar al de arriba que algo
00:03:32
ha ido mal o no
00:03:35
sin necesidad de
00:03:35
mandarle una excepción
00:03:37
en esta misma firma de aquí
00:03:39
con un string
00:03:42
la tendríamos
00:03:42
devolviendo null
00:03:49
espera, espera, espera
00:03:51
espera, espera, sí
00:03:57
sí, sí
00:03:58
la respuesta sí, pero por partes
00:04:00
vale, entonces tendríamos otra
00:04:03
forma de avisar al de arriba
00:04:05
de que este método ha ido mal
00:04:06
es decir, vamos a quitarle la validad
00:04:08
el bucle, repito
00:04:10
vamos a quitarle el bucle
00:04:11
y esto se nos queda así
00:04:12
entonces, si
00:04:14
el voto emitido
00:04:26
está contenido en los candidatos
00:04:28
pues entonces, magnífico
00:04:32
retúmboto
00:04:34
y si no, si no está contenido
00:04:35
en los candidatos
00:04:38
yo aún así tengo una manera de avisar
00:04:39
de que algo ha ido mal
00:04:42
podría devolver null
00:04:45
y ahora aquí, por supuesto
00:04:47
Primero
00:04:49
Asegurarme de comentarlo bien
00:04:50
Porque si no lo comento bien
00:04:53
Pues ese null
00:04:57
No significa nada
00:04:59
¿Qué significa null?
00:05:01
Entonces tendría sentido
00:05:03
El nombre del
00:05:05
Candidato
00:05:09
Candidato votado
00:05:11
Y ahora pondría aquí
00:05:13
Devuelve null
00:05:15
si el voto no es
00:05:18
válido
00:05:21
vale, esta podría ser una opción
00:05:22
yo con esto
00:05:25
emito el voto
00:05:27
si el voto es válido
00:05:29
lo devuelvo, si no aviso
00:05:31
con null, con lo cual ya he delegado arriba
00:05:33
pero claro, el de arriba
00:05:35
no ve el código de este método, tiene que saber
00:05:37
qué significa el null
00:05:39
eso para empezar, con lo cual buena idea comentarlo
00:05:40
entonces el que usa
00:05:43
el método
00:05:45
menos mal que yo lo he comentado
00:05:45
con javadoc, porque el que usa
00:05:48
el método, dice
00:05:50
ah, espérate, si me da null
00:05:52
es porque no es válido
00:05:54
cuidado, me puede dar null, no es válido
00:05:56
entonces yo ahora ya decido
00:05:58
si me meto en un bucle, mientras esto sea diferente
00:05:59
de null, o si le digo
00:06:02
voto no válido
00:06:04
yo ya puedo decidir, pero hombre
00:06:06
que me lo documente bien, porque un null en sí
00:06:08
no significa nada, que me lo documente
00:06:10
bien, ¿vale? y aquí me aparece
00:06:12
lo que yo he puesto en el javadoc
00:06:14
entonces vale, estupendo
00:06:15
en este entorno y en cualquier otro
00:06:17
porque están
00:06:20
ligados al javadoc
00:06:20
¿vale? recordad que
00:06:23
javadoc son los comentarios
00:06:26
que empiezan así
00:06:27
con dos asteriscos
00:06:29
y todo lo que
00:06:32
pongamos aquí, todo
00:06:34
se integra
00:06:35
en la ayuda
00:06:38
de los métodos
00:06:39
y esa ayuda
00:06:42
donde aparece, aparece luego
00:06:43
cuando lo escribimos
00:06:45
aparece en la herramienta de ayuda
00:06:47
del entorno de desarrollo que sea
00:06:49
así muy en resumen
00:06:51
bueno, pues esta podría ser una opción
00:06:53
pero bueno, a ver
00:06:55
los null tienen muy mala
00:06:58
prensa, y es normal que tengan
00:07:00
mala prensa, ¿no? los null tienen mala prensa
00:07:01
¿por qué? porque nos generan
00:07:04
los null pointer exception
00:07:05
¿vale? tienen muy mala prensa
00:07:07
entonces, si yo uso
00:07:10
eso
00:07:11
aquí
00:07:12
voto puede ser null
00:07:19
tranquilamente puede ser null
00:07:24
y mi programa sigue
00:07:27
y no pasa nada, voto puede ser null
00:07:28
y mi programa va a seguir
00:07:30
y en algún momento ese null puede petar
00:07:32
aquí en particular
00:07:34
voto no llama nada, con lo cual un null pointer exception
00:07:36
no va a salir
00:07:39
pero hay un contents key
00:07:39
de voto, entonces el contents key
00:07:42
cuando es null no sé qué hará
00:07:45
pero vamos
00:07:47
igual te da una
00:07:48
excepción de que no le puedes pasar un null
00:07:52
al contents key
00:07:54
en resumen, es muy mala idea
00:07:55
trabajar lógicamente
00:07:58
con variables objeto que tengan un null dentro
00:08:00
porque en cuanto yo
00:08:02
llame algo dentro de ellas con el punto
00:08:04
me va a salir null pointer exception
00:08:06
se para el programa porque uno no se está capturando
00:08:07
los null pointers de todo el rato
00:08:10
¿vale? entonces esta forma
00:08:11
de avisar, pues bueno, tiene
00:08:14
ese peligro, que estamos devolviendo un null
00:08:16
y si el que la usa
00:08:18
aquí no lo tiene en cuenta
00:08:20
para si es, para meterlo
00:08:22
en un bucle mientras sea diferente de null
00:08:24
o si es null, pon voto
00:08:26
a lo que sea, sin él no lo
00:08:28
tiene en cuenta, tiene su peligro
00:08:30
¿vale?
00:08:32
Bueno, pues opción B, otra
00:08:34
forma de avisar, otra forma de
00:08:36
avisar mucho más segura y menos peligrosa
00:08:38
vamos a hacernos el
00:08:41
getVoto versión 2
00:08:42
el bueno y el bonito
00:08:44
getVoto
00:08:47
versión 2, vale
00:08:52
aquí
00:08:53
cuando
00:08:55
resulta que el voto no es válido
00:08:57
en el else del candidatos
00:09:00
containsVoto, en el else
00:09:02
yo aquí nada de devolver null
00:09:03
nada de devolver null, lo que hago
00:09:06
es, pum
00:09:08
construir un objeto de excepción
00:09:09
y mandarlo para arriba, y se acabó
00:09:11
y se detiene la ejecución del método
00:09:14
aunque hubiera cosas aquí debajo
00:09:16
Eso ya ni se hace
00:09:18
¿Vale? Entonces, ¿qué es lo que queremos hacer aquí?
00:09:19
Aquí queremos
00:09:22
Lanzar una excepción
00:09:23
¿Y cómo se lanza una excepción?
00:09:25
Pues una excepción
00:09:30
Se lanza poniendo throw
00:09:31
Como la de esperar
00:09:33
Y aquí el objeto
00:09:34
Instanciamos el objeto excepción
00:09:37
Que queremos lanzar
00:09:39
¿Cómo se instancia un objeto? Con new
00:09:40
¿Qué tipo de excepción lanzamos?
00:09:42
Pues
00:09:46
Si nos ponemos a buscar entre las 300-500
00:09:46
clases excepción, no hay ninguna
00:09:49
que sea boton o válido.
00:09:51
Exception.
00:09:53
Con lo cual, ¿qué podemos hacer?
00:09:55
Crearnos nuestra propia excepción.
00:09:58
¿Vale? Crearnos
00:10:00
nuestra propia excepción.
00:10:01
A ver, podríamos lanzar otra, la que nos
00:10:03
diera la gana.
00:10:05
Yo podría lanzar esta, pero...
00:10:07
¿Vale? Podría lanzar esta excepción.
00:10:14
Pero qué tontería lanzar
00:10:17
una excepción io, que no me explica
00:10:18
nada, cuando lo que yo quiero es
00:10:20
avisar, porque la excepción es avisar
00:10:22
de que el votante ha emitido
00:10:24
un voto no válido, entonces voy a
00:10:26
crearme yo mi propia excepción
00:10:28
voy a crearme mi propia excepción
00:10:30
para ponerla aquí
00:10:32
venga, pues vamos a
00:10:34
crearnos una clase excepción
00:10:38
vale, pues
00:10:39
aquí estamos en el ejercicio 8
00:10:41
pues venga
00:10:43
nuestra clase se va a llamar
00:10:45
voto no
00:10:48
válido
00:10:50
El nombre de la excepción
00:10:50
Da igual lo largo que sea
00:10:54
Cuanto más explicativo mejor
00:10:56
Voto no válido y por convenio
00:10:58
No es que sea obligatorio
00:11:00
Por convenio suelen acabar en exception
00:11:01
Todas para que se vea que es una clase de excepción
00:11:03
Exception
00:11:06
Vale, no es que sea obligatorio
00:11:09
Pero hombre
00:11:12
Aclara mucho el código
00:11:13
Todas las clases cuyo nombre acabe en exception
00:11:15
Son clases de excepción
00:11:17
vale, pues para que esta clase
00:11:18
sea una excepción
00:11:25
de verdad
00:11:27
y tenga todo lo que tienen que tener las excepciones
00:11:28
de poder ser lanzadas
00:11:31
de que el otro la pueda
00:11:33
recoger, etcétera
00:11:35
tiene que heredar
00:11:37
¿de qué?
00:11:39
de una superclase magnífica que se llama
00:11:41
exception, que tiene todo lo básico de las excepciones
00:11:43
entonces
00:11:45
exception es una superclase
00:11:49
que a su vez hereda de una
00:11:51
interfaz throwable que es todo lo lanzable
00:11:55
todo lo lanzable
00:11:57
y esto ya lo convierte
00:11:58
en excepción y en realidad yo no hace
00:12:01
falta que haga nada más, la puedo dejar así con su
00:12:03
constructor por defecto y ya está
00:12:05
la podría dejar así
00:12:07
pero
00:12:08
la clase exception entre todas
00:12:10
las cosas que tiene dentro tiene una variable
00:12:13
que es su mensajito
00:12:15
y ese mensajito es el mensajito que te
00:12:16
aparece en las líneas rojas cuando
00:12:19
sale, entonces hombre vamos
00:12:21
a aprovechar esa variable y vamos a poner el mensajito
00:12:23
personalizado para esta excepción
00:12:25
que en este caso sería
00:12:27
el votante no ha votado
00:12:29
bien, vale
00:12:31
vale, pues como lo podemos hacer
00:12:33
pues vamos a hacer su
00:12:35
constructor y le vamos a pasar
00:12:37
a partir del constructor esa variable
00:12:39
vale, pues la clase
00:12:41
exception, la clase exception
00:12:50
tiene un constructor
00:12:52
del que yo me voy a aprovechar
00:12:55
un constructor al que si yo le paso
00:12:58
un mensajito
00:13:03
esa variable
00:13:04
mensaje interno se inicializa
00:13:06
con este mensajito
00:13:09
pues cuando este objeto
00:13:10
excepción se instancie
00:13:23
se va a instanciar
00:13:25
metiendo en su variable
00:13:28
interna mensaje esta
00:13:30
y esa variable interna es la que nos saca la máquina virtual
00:13:31
luego, vale, ya está nuestra
00:13:34
excepción hecha
00:13:42
este aviso simplemente de que como implementa
00:13:42
Serializable, todas las exceptions
00:13:45
Nos dice, no tienes un valor de serialización
00:13:47
Pero eso no nos hace falta, si no vamos a serializar
00:13:50
Nah, ese amarillo lo olvidáis
00:13:52
Vale, pues ahora ya
00:13:53
Sí que lanzamos throw new
00:13:55
Voto
00:13:58
No
00:13:59
Válido
00:14:02
Exception
00:14:03
Ala, y esta es
00:14:06
La forma buena, en realidad
00:14:09
La forma buena de que un método avise al de arriba
00:14:11
De que ha pasado algo raro
00:14:13
no devolviendo un null
00:14:14
porque ese null vete a saber el de arriba como lo interpreta
00:14:16
y nada de eso, esta es la forma buena
00:14:19
lanzando con throw
00:14:20
un objeto de excepción
00:14:23
relacionado que explique lo que ha pasado
00:14:24
que normalmente implica
00:14:26
hacernos uno nuestro para nosotros
00:14:28
¿y por qué se nos ha quedado rojito?
00:14:30
se nos ha quedado rojito
00:14:35
porque si un método puede
00:14:37
que lance una excepción, puede que lance
00:14:38
en la firma que es
00:14:41
lo que hay arriba, hay que avisar
00:14:43
es obligatorio
00:14:45
y esta firma tal y como está hecha
00:14:46
no está avisando de nada de eso
00:14:48
pues tiene que avisar
00:14:50
¿y cómo avisa? pues poniendo
00:14:52
después de la firma
00:14:54
throws
00:14:56
la clase de excepción que puede ser
00:14:57
que lance ¿vale?
00:15:00
entonces
00:15:08
esto
00:15:08
significa, lanza la excepción
00:15:10
se va a lanzar en el
00:15:12
else, es decir, cuando
00:15:14
el voto no sea válido
00:15:15
Se puede lanzar lo que haya el momento cuando yo decida que toca parar y avisar, ¿vale? Y repito, si hubiera líneas de código aquí después, estas líneas de código, por ejemplo, esta, imaginaos que hay esto, ha votado, ¿vale?
00:15:17
Bueno, claro, es que esto como tenemos aquí un retun
00:15:34
Vale, vamos a poner aquí
00:15:38
Si candidatos
00:15:40
Contains voto
00:15:44
A ver, voy a quitar el retun de aquí porque quiero poner una línea después del list
00:15:48
Voy a poner aquí directamente
00:15:52
Si candidatos no contiene el voto
00:15:54
Entonces ahora ya lanzo la excepción
00:15:58
Y así vemos mejor
00:16:00
Y ahora ha votado y retun voto
00:16:01
así me gusta más
00:16:08
vale, esta versión me gusta más
00:16:10
entonces, leemos el voto
00:16:20
si no está
00:16:22
contenido en los válidos
00:16:24
excepción lanzada
00:16:25
y el método da igual, ya se ha parado
00:16:27
ya se ha parado, esto que hay después ya no se va a ejecutar
00:16:29
nunca, se ha lanzado
00:16:32
excepción y para arriba, se acabó
00:16:34
si el
00:16:35
voto si es válido
00:16:38
entonces ya no entra en el if
00:16:41
con lo cual continúa y pondrá votado
00:16:43
y retumboto, vale
00:16:45
y podemos poner aquí
00:16:47
a lo mejor para verlo
00:16:49
ha votado a este
00:16:51
ha votado a este
00:16:52
por ejemplo, vale
00:16:58
vale, pues este método es más bonito
00:16:59
porque este método ya sí que está avisando
00:17:01
está avisando
00:17:04
de una manera
00:17:06
explícita
00:17:07
y además se para
00:17:11
se para, o sea, si el voto no es válido
00:17:13
es que ni siquiera sigue. Esto ya no lo va a hacer.
00:17:15
Se para. Avisa de manera explícita.
00:17:17
Este ya está mejor.
00:17:20
Pero, recuerdo,
00:17:23
no se nos puede olvidar que si
00:17:25
puede que lance
00:17:27
una excepción, es decir, si hay un throw porque
00:17:29
puede que en algún momento la lance,
00:17:31
la firma del método tiene que incorporar el
00:17:33
throw para avisarlo.
00:17:35
La firma del método tiene
00:17:37
que incorporar el throw.
00:17:38
Vale.
00:17:40
Vamos a llamar
00:17:43
ahora a este método.
00:17:44
Ahora, ¿dónde llamaba yo a GetBoto?
00:17:45
Aquí
00:17:48
Vale, pues esto lo vamos a dejar comentado
00:17:48
Vamos a usar ahora el otro
00:17:51
Vamos a usar ahora el otro
00:17:52
GetBotoV2
00:17:57
GetBotoV2
00:17:59
Vamos a llamar a este
00:18:06
Vale, pues ahora mucho mejor
00:18:07
Porque el propio compilador ya nos ha puesto
00:18:11
Una barrera de seguridad
00:18:14
Yo cuando llamaba a GetBoto
00:18:16
Tan tranquilo, que luego me sale un null
00:18:19
¿Ya es problema tuyo? ¿Qué haces con ese null?
00:18:22
Ahora, llamo a getVoto2
00:18:24
que me avisa con excepción.
00:18:26
Automáticamente ya el
00:18:29
compilador ya me pone ahí
00:18:30
un freno. ¿Y qué me está
00:18:31
diciendo el compilador?
00:18:34
Pues vamos a leerlo. El compilador
00:18:35
me está diciendo, uy,
00:18:37
cuidadito, cuidadito
00:18:40
que este método te puede dar
00:18:42
voto no válido excepción. Cuidado.
00:18:43
¿Vale? Cuidado.
00:18:47
Entonces, tú ya sabes
00:18:48
que ese método te puede dar
00:18:49
una excepción y
00:18:51
no te va a compilar mientras tú
00:18:53
no la captures.
00:18:55
Esto es una semi mentira,
00:18:58
pero luego ya la...
00:18:59
¿Vale? Porque puedes no capturarla
00:19:01
y propagarla, pero bueno,
00:19:05
eso lo hacemos ahora después.
00:19:07
¿Veis cómo esta forma de avisar es mucho mejor?
00:19:11
Es mucho mejor porque ya el compilador
00:19:14
te está diciendo, oye, cuidado, ten en cuenta
00:19:15
que eso te puede dar una excepción, ten en cuenta.
00:19:17
Entonces tú dices, ¡ah!
00:19:20
Vale, vale. Entonces yo ya
00:19:22
decido aquí que hago, o me hago un bucle
00:19:23
con el boolean que hemos
00:19:25
hecho antes, o
00:19:27
vale, yo ya la capturo
00:19:31
y digo, vale, intenta votar
00:19:34
si no puedes votar
00:19:36
porque te sale
00:19:39
voto no válido, yo aquí la
00:19:42
capturo, la excepción que lanza este
00:19:44
si me sale la excepción
00:19:46
voto no válido, pues entonces
00:19:48
ya aquí hacemos lo que nos dé la gana
00:19:50
pues por ejemplo
00:19:52
todos los que hagan voto no válido van a votar al primero
00:19:54
Ala, ya está, porque yo he decidido eso, pero vamos, lo normal sería meterlo en un bucle, etc.
00:19:56
Candidatos.get de 0, lo podemos poner aquí, voto no válido, se asigna, se asignará al primer candidato,
00:20:08
O lo que uno quiera
00:20:37
Eso ya es lo de menos
00:20:39
Voto no válido
00:20:40
Se asignará al primer candidato
00:20:42
O lo que uno le dé la gana
00:20:44
Y ya está
00:20:45
¿Vale?
00:20:46
¿Qué es el método ese que te salía?
00:20:50
Ese es el método
00:20:56
Lo vimos ayer
00:20:58
Es el método
00:20:58
Que te muestra las letras rojas
00:20:59
Es decir, te muestra el contenido dentro de la excepción
00:21:03
Entonces, por eso la máquina virtual
00:21:05
Cuando tú no capturas una excepción
00:21:07
Y para el programa
00:21:09
vale, pues lo primero
00:21:09
que hace es llamar, aunque tú no lo ves
00:21:12
a ese print extract trace y por eso nos aparecen
00:21:14
esas cosas rojas, vale
00:21:16
entonces yo lo voy a, primero lo voy a probar
00:21:18
sin llamarlo, luego llamándolo, vale
00:21:20
bueno, pues entonces
00:21:22
ahora ya esta aplicación está mejor
00:21:24
hecha, porque el compilador
00:21:26
nos ha avisado de que esto puede que salga
00:21:28
mal y te ha obligado a ti
00:21:30
a hacer algo, te ha obligado a ti a hacer algo
00:21:32
pues tú lo capturas y lo que has decidido
00:21:34
hacer es dárselo al primero
00:21:36
Y ya está
00:21:37
Podrías haber decidido otra cosa
00:21:39
O haber metido este try catch en un bucle
00:21:40
O lo que quisiéramos
00:21:43
Venga, vamos a ejecutar ahora esto
00:21:45
Con los cambios que hemos hecho
00:21:47
A ver si nos
00:21:49
Funciona todo
00:21:52
¿Cuántos se presentan?
00:21:53
Tres, dime nombre
00:21:57
El A, el B y el C
00:21:59
Y ahora ya empezamos con los votos
00:22:01
Porque no dice ni que voto ni nada
00:22:06
Será eso
00:22:07
A, ha votado A
00:22:08
C, ahora pongo el
00:22:10
G, voto no válido
00:22:13
se asigna el primero, vale, muy bien
00:22:15
pero seguimos
00:22:17
el B, el D, no válido, se asigna el primero
00:22:18
vale, y aquí seguimos
00:22:21
hasta acabar, vale, ya está
00:22:23
8, ya está
00:22:28
¿entendido?
00:22:30
entonces, E es el objeto
00:22:38
excepción
00:22:41
E tiene información que podemos sacar de él si queremos
00:22:42
por ejemplo, a través
00:22:45
de este método, esto te muestra
00:22:47
por consola la traza
00:22:49
de llamadas que llegaron a esa excepción
00:22:51
el mensajito interno
00:22:53
¿vale? o sea, si quisiéramos
00:22:55
que era lo que comentábamos ayer
00:22:57
si estamos en tiempo de desarrollo de código, queremos
00:22:58
toda la información posible
00:23:01
entonces en ese caso, llamaríamos
00:23:02
a este porque además me sale
00:23:05
toda la información de la excepción
00:23:07
¿no? si yo vuelvo a ejecutar este programa así
00:23:08
venga, dos candidatos
00:23:11
A y B
00:23:15
Y ahora voy a votar a uno que no hay
00:23:17
¿Ves? Me sale esto
00:23:19
Este es el print extract trace
00:23:22
Que es la información interna
00:23:24
Entre ella el mensajito
00:23:27
El mensajito que yo he puesto
00:23:28
El votante ni votar ha sabido
00:23:30
Me sale ahí el mensajito
00:23:33
Lo que yo he puesto en la excepción
00:23:35
Pero el programa no ha parado
00:23:37
El programa no para
00:23:38
Porque esto de aquí es simplemente el resultado de
00:23:40
Esta sentencia
00:23:44
Esta
00:23:47
el resultado de esa
00:23:47
y luego después me ha hecho esto
00:23:50
y lo ha asignado al cero
00:23:52
es decir, esto es
00:23:54
esto, que nos da
00:23:57
información, pero claro, cuando ya
00:24:00
le damos el programa a alguien para que lo use
00:24:02
eso lo quitamos, porque no queremos que vea
00:24:04
eso, eso para
00:24:06
nosotros, cuando estamos haciendo pruebas, si nos interesa
00:24:08
para saber dónde ha fallado, tú pinchas
00:24:10
aquí y dices, ah, vale, me falló aquí
00:24:12
pero
00:24:14
cuando ya se acaba o no
00:24:15
No haces eso, ¿vale?
00:24:18
Vale, pues entonces
00:24:36
Más o menos entendido hasta aquí
00:24:38
Pues nos falta un pelinín
00:24:41
Y ya damos lo de las excepciones
00:24:42
Por ventilado
00:24:44
Venga, vamos a aprovechar y paramos aquí un momento
00:24:46
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 10 de marzo de 2026 - 14:01
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 24′ 50″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 102.26 MBytes