20260311 Exception_6 - 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:
tan estupenda
00:00:00
vale, pues venga
00:00:01
vámonos dentro de la clase
00:00:04
que no dentro de ningún método
00:00:05
no, dentro de la clase
00:00:07
es decir, estoy fuera de cualquier
00:00:09
método, pero dentro de la clase
00:00:11
también, efectivamente
00:00:13
podría aquí hacer un
00:00:19
vale, si queréis lo hacemos como una clase anónima
00:00:20
eh, si
00:00:23
claro, pues vamos a ver
00:00:25
como una clase anónima
00:00:27
sería throw new
00:00:28
Exception
00:00:31
Y ahora aquí
00:00:36
Throw new exception
00:00:39
Y dentro de exception
00:00:43
Podríamos hacerle un constructor
00:00:45
Public exception
00:00:46
Ah bueno no claro
00:00:50
Es que el constructor no podríamos
00:00:53
Si necesito
00:00:55
O sí, podríamos hacer
00:00:58
Super.set
00:01:04
Message
00:01:05
A ver si me deja
00:01:09
Para poner el mensajito
00:01:11
Pero vamos, no tendría por qué ponérselo si no quiero
00:01:17
El mensajito
00:01:19
Número
00:01:21
De alumnos
00:01:23
No válido
00:01:25
Vale
00:01:27
no me deja ponerlo ahí
00:01:30
yo creo que me debería, ¿no?
00:01:50
una
00:01:52
exception y la declaro
00:01:52
aquí, ah bueno, no, claro, es que estoy en
00:01:56
no, no
00:01:58
a ver
00:01:58
yo lo que quiero es, no, esto no lo puedo
00:02:02
hacer aquí dentro, lógicamente
00:02:06
Lo que quieres hacer
00:02:07
Un constructor
00:02:09
Vale, es que no sé cómo hacerle un constructor
00:02:10
Para pasarle
00:02:26
Bueno, siempre podríamos dejarla así
00:02:27
Vale
00:02:29
Así siempre podríamos hacerlo
00:02:30
Ahora podemos mirar
00:02:33
Con esto ya estoy creando un objeto
00:02:34
Lo que pasa es que no tiene nombre
00:02:37
Al no tener nombre
00:02:39
Luego en el catch, ¿qué pasa?
00:02:41
Claro, aquí no es el mejor contexto
00:02:43
Hacerla anónima, porque precisamente lo que queremos es el nombre
00:02:45
Para luego capturarla
00:02:47
Vale, aquí no sería el mejor concepto
00:02:48
Claro, el mejor sitio para hacerla anónima
00:02:51
Nada, nada, nada, olvídate, olvídate
00:02:53
No hemos hecho nada, ¿vale?
00:02:56
No hemos hecho nada
00:02:58
Vale, pues entonces vamos a hacer una clase interna
00:02:58
Aquí
00:03:02
Vale, pues venga
00:03:03
Vamos a
00:03:18
Que herede de Runtime Exception
00:03:21
Para no darle tanto bombo
00:03:25
Aquí está mi clase
00:03:27
A ver, claro, no se ve bien
00:03:31
Porque os habéis emperrado en que esté en negro
00:03:36
Ya, pero no lo puedo cambiar, ¿no?
00:03:38
¿Lo veis?
00:03:47
¿Lo cambia a blanquito?
00:03:49
Cualquier cosa menos cambiar a blanco
00:03:53
¿Se ve?
00:03:55
Vale
00:04:00
pues fijaos, esta es una clase
00:04:01
interna
00:04:03
está dentro de la otra
00:04:05
al nivel de cualquier otro método, dentro de la otra
00:04:11
entonces yo puedo
00:04:14
poner una clase dentro de otra
00:04:16
y es una clase más
00:04:17
con sus propiedades, sus métodos
00:04:22
bueno, esta en particular solo va a tener un
00:04:25
constructor, que es a partir del
00:04:27
cual le paso yo el mensajito
00:04:29
¿has visto ya a Mila que han liado por decir que
00:04:31
hagamos el ejercicio?
00:04:40
Pues es que, claro, me puede la pasión y al final...
00:04:42
¿Cómo que si lo he guardado?
00:04:49
Que si lo he guardado, está aquí arriba.
00:04:57
El número de alumnos es negativo.
00:05:00
Punto y coma.
00:05:10
Vale, una clase interna, es decir, una clase dentro de otra,
00:05:14
es una clase más con sus propiedades
00:05:17
sus métodos, lo que yo quiera
00:05:19
es una clase más y cuando esto se
00:05:20
precompila, nosotros
00:05:22
veremos en el sistema
00:05:24
operativo, podríamos ver
00:05:27
que se ha generado un número
00:05:28
de alumnos negativo exceptio en punto
00:05:31
clas, igual que se generó el main
00:05:32
punto clas, es una clase más
00:05:34
es una clase más
00:05:36
la pregunta es, ¿tiene alguna
00:05:37
implicación que esté declarada como clase
00:05:41
intea respecto como clase aparte? ¿tiene alguna?
00:05:43
sí, sí tiene alguna
00:05:45
es una clase más con sus propiedades y métodos
00:05:47
de las cuales podemos instanciar objetos
00:05:49
podemos instanciar objetos de esta
00:05:51
pero sí tiene alguna implicación
00:05:52
el que esté declarada adentro en lugar de aparte
00:05:55
¿qué implicación tiene?
00:05:57
que para que existan objetos de esta clase
00:05:58
es obligatorio
00:06:01
que existan objetos de la clase
00:06:03
que la contiene
00:06:05
esa es la restricción
00:06:06
¿es como una tribu?
00:06:08
la idea sí es como un atributo
00:06:09
en realidad, pero no es que
00:06:15
ese objeto esté dentro del otro
00:06:16
que lo describa, sino que
00:06:19
para que uno exista
00:06:21
el otro tiene que existir
00:06:22
es como la existencia de uno le da permiso
00:06:24
al otro para existir
00:06:27
y lo tiene bajo su dominio
00:06:28
por ejemplo
00:06:30
imaginaos
00:06:32
una aplicación que gestione
00:06:34
alumnos y matrículas
00:06:37
las matrículas son de alumnos.
00:06:39
Con lo cual, en esta aplicación uno puede decir,
00:06:42
oye, no tiene sentido que en mi aplicación haya objetos matrículas sueltos.
00:06:45
No tiene sentido.
00:06:48
Solamente habrá objetos matrículas si hay objetos alumnos estaciados.
00:06:50
No tiene sentido que haya objetos matrículas sueltos.
00:06:53
Vale, entonces nosotros podemos, como he dicho hasta ahora,
00:06:57
pues hacer nuestras aplicaciones clase alumno, clase matrícula,
00:06:59
que el alumno tenga una matrícula dentro y ya está.
00:07:03
Y ese es el diseño habitual y no pasa nada.
00:07:05
¿vale? pero
00:07:07
¿qué pasa si nosotros metemos matrícula
00:07:09
en lugar de como clase aparte, la metemos como
00:07:12
clase interna alumna? pues lo que
00:07:14
pasa es que solamente
00:07:16
vamos a poder hacer un new matrícula
00:07:17
la aplicación te prohíbe
00:07:19
instanciar
00:07:21
matrículas a menos que
00:07:23
no haya un alumno creado previamente
00:07:25
que le dé permiso a ese
00:07:27
¿vale?
00:07:30
entonces eso es una restricción que puede
00:07:32
estar bien y nos puede gustar porque
00:07:34
así nos aseguramos de que la aplicación
00:07:35
no va a hacer un new matrícula suelto
00:07:37
no asociado a ningún alumno
00:07:40
¿vale?
00:07:42
entonces en una aplicación
00:07:44
tienes alumno por un lado, matrícula por otro
00:07:45
tú puedes hacer un new matrícula y se queda una matrícula
00:07:47
por ahí suelto, que luego resulta
00:07:49
que no metes dentro de ningún alumno
00:07:51
y eso a lo mejor te puede provocar un efecto extraño
00:07:53
si tú haces matrícula
00:07:55
como clase interna
00:07:57
solamente vas a poder hacer un new matrícula
00:07:58
asociado
00:08:02
a un objeto
00:08:04
alumno, con lo cual
00:08:05
ya por programa
00:08:07
estás obligando a que tenga que existir
00:08:08
un objeto alumno antes de poder hacer un
00:08:11
neomatricula. Entonces, bueno, puede tener
00:08:13
cierto sentido. Por ahí viene lo de las clases
00:08:15
internas. ¿Vale?
00:08:17
¿Pues hay que meter la clave matricula en la
00:08:19
clase alumna? Sí.
00:08:21
Entonces, aquí
00:08:23
nosotros hemos metido esta clase dentro de la otra.
00:08:24
¿Del main? No, del main
00:08:27
no, de la otra clase. El main es un método.
00:08:29
La clase interna
00:08:32
no está dentro de un método, está dentro de la
00:08:33
clase directamente. Entonces, esta clase
00:08:35
se ha quedado con
00:08:37
esta clase se ha quedado con
00:08:38
su propiedad,
00:08:41
su método main
00:08:43
que empieza aquí y acaba
00:08:44
aquí, su método leer
00:08:47
número que empieza aquí y acaba aquí
00:08:49
y ahora una clase interna
00:08:51
que empieza aquí y acaba aquí. Las clases
00:08:53
internas no están dentro de método, están dentro de otra.
00:08:55
Vale. Entonces, al meter yo
00:08:57
la clase de esta excepción aquí dentro,
00:08:59
primero, dejo la aplicación
00:09:01
más limpita, porque no pongo una clase aparte
00:09:03
ahí en mi lista de paquetes que en realidad
00:09:05
pinta poco
00:09:07
y segundo
00:09:08
obligo a que exista
00:09:11
un objeto de esta clase
00:09:13
para que pueda instanciarse
00:09:14
una excepción de estas, pero eso aquí
00:09:17
a mí no me molesta
00:09:19
¿por qué? porque ¿cuándo voy a hacer yo
00:09:20
el new número alumnos negativos?
00:09:23
el new número alumnos negativos
00:09:25
lo estoy haciendo aquí
00:09:26
lo estoy haciendo aquí dentro
00:09:28
entonces al estarlo haciendo
00:09:30
Aquí dentro
00:09:32
¿Vale?
00:09:34
Pues entonces, evidentemente
00:09:37
Va a existir un objeto
00:09:39
Que es el que está haciendo el NIM
00:09:40
¿Vale?
00:09:43
Pues puede ser
00:09:47
Sí, Bea
00:09:51
Dime, dime
00:09:53
¿Quién?
00:09:59
Pues ahora hemos hecho
00:10:02
El unir
00:10:04
Poniendo que si es el M
00:10:06
Se lanza el error
00:10:07
Pero eso no lo podemos hacer dentro de la clase
00:10:09
De que si detecta un número negativo
00:10:11
O algo así, no sé
00:10:14
Pero es que entonces
00:10:16
No, pero entonces estás lanzando el método al que te llamó
00:10:17
Es decir, no
00:10:20
Tú dices
00:10:21
Claro, tú dices hacer aquí
00:10:23
El next sin y si n es negativo
00:10:26
No, no, no, no me refiero a eso
00:10:27
Claro, porque ya lo tiene él dentro
00:10:29
Claro, pero
00:10:35
Pero porque esa excepción ya existe
00:10:37
Bueno, todos lo hemos tenido que hacer
00:10:38
Claro, nosotros nos hemos tenido que hacer el método
00:10:42
Que, a ver
00:10:44
Tú podrías haber hecho en todo caso esto
00:10:46
No haber hecho el método
00:10:48
Si no haber hecho esto
00:10:49
El
00:10:51
Scan.nextInt
00:10:52
¿Vale?
00:10:59
Y aquí
00:11:02
Si n
00:11:03
Es menor que 0
00:11:04
Entonces hacer aquí
00:11:08
El propio throw
00:11:09
Entonces, ¿a qué te refieres?
00:11:11
Me refería a hacerlo dentro de la clase
00:11:17
¿De qué clase?
00:11:20
O sea, si nos metemos dentro de nuestra propia sección
00:11:21
Que es esta, de aquí
00:11:24
¿Cómo podemos hacer que esa
00:11:27
Porque tiene igual con inputMismatch
00:11:30
Ya, lo estamos haciendo
00:11:31
InputMismatch es un método que cuando detecta
00:11:34
Que no son alfanuméricos
00:11:36
Te hace el throw, el dentro
00:11:38
Pues es lo mismo
00:11:40
Esa clase tendrá dentro algo para detectar
00:11:41
Esta clase, claro, tiene dentro
00:11:44
No, el input mismatch es una excepción
00:11:46
Que no tiene nada
00:11:51
Lo que tiene dentro es este
00:11:52
¿Ah, sí?
00:11:54
Claro, como todas las excepciones
00:11:56
Pero si esto lo abrimos ayer, también estabas durmiendo en ese momento
00:11:58
No, no, no, estaba despierto
00:12:00
Ayer estaba durmiendo
00:12:02
No tiene nada, input mismatch
00:12:03
La tienes aquí
00:12:06
Esta es la clase scanner
00:12:08
Ah, vale, vale
00:12:10
Es lo que tiene dentro el throw
00:12:11
Claro, tiene dentro el throw, new, input, mismatch, exception.
00:12:13
Tiene esto.
00:12:17
Entonces nosotros hemos hecho lo mismo.
00:12:19
Vale, vale, vale.
00:12:21
¿Vale?
00:12:22
Vale, vale.
00:12:22
Vale, entonces, aquí.
00:12:24
Y todo esto era para leer la cantidad de alumnos.
00:12:28
Sí, pero todavía ha quedado bueno, ¿eh?
00:12:31
Claro, todavía ha quedado...
00:12:33
Ya, un par.
00:12:34
Vale, vamos a...
00:12:36
En 10 minutos lo tenemos metido en el map.
00:12:37
Entonces, esta a mí no me gusta
00:12:39
Porque tendríamos que arreglarlo del next line
00:12:42
Y da pereza
00:12:44
Entonces esta la vamos a dejar comentada
00:12:45
Y bueno, venga, vamos a dejar la primera de las opciones
00:12:47
Que decís que es la que más os ha gustado
00:12:50
Esta
00:12:52
Vale
00:12:57
Venga, esta no funcionaba
00:12:58
Esta de aquí, ¿cuántos aún nos quiere?
00:13:00
Esta a mí me parece muy fea
00:13:03
Porque es que un ifel si hay tan gordote
00:13:05
Era mejor casi poner aquí
00:13:07
Es que a mí me dejó poner dos mensajes
00:13:08
¿Eh?
00:13:10
Bueno
00:13:13
Pero en la otra también lo puedes modificar
00:13:13
Si quieres, eso lo puedes poner siempre
00:13:20
Este
00:13:22
Porque me dice no sé qué
00:13:26
Me falta una llave
00:13:28
Ahí, do while
00:13:30
Catch
00:13:32
Vale
00:13:34
Y, ah, me falta esta llave, vale
00:13:35
Vale
00:13:39
Vale, pues venga, ya hemos leído el número
00:13:41
Ahora vamos a empezar a leer a los alumnos
00:13:44
Para meterlos en el map
00:13:46
Venga, aquí estamos
00:13:47
Vamos a leer a los alumnos
00:13:50
Desde i igual a 0
00:13:52
Mientras i sea menor que n
00:13:55
¿Dónde estamos? Aquí
00:13:56
Sea menor que n incrementando i
00:14:04
Vale, pues vamos a pedir
00:14:07
Los datos del alumno
00:14:09
Nombre
00:14:10
Igual a
00:14:11
scan.next
00:14:24
next line
00:14:26
¿vale?
00:14:30
y ahora
00:14:33
año
00:14:35
o nacimiento
00:14:36
que es el entero
00:14:39
nacimiento
00:14:45
igual a scan.next
00:14:48
int
00:14:51
vale, y ahora ya
00:14:52
vamos a crear
00:14:56
el alumno
00:14:58
Vale, pues mi alumno
00:14:59
Ah, ¿cómo creamos al alumno?
00:15:01
Pues con el método estático
00:15:05
Crear alumno
00:15:07
¿Vale? Crear alumno
00:15:09
Con nombre
00:15:11
Y nacimiento
00:15:14
Ahora, ¿el alumno puede ser null o no?
00:15:16
Pues si el alumno es diferente de null
00:15:22
Porque crear alumno
00:15:24
Era el que me dice
00:15:28
Oye tú
00:15:29
Si el número es negativo
00:15:30
el nacimiento me devuelves un nul
00:15:33
vale
00:15:36
pues entonces si es diferente de nul
00:15:37
que será si el año es negativo
00:15:41
ahora ya ponemos en nuestro map
00:15:43
de alumnos
00:15:45
que ponemos el nombre del alumno
00:15:46
que sería a.getNombre
00:15:53
y al propio alumno
00:15:56
es que estamos todavía aquí
00:15:57
eso es en el 3
00:16:03
vale, entonces esto era simplemente para
00:16:05
ejemplificar esto
00:16:08
Vale, que la forma de comunicarse ahora mismo en el punto 1 es muy fea. La forma de comunicarse, el alumno tiene un año negativo o no de nacimiento, la forma de comunicarse es muy fea, es devolviendo nul. Esto es muy feo, porque yo tengo que saber que si este devuelve nul es porque el año es negativo y decirlo es una forma de comunicarse muy fea.
00:16:10
Con esto tendríamos nuestro map de alumnos, pero que forma tan poco legible de deducir qué pasa en mi ELSE. Si el alumno es nul, ¿por qué? Queda un poco feo. Pues no sé por qué es nul. No lo sé.
00:16:31
alumno null, pero no sé por qué
00:16:49
alumno null, con lo cual
00:16:51
no puedo meterlo en el map, pero no sé
00:16:56
por qué es null, solo sé que me ha devuelto null
00:16:58
entonces es una comunicación muy fea
00:17:00
una comunicación muy fea
00:17:02
por eso es por lo que estaba el punto 3
00:17:04
que es, oye tú
00:17:06
oye, este método crear alumno
00:17:07
eso de devolver null
00:17:10
es muy poco explicativo, en lugar
00:17:12
de eso, avisa
00:17:14
de que no has podido crearlo
00:17:16
por un mensaje específico, entonces
00:17:18
ahora este método
00:17:20
se convertiría
00:17:21
en el bueno
00:17:24
crear alumno bien
00:17:25
y el crear alumno bien
00:17:29
en lugar de esto
00:17:34
me lanzaría un
00:17:35
nacimiento
00:17:39
negativo
00:17:42
este crear
00:17:44
alumno ya si está bien
00:17:53
porque tu forma de avisar es
00:17:54
con un aviso específico
00:17:57
ha pasado esto
00:17:59
que el nacimiento es negativo
00:17:59
Ha pasado este y no me gusta
00:18:02
Sin embargo, el método de arriba
00:18:04
Su aviso es muy poco específico
00:18:06
Que es, hala, toma null
00:18:08
Toma null y ya está
00:18:09
Bueno, no gusta
00:18:11
Entonces mejor este, vamos a crear la clase
00:18:12
Ah, claro, es que he puesto aquí el retun
00:18:15
Perdón, es que estaba volviendo este loco
00:18:44
Ah, sí
00:18:46
Perdón, que tenía ahí impuesto el retun
00:18:47
Y ahora me falta el new
00:18:50
Ahora, ya está
00:18:56
Si el nacimiento es negativo
00:18:59
Aviso con un aviso específico
00:19:01
Lánzame una nueva nacimiento negativo excepción
00:19:03
Me creo mi clase
00:19:05
Y ya está
00:19:07
¿Que quiero un mensajito?
00:19:14
Pues mensajito
00:19:16
Pues porque no me estáis haciendo ni caso
00:19:17
Y vamos con prisa
00:19:39
Esencialmente por eso
00:19:40
Bueno, bueno
00:19:41
Aquí estáis todos ya pensando en recoger
00:19:43
Año negativo
00:19:47
Vale
00:19:58
Ahí está
00:20:00
Dentro de
00:20:03
Esto debería ponerlo en un paquete aparte
00:20:05
Un paquete excepciones
00:20:07
Debería ponerlo en un paquete exception
00:20:08
Ya que la he hecho fuera
00:20:10
Voy a ponerla aquí
00:20:12
Bien, exception
00:20:14
Exception
00:20:17
Y voy a moverla de aquí a aquí
00:20:18
¡Hala! Ya la tengo aquí
00:20:22
Y ya está
00:20:29
¿Vale?
00:20:35
Y ahora ya esta clase ya sí que avisa
00:20:39
Correctamente, a ver si
00:20:41
Esta clase sí avisa
00:20:42
Correctamente, pero claro
00:20:45
Oye, que tienes que avisar
00:20:47
¿Por qué? Porque la ha hecho
00:20:48
Exception
00:20:50
Recordad que
00:20:51
exception o runtime exception
00:20:53
como uno quiera
00:20:55
si la dejamos como exception
00:20:56
pues entonces tengo que avisar
00:20:59
que este método puede dar excepción
00:21:00
pues a la throws
00:21:02
y ahora ya
00:21:04
mi app alumnos
00:21:06
si yo creo alumno bien creado
00:21:08
bien creado
00:21:11
automáticamente en cuanto crea alumno
00:21:12
bien creado ya pum
00:21:14
ya desde tiempo de compilación de desarrollo
00:21:16
ya me salta el aviso rojo que es lo bueno y lo bonito
00:21:18
que yo estoy haciendo código
00:21:21
Y automáticamente vea
00:21:23
Uy, ¿por qué se ha puesto rojo?
00:21:24
Espérate, es que esto puede ser
00:21:27
Que dé un aviso
00:21:29
De que el año es negativo
00:21:31
Cuidado, pues entonces si el año es negativo
00:21:32
Yo ya sé que tengo que capturar, etc
00:21:34
Entonces mucho mejor que no decir nada
00:21:36
Y si me da un null, pues ¿qué hago con el null?
00:21:38
Pues yo qué sé
00:21:40
Entonces ahora esto yo ya lo podría capturar
00:21:41
Y ya
00:21:45
Haría aquí lo que quisiera
00:21:49
Vale, capturarlo, si el año es negativo exception, pues nada, no hago nada, y si, vale, ya haría
00:21:52
lo que quisiera, lo metería en un bucle, lo que fuera, bueno, lo dejamos así, con
00:22:11
la excepción pendiente de capturar, pero luego ya la podemos capturar, vale, venga,
00:22:18
- 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:
- 2
- Fecha:
- 17 de marzo de 2026 - 12:20
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 22′ 25″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 95.30 MBytes