20260309 Exception_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:
No, por Dios, faltaría más. Vale, pues esto de las excepciones había venido a cuento de esto de aquí.
00:00:00
Esta sentencia, como muchísimas otras, pues puede ocurrir que cuando se ponga a ejecutar su tarea, se pone a ejecutarla,
00:00:13
pin, pin, pin, de repente
00:00:23
haga una validación, vea que
00:00:25
algo no
00:00:27
funciona como debe, con lo cual
00:00:29
no tiene sentido que siga
00:00:31
entonces eso mediante código
00:00:33
con sus if, con sus no sé qué, se ve que
00:00:35
ahí no tiene sentido seguir
00:00:37
y entonces en lugar de seguir ese método
00:00:39
hasta el final, lo que
00:00:42
hace es, crea un objeto excepción
00:00:43
y pum, lo lanza
00:00:45
al punto del
00:00:47
código en el que se llamó
00:00:49
en el que fue llamado este método
00:00:51
Ahí lanza ese objeto excepción
00:00:53
¿Ese objeto de qué clase pertenece?
00:00:54
Pues a una clase excepción
00:00:57
Que hay tropecientas mil
00:00:59
Input, mismatch, excepción es una
00:01:01
Render, no excepción, no excepción, la que sea
00:01:02
Construye un objeto
00:01:05
Que guarda esa información y pum
00:01:06
Devuelve
00:01:09
El control
00:01:11
A esta línea de código
00:01:12
Y además de devolver el control a esta línea de código
00:01:14
Entrega un objeto
00:01:17
Excepción con la información dentro
00:01:19
Sobre qué ha pasado, etc.
00:01:21
entonces cuando el control vuelve a esta línea de código
00:01:22
hay dos posibilidades
00:01:26
que este try-catch no exista
00:01:28
que era lo que hemos hecho nosotros hasta ahora
00:01:30
entonces si este try-catch no existe
00:01:31
que es lo que hemos hecho nosotros hasta ahora
00:01:33
la máquina virtual cuando se encuentra
00:01:35
ese objeto de excepción dice vale
00:01:38
te voy a mostrar lo que hay dentro
00:01:39
por consola
00:01:42
para que tú tengas un detalle de lo que ha pasado
00:01:43
y luego voy a parar la ejecución
00:01:46
para siempre, ya jamás parado el programa
00:01:48
y esto ya nunca sigue
00:01:50
bueno, vale, ya sabemos obviamente
00:01:51
que pega tiene eso, en tiempo de desarrollo
00:01:54
de código, cuando estamos haciendo, pues que el programa
00:01:56
pete y pare, muy bien
00:01:58
ha pasado esto, es que he hecho
00:02:00
esto mal, pues
00:02:02
lo arreglo, lo cambio, lo que sea
00:02:03
pero, cuando ya
00:02:05
hemos entregado la aplicación, no puede ser
00:02:08
que el programa se pare
00:02:10
no puede ser que el programa se pare cuando
00:02:11
en este caso
00:02:13
el usuario mete en lugar de un número
00:02:16
mete una cadena, no puede ser
00:02:18
que el programa se pare
00:02:20
entonces, ¿cuál es el plan B?
00:02:21
el plan B es
00:02:25
la sentencia que puede
00:02:26
provocar
00:02:28
esa situación, se mete en este
00:02:29
bloque, tricats, ya está, eso es lo que vimos
00:02:32
ayer, se mete en este bloque tricats
00:02:34
y entonces ahora ya, esta sentencia
00:02:35
trata de ejecutarse
00:02:38
si se ejecuta de principio a fin
00:02:39
fenomenal, se va a la siguiente
00:02:41
si se ejecuta de principio
00:02:44
a fin, fenomenal, ya está
00:02:46
hemos sacado este bloque y ya seguimos
00:02:48
por abajo los catch como si no
00:02:50
existieran, seguiríamos por aquí
00:02:52
los catch como si no existieran
00:02:54
vale, pero
00:02:55
¿qué es lo otro que puede ocurrir?
00:02:57
que esta sentencia
00:03:00
no se ejecute de principio a fin
00:03:02
porque en la mitad por código
00:03:04
por código se detecta que algo
00:03:06
no va bien, el programa
00:03:08
decide pararlo
00:03:10
y
00:03:11
lanzar ese objeto, vale
00:03:12
pues entonces si tenemos un try catch
00:03:16
Ese objeto que ha llegado a este punto
00:03:18
Ese objeto que ha llegado a este punto
00:03:22
Empieza a compararse con los cats
00:03:23
Que hay abajo, en nuestro caso hay dos
00:03:26
Dice, a ver, me acaba de llegar aquí una excepción
00:03:28
Esa excepción de qué clase es
00:03:30
Es de la clase
00:03:32
Pepito exception, vale
00:03:34
Voy a ver si hay algún cat
00:03:35
Que capture pepito exception
00:03:37
Pepito exception, no, paso del cat
00:03:39
Pepito exception, no, paso del cat
00:03:41
Con lo cual
00:03:44
No hay ningún cat que capture
00:03:45
la pepito exception que lanzó este
00:03:47
luego este try-catch no vale para nada
00:03:49
se para la aplicación
00:03:52
igualmente, se para igualmente
00:03:54
vale, pero
00:03:56
si el
00:03:58
objeto excepción que nos ha mandado este
00:04:00
no es pepito exception, sino
00:04:02
input mismatch exception
00:04:04
pues él va a catch por, anda mira
00:04:05
coincide, el objeto
00:04:07
que me ha llegado en este punto
00:04:10
coincide con este, pues entonces
00:04:11
me meto aquí en este bloque y hago
00:04:14
lo que haya en ese bloque
00:04:16
hago lo que hay en ese bloque
00:04:17
que es lo que al programador le dé la gana
00:04:19
avisar, volver a pedir
00:04:21
el dato
00:04:23
en ese caso habría que meter el try-catch en un bucle
00:04:24
claro, para que estuviera todo el rato
00:04:27
intentándolo hasta que el dato fuera
00:04:29
correcto, lo que fuera
00:04:31
y una vez que ha acabado el catch
00:04:33
continuamos
00:04:35
con la línea siguiente
00:04:37
al bloque try-catch, como si nada
00:04:39
hubiera pasado, el programa no se para y todo
00:04:41
sigue ahí estupendamente
00:04:43
como si nada hubiera pasado, ahí seguimos
00:04:44
¿vale? y así es como deberían ser
00:04:47
los programas ya en producción
00:04:49
si algo falla
00:04:51
porque el usuario ha metido mal los datos
00:04:53
por lo que sea
00:04:55
el programa te da una alternativa
00:04:56
sobrevive como puede
00:04:58
en este caso ¿cómo ha sobrevivido?
00:05:00
pues poniendo n igual a 10
00:05:02
y sigue
00:05:04
no se para y ya está
00:05:07
¿vale?
00:05:08
si aquí, si la excepción ha salido aquí
00:05:10
por ejemplo en esta
00:05:13
sentencia
00:05:15
aunque haya
00:05:16
sentencias después
00:05:18
estas ya no se llegan a ejecutar
00:05:20
nunca, vale
00:05:22
me explico
00:05:24
next in ha intentado ejecutarse
00:05:26
y en un momento ha visto que algo no funciona
00:05:28
no le gusta y pum, crea el objeto
00:05:30
excepción y devuelve el control
00:05:32
vale, pues ahí ya
00:05:33
empiezan a comprobarse los catch
00:05:36
estas sentencias como si no existiera
00:05:38
nunca se ejecuta, todo lo que haya
00:05:40
por debajo, dentro del bloque
00:05:42
Todo lo que haya por debajo de la sentencia que provoca la excepción se queda sin ejecutar para siempre jamás. Se ejecutará el catch correspondiente y luego ya se sigue por abajo. Y esto que estaba por debajo se ha quedado sin ejecutar porque se interrumpió el flujo del programa, se interrumpió aquí por la excepción.
00:05:44
Se interrumpió aquí el flujo
00:06:09
Se va el catch y seguimos
00:06:11
¿Vale?
00:06:12
Entonces bueno, nosotros ya usamos
00:06:13
El bloque try catch
00:06:15
Como nos dé la gana
00:06:17
¿Vale?
00:06:19
Entonces para
00:06:23
Antes de seguir
00:06:24
Para que no os aburráis
00:06:27
Por ejemplo, pues ahora ya que conocemos el try catch
00:06:28
Vamos a
00:06:30
Usarlo para hacer la validación
00:06:33
De
00:06:35
Esto de aquí
00:06:36
porque yo aquí en realidad no he hecho una validación
00:06:37
cuando he planteado este ejemplo
00:06:40
he hecho un try-catch para que el programa no pare
00:06:41
pero si lo mete mal el usuario
00:06:45
me mete JJ en lugar de un número
00:06:48
lo fijo a N igual a 10
00:06:51
es decir, en realidad no estoy validando
00:06:53
porque no estoy volviéndolo a pedir hasta que me meta
00:06:56
un número en lugar de una cadena
00:06:59
¿vale? entonces, repito, esa validación
00:07:01
se podría hacer sin un try-catch
00:07:05
como dijimos ayer
00:07:07
tú me lees con ScanNextLine
00:07:08
ScanNextLine jamás va a lanzar excepción
00:07:10
nunca, entonces ahora ya
00:07:13
una vez que has cogido la cadena
00:07:15
vas a ver si
00:07:16
carácter por carácter son un dígito
00:07:19
de la tabla ASCII, te puedes hacer la validación
00:07:21
por código, ¿vale? pero yo
00:07:23
no quiero esa validación, quiero que
00:07:25
hagáis una validación usando
00:07:27
NextInt
00:07:29
usando el bloque TryCatch
00:07:30
y combinándolo con un bucle de alguna manera
00:07:32
para asegurarse de que eso se va
00:07:35
va a estar ahí todo el rato, mientras el usuario no meta un número.
00:07:37
Entonces, vamos a, por tanto, sacarlo a un método para que lo hagáis en un método.
00:07:43
Por ejemplo, esto lo podríamos refactorizar a un método.
00:07:50
Vamos a suponer que yo ahora lo que quiero es esto.
00:07:53
n igual, con lo cual esta inicialización ya no la quiero,
00:07:57
n igual leerNúmero, ¿vale?
00:08:02
leer número, me voy a hacer ahora el método leer número auxiliar
00:08:09
aquí abajo, vale, entonces lo que quiero es que este código
00:08:12
que iría en
00:08:20
leer número, me falta
00:08:24
aquí el escáner, esto, aquí ya
00:08:43
no nos pinta nada, era el ejemplo que habíamos puesto
00:08:57
varias excepciones, vale, leer número
00:09:02
return n
00:09:05
vale
00:09:07
y aquí quito n igual a
00:09:09
vale, entonces esta versión
00:09:11
de leer número es una versión
00:09:14
que en realidad no valida
00:09:16
intenta leer el número
00:09:17
que puede hacerlo, fenomenal
00:09:19
me devuelve n
00:09:21
que no ha podido hacerlo porque me ha dado excepción
00:09:22
me devuelve n igual a 10
00:09:26
luego no es una versión
00:09:28
en realidad que se meta en un bucle
00:09:30
y esté validando
00:09:31
Y no termine hasta que no me pueda devolver un número
00:09:32
Vale, pues
00:09:36
Hacedme ahora
00:09:37
Combinando el try-catch
00:09:40
Uy
00:09:41
La versión con validación
00:09:42
De esto
00:09:48
Joder, ¿qué estoy haciendo?
00:09:49
C
00:09:53
Vale
00:09:53
Vamos a llamarla valida
00:09:58
Para que sea más bonita
00:10:01
Pues venga
00:10:03
Completadme ese método
00:10:11
Con try-catch
00:10:14
y next in
00:10:16
no
00:10:18
vale, un bucle que está ahí todo el rato
00:10:25
y hasta que no se
00:10:29
introduzca un número entero, no sale
00:10:31
vale, pues aquí simplemente
00:10:33
tampoco
00:10:40
quedo, no vamos locos
00:10:41
a ver, aquí
00:10:44
hay que hacer un bucle, lógicamente
00:10:46
hay que hacer un bucle porque hay que estar todo el rato
00:10:50
leyendo
00:10:52
mientras no se cumpla la condición
00:10:53
de número válido, ¿no?
00:10:56
entonces a ver si lo hacemos así directamente
00:10:57
mientras
00:11:00
no válido
00:11:01
si vamos tecleando así
00:11:02
luego ya podemos depurar si queremos
00:11:05
¿vale? o sea esto es un bucle
00:11:07
un bucle que va a estar ahí
00:11:15
pum pum pum pum pum pum
00:11:17
mientras se dé esta condición
00:11:18
que es no válido
00:11:21
¿vale? entonces entramos inicialmente
00:11:22
¿y qué es lo que hacemos? pues que lo que hacemos
00:11:25
es leer el numerito
00:11:27
n igual a scan
00:11:28
punto next int
00:11:31
vale, aquí como podemos
00:11:33
validar que sea no válido
00:11:36
pues en el catch es la única opción
00:11:37
porque si no es válido
00:11:39
next in nos avisa lanzándonos una excepción
00:11:41
es como nos avisa next in de que no es
00:11:43
válido
00:11:45
entonces la forma
00:11:46
de que nosotros tenemos de saber
00:11:49
que no ha sido válido es
00:11:51
porque
00:11:53
estamos entrando en la excepción
00:11:55
entonces
00:11:57
no nos queda más remedio
00:11:59
que capturar esto lógicamente entonces tenemos que capturar esto intenta hacer
00:12:01
esto si no consigues hacerlo porque te sale input miss match exception si no te
00:12:10
sale pues avisa número no válido y no válido seguirá siendo true vale
00:12:21
entonces cuando lo cambiamos a false
00:12:37
para que el bucle salga
00:12:39
después de haberlo leído
00:12:40
si hemos conseguido terminarla
00:12:43
si lo hemos leído de principio a fin
00:12:45
y llegamos a este punto
00:12:47
si llegamos a este punto es porque no nos vamos al catch
00:12:48
no válido
00:12:51
igual a false
00:12:54
y ya está
00:12:54
y ahora cuando hayamos salido ya del while
00:12:56
tenemos la seguridad de que n
00:12:58
es un número válido
00:13:01
porque si no nunca habríamos salido de
00:13:03
vale pues ya está
00:13:04
Por ejemplo
00:13:06
Otra cosa es que luego lo hagáis con un do while
00:13:08
O lo hagáis con
00:13:10
La condición de otra manera
00:13:13
Pero vamos, que la idea es eso
00:13:14
Un bucle que está intentando todo el rato
00:13:16
Intentando todo el rato
00:13:19
Espera que lo llame
00:13:20
Desde aquí
00:13:25
Válido
00:13:27
¿Dónde está?
00:13:29
Voy a llamar a ese método
00:13:30
Se llamaba
00:13:33
Ah, valida número
00:13:38
Vamos a ver dónde está
00:13:39
¿Dónde tengo la llamada valida número?
00:13:42
Ah, está aquí
00:13:54
En candidaturas, estará, ¿no?
00:14:03
Vale, está aquí, sí
00:14:04
Valida
00:14:05
Vale, pues lo llamo aquí en candidaturas
00:14:07
Para leerme un número válido
00:14:13
Valida número
00:14:14
Vamos a...
00:14:15
Y aquí tengo un error en algún sitio
00:14:16
Abajo del todo está, ¿no?
00:14:19
Ah, que tengo dos retunen
00:14:25
Vale
00:14:26
vale, vamos a ver si esto funciona
00:14:28
correctamente
00:14:31
¿cuántos se presentan? entonces si yo aquí
00:14:31
metiera esto
00:14:41
vale, que maravilla
00:14:43
vale, pues vamos a
00:14:47
arreglarlo
00:14:49
no, no, no
00:14:57
el número lo hemos
00:15:12
leído correctamente
00:15:14
Ah, vale, vale, el número lo hemos leído
00:15:15
No, no, no, el número lo hemos leído
00:15:18
Y ahora
00:15:20
No válido se pone a falso
00:15:21
Y ahora como no es válido
00:15:24
Lo ha leído correctamente
00:15:26
Y
00:15:33
Sí, pero no entiendo por qué
00:15:33
No, con el
00:15:39
Yo lo que he intentado ha sido ponerte en el
00:15:41
Que volviese a asignar el n a 0
00:15:44
O a 0
00:15:47
Porque si no se te quedaba con el número que le estaba dando
00:15:47
y buscar trabajo
00:15:50
pero como a ver
00:15:52
si lo que se trata de entender
00:15:54
porque hace eso, no lo entiendo
00:15:57
vamos a ver
00:15:59
no entiendo porque lo hace
00:16:00
vale, pues nada, ya he puesto esto
00:16:02
entonces, esta cláusula se puede añadir
00:16:07
opcionalmente, en el contexto
00:16:09
de lo que estamos haciendo nosotros ahora no pinta mucho
00:16:11
pinta sobre todo cuando has abierto recursos
00:16:13
de ficheros, de sockets
00:16:15
de lo que sea, y tienes que asegurarte
00:16:17
de que tanto si vas por el try
00:16:19
como si ibas por el catch
00:16:21
los recursos quedan cerrados
00:16:22
entonces el finally
00:16:23
¿qué es?
00:16:24
abre un bloque
00:16:27
y lo que hay en este bloque
00:16:28
se ejecuta
00:16:29
tanto si finalizas el try
00:16:31
como si finalizas el catch
00:16:33
¿vale?
00:16:34
si el try es exitoso
00:16:36
y completas todo
00:16:37
se va a finally
00:16:39
hace lo que ponga en finally
00:16:40
y sigue
00:16:41
si el try no es exitoso
00:16:42
porque aparece una excepción
00:16:44
va a catch
00:16:45
completa el catch
00:16:46
y luego a finally
00:16:47
ya está
00:16:48
el finally es un bloque
00:16:49
que se ejecuta
00:16:50
tanto si vas por la rama try como si vas por esta
00:16:51
entonces si hay algo
00:16:54
que queremos hacer en ambos casos
00:16:56
que normalmente es cerrar recursos
00:16:57
que hayamos abierto
00:17:00
para intentar hacer algo
00:17:01
pero como no estamos dando recursos de ningún tipo
00:17:03
ni bases de datos, ni fichero, ni nada
00:17:05
pues la finally en este contexto nuestro
00:17:07
pinta poco
00:17:09
porque si hay algo que queremos hacer
00:17:10
tanto por esta rama
00:17:13
como por esta, pues lo vamos a poner después
00:17:15
y ya está
00:17:17
vale, no necesitamos que sea una cosa
00:17:18
ahí acotada
00:17:21
pero bueno, ahí está el final
00:17:21
bueno, es otro bloque que puedes tú
00:17:24
hacer aquí, asociado al try-catch
00:17:31
y es simplemente un código
00:17:32
que se va a ejecutar
00:17:34
sí o sí, si haya hecho el try
00:17:36
o se haya hecho el catch
00:17:39
se va a hacer sí o sí, entonces
00:17:40
pega en un contexto muy concreto
00:17:42
en el contexto de que lo que tú haces en el try
00:17:45
es acceder a un
00:17:47
fichero, acceder a una base de datos
00:17:49
entonces para hacer eso tienes que abrir un
00:17:50
recurso antes, entonces ese recurso
00:17:53
tú lo quieres dejar, lo tienes
00:17:55
que cerrar luego, lo quieres dejar cerrado
00:17:57
entonces ese cierre de
00:17:59
recursos, se lo voy a poner ahí, lo voy a poner
00:18:00
porque quede
00:18:03
normalmente
00:18:03
para cerrar recursos
00:18:05
de cosas que se hayan abierto
00:18:11
aquí, en el
00:18:15
try-catch, te aseguras de que lo dejas
00:18:17
Ahí cerradito
00:18:19
¿Vale? Pero vamos
00:18:20
Que con el try con recursos
00:18:22
Que es otra variante del try
00:18:25
Que eso tiene más interés verlo con bases de datos
00:18:26
Ni siquiera hace falta
00:18:29
Al final, ni siquiera haría falta
00:18:31
Pero bueno, que sepáis para lo que vale
00:18:33
Por si la veis por ahí
00:18:35
¿Vale? Ya está
00:18:36
Bueno, pues entonces, la otra cosa
00:18:38
Que tenéis que saber de excepciones
00:18:42
La otra cosa
00:18:44
¿Vale? Pues que ha sido una excepción
00:18:45
Una excepción ha sido
00:18:48
una forma de avisarnos de algo
00:18:50
eso ha sido una excepción
00:18:52
el next in
00:18:53
este de aquí
00:18:55
nos ha avisado
00:18:57
¿vale? el next in
00:18:59
nos ha avisado de que algo raro
00:19:01
ha pasado, eso es una excepción
00:19:04
un aviso de que algo raro ha pasado
00:19:05
y luego tú ese aviso
00:19:07
decides qué hacer con él
00:19:09
lo ignoras, con lo cual
00:19:11
el programa se va a parar como eso llegue
00:19:14
o lo capturas con el try catch
00:19:16
¿vale? pero es un aviso
00:19:18
Eso es lo que es una excepción, un aviso de que algo raro ha pasado
00:19:19
Vale, pues igual que ya
00:19:22
Hay tropecientos mil
00:19:24
Posibles avisos programados en Java
00:19:26
Si uno se pone a abrir aquí
00:19:28
De la JRE
00:19:30
Que tiene todas las clases
00:19:32
Que nosotros usamos
00:19:34
Pues aquí, vale, si se pone aquí a abrir
00:19:35
Pues es que aquí se va a encontrar
00:19:38
Con un montón de clases excepción por todas partes
00:19:40
Vale
00:19:42
Vamos a preguntarle
00:19:44
A nuestro amigo, a ver si nos dice
00:19:46
¿Cuántas clases excepción hay en la JRE?
00:19:48
Sí, sí, o cuál quieres tú
00:19:51
Si yo le pregunto a quien quieras
00:19:53
¿Pero por qué os cae mejor este?
00:19:54
Si este es el que manipuló a uno
00:19:57
Y le hizo tirarse por la ventana
00:19:59
¿Por qué os cae también este?
00:20:00
Vale
00:20:04
¿Pero cuál es el enlace de Gemini, el verdadero?
00:20:04
Este, ¿no? Vale
00:20:08
Vale
00:20:09
Clases excepción
00:20:11
Hay
00:20:17
aproximadamente
00:20:18
en la
00:20:20
JDK
00:20:23
estándar, es decir
00:20:25
en las clases que usamos nosotros
00:20:26
para programar
00:20:29
Scanner, System.out, todas esas
00:20:30
pues ¿cuántas de ellas son clases
00:20:32
de excepción? Aproximadamente
00:20:35
¿si tarda mucho?
00:20:36
Ah bueno, que pocas
00:20:42
yo creía que había más
00:20:44
entre 400 y 600
00:20:45
En versiones de JDK 21-25
00:20:48
Porque claro, se han ido sacando
00:20:51
Porque ya pesaba demasiado
00:20:52
¿Vale?
00:20:54
Vale, pues no hay tantas
00:21:00
Yo creía que había más
00:21:02
Vale, no, no queremos esto
00:21:03
¿Y clases en total?
00:21:06
¿De cuántas clases disponemos en la JDK para usarlas?
00:21:13
Porque estamos usando cuatro
00:21:16
Bueno, ahora más
00:21:17
Ahora como usamos ArrayList, LinkedList
00:21:20
Todo eso son clases, claro
00:21:22
Es mucho más impresionante
00:21:24
Es que no me pareció alto
00:21:26
¿Ves? Es que intuye mal
00:21:27
He dicho de hecho que me parecía muy bajo
00:21:29
Bueno, no son tantas
00:21:31
De 4.500 a 5.000
00:21:33
A ver, sin incluir implementaciones
00:21:35
Ni clases internas
00:21:39
Que eso ya lo veremos con interfaces gráficas
00:21:40
Si incluimos implementaciones
00:21:42
De interfaces
00:21:44
Y clases internas
00:21:47
20.000
00:21:49
Pues 20.000 cosas tenemos aquí
00:21:50
Para usar
00:21:56
Y eso sin ningún framework
00:21:57
Cualquier aplicación mínima
00:22:00
Necesita un framework
00:22:02
Un framework es a su vez
00:22:04
Un montón de hard con cosas
00:22:05
Para JavaFX
00:22:07
Para Spring, para todo
00:22:09
Un framework son otras cuantas miles
00:22:12
De clases
00:22:14
Más las que haga uno
00:22:15
Conclusión, una aplicación Java
00:22:16
En realidad estará usando
00:22:18
Cientos de clases
00:22:21
Normalmente
00:22:23
pero claro, solo se distribuyen
00:22:24
las que has hecho tú, porque las otras
00:22:27
las lleva la máquina virtual
00:22:28
se distribuyen las que has hecho tú
00:22:30
y los frameworks de los que tires
00:22:32
ni siquiera, porque ahora
00:22:34
con Mabel, que lo haremos
00:22:36
en JavaFX también, para que lo veáis
00:22:38
tu aplicación se sincroniza
00:22:41
con el repositorio, no tienes que
00:22:43
cargar con lo hard todo el rato
00:22:44
porque si no, las aplicaciones
00:22:46
pesarían un montón
00:22:49
cualquier aplicación pesaría mucho
00:22:50
Tus propias clases si las tiene que tener
00:22:52
Pero los hard de los frameworks
00:22:55
Que tú quieres usar
00:22:57
Si los quieres meter ya eso iría engordando
00:22:58
Entonces está en un repositorio
00:23:01
Y tú pones el enlace a ese repositorio
00:23:02
Y cuando la aplicación arranca
00:23:04
Las descarga
00:23:07
Y las tiene local, eso sí que sí
00:23:08
Las tiene que tener en almacenamiento local
00:23:10
Cuando se, pero bueno
00:23:13
Eso ya lo veremos, vale
00:23:14
Bueno, muy bonito, ¿no?
00:23:15
Entonces, esto venía a cuento de que
00:23:18
Las excepciones son
00:23:20
avisos, ¿vale?
00:23:21
Avisos ya establecidos.
00:23:26
Hay los que nos ha dicho este,
00:23:27
entre 300 y 500 o algo así nos ha dicho.
00:23:30
Pero aún así puede ser que nosotros
00:23:32
queramos avisar de cosas
00:23:34
que ahí no están contempladas.
00:23:36
Por ejemplo, para no engorronar esta,
00:23:39
¿o la engorronamos?
00:23:42
Venga, vamos a engorronarla
00:23:47
y así ya la dejamos completa.
00:23:49
Esta aplicación de los votos.
00:23:51
Nosotros aquí hemos validado
00:23:52
Venga, vamos a
00:23:55
En lugar de engorronarla vamos a hacer
00:23:57
Votaciones B
00:23:58
Me hago aquí un copia y pega
00:24:00
Votaciones
00:24:02
Versión 2
00:24:07
Votaciones 2
00:24:07
Venga
00:24:23
Para no poner
00:24:23
Ala, pues estas votaciones 2
00:24:25
Venga, vamos a situarnos
00:24:30
A ver, por ejemplo, este programa
00:24:39
Nuestro que hacía
00:24:41
Pues establecía las candidaturas con este método
00:24:42
Para eso, para establecer las candidaturas
00:24:48
Pedía primero cuántos se iban a presentar
00:24:52
Haciendo un método que lo validaba
00:24:54
Y luego ya me hacía los candidatos
00:24:57
Todo eso lo hacía el método candidaturas
00:24:59
Vale, y luego ahora ya empezaba nuestro recuento
00:25:02
Que se iba guardando en un map
00:25:06
Y ahora, ¿qué hacía esto?
00:25:08
Pues
00:25:11
Empezaban los votos
00:25:13
Con este for
00:25:17
En este caso eran 10 votos
00:25:18
Empezaban los votos
00:25:20
Lo primero que hacía
00:25:21
Pedir un voto
00:25:22
Para eso
00:25:25
Hacía esta variable y era un do while
00:25:27
Mientras el voto no esté
00:25:29
En los candidatos
00:25:31
Venga vamos a sacar esto a un método
00:25:33
Vamos a refactorizar esto
00:25:36
Vamos a sacarlo a un método
00:25:37
Y que ese método sea pedir voto
00:25:38
Y devolverlo como valor de retorno
00:25:41
¿Vale?
00:25:43
Validando
00:25:45
Que esté en este array
00:25:46
Con lo cual va a haber que pasárselo a ese método
00:25:49
¿Vale?
00:25:51
Entonces vamos a refactorizar el código
00:25:53
¿Sabéis lo que es refactorizar
00:25:55
Dentro de nuestro desarrollo?
00:25:57
Sí, ¿no?
00:25:59
La aplicación, yo no voy a cambiar su funcionamiento
00:26:01
En ningún momento, va a funcionar igual
00:26:04
Voy a cambiar solo el diseño del código
00:26:05
Ya está
00:26:08
Pues vamos a cambiarlo
00:26:08
Sacando esto
00:26:10
¿Lo habéis refactorizado con los diferentes entornos?
00:26:11
No
00:26:13
Bueno, pues
00:26:13
Todos los entornos
00:26:16
Tienen la posibilidad de hacer un refactor automático
00:26:19
Pero es casi más lioso usar eso
00:26:21
Que copiarlo tú y llevarlo a otro método
00:26:23
Es casi, pero aquí podríamos hacer un refactor
00:26:24
Y hay un extract método
00:26:27
Que te dice, sácalo a un método
00:26:29
Vamos a probarlo, a ver
00:26:30
Entonces vamos a sacar esto
00:26:32
Esto de aquí
00:26:34
Vamos a refactorizarlo y sacarlo
00:26:36
A un método, StratMethod
00:26:38
Vale
00:26:39
¿Cómo vamos a llamar al método?
00:26:41
GetBoto
00:26:43
Vamos a intentar
00:26:44
A ver si nos lo hace bien
00:26:47
GetBoto, el escáner no se lo quiero pasar
00:26:48
Este no, este fuera
00:26:51
¿Esto lo puedo borrar? No quiero pasarle este
00:26:53
Eh...
00:26:56
Sí, a ver, no
00:26:58
Editar, declarar, no, lo quiero borrar
00:26:59
No quiero pasarle este
00:27:02
Porque lo va a usar él
00:27:04
Entonces, ¿no puedo yo aquí
00:27:05
Este quitarlo? No puedo, ¿verdad?
00:27:07
¿Eh?
00:27:11
Pero no lo tenía, es que no lo he cogido
00:27:15
No, claro, a ver
00:27:17
Él lo que te dice es lo que necesita
00:27:19
Pero yo el escáner no quiero
00:27:21
Quiero crearlo dentro otra vez
00:27:23
Entonces él te dice, vaya a eso, pero bueno
00:27:24
Voy a hacerlo y luego lo borro y se acabó
00:27:26
Entonces, refactor, rename
00:27:29
Pero tiene que haber, no, rename no
00:27:31
Extraer método, tiene que haber alguna manera
00:27:33
De poder quitarle parámetros, es decir, no, este no lo quiero
00:27:35
Pero bueno, no lo sé
00:27:37
Vale, y ahora le paso candidato
00:27:39
Si me va a devolver un este
00:27:42
Venga, que le ca...
00:27:43
Ah, sí, el método va a ser
00:27:45
GetVoto
00:27:47
Vale, pues venga
00:27:49
Nos gusta este, pues no nos llama
00:27:51
Remedio porque no me deja quitar el escáner
00:27:54
Claro, no me deja quitar el escá...
00:27:55
A ver, ah, bueno, pero puedo hacer
00:27:59
Una cosa, le pongo aquí el... Ah, no, es que
00:28:01
Ponérselo para que no tire de aquí
00:28:02
NewScanner
00:28:05
bueno, ya se lo quito a mano y se acabó
00:28:06
refactor
00:28:09
extraeme eso a un método
00:28:11
venga
00:28:14
getBoto
00:28:15
ese es el nombre del método
00:28:17
entonces, efectivamente
00:28:21
me llama a getBoto, pasándole mi scan
00:28:25
no, yo de este scan paso me hago uno local
00:28:27
para él, porque si no tenemos un poco de problemilla
00:28:29
con los cierres, los buffers
00:28:31
etcétera
00:28:35
Y getBoto mío está aquí debajo.
00:28:36
Le quito el escáner y se lo pongo aquí, local.
00:28:39
Que eso da menos problemas.
00:28:47
A ver, y se lo pago como parámetro.
00:29:04
Este va a tirar del otro.
00:29:06
Entonces comparten buffer, comparten todo.
00:29:09
Y yo he visto, a ver, con consola la verdad es que no trabajo mucho.
00:29:11
Pero es más complicado gestionar el tema de los buffers.
00:29:14
Limpiar el buffer de uno que te ha dejado es mucho mejor.
00:29:19
Que todos trabajen con uno suyo local.
00:29:22
y ya está, entonces en lugar de trabajar
00:29:24
con el que me pasa el otro, que tiene toda su mierda
00:29:26
de arriba, pues me hago uno local
00:29:29
que luego va a desaparecer en cuanto este método termine
00:29:31
vale
00:29:33
vale, pues ya está
00:29:34
getVoto
00:29:37
no he cambiado el código, simplemente
00:29:38
me devuelve el voto
00:29:43
validándolo así y me lo devuelve
00:29:44
y aquí llamo a getVoto y se acabó
00:29:46
no he cambiado el código, lo refactorizo
00:29:49
vale, pero vamos a parar aquí un momentito
00:29:50
y luego se
00:29:53
- 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:00
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 29′ 54″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 128.88 MBytes