Manejo Exception parte 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:
Vale, todo lo que digáis puede ser grabado en este vídeo.
00:00:00
Entonces, estamos hablando de excepciones.
00:00:07
Y las excepciones, hemos visto que son estos errores que ocurren a tiempo de ejecución,
00:00:14
de que menos mal no podía saber que existían antes, podía imaginar que sí podían explotar algo,
00:00:26
pero que no puedo estar seguro de que va a pasar o no.
00:00:34
Y que entonces hemos visto que hay este sistema del try-catch, que me permite decir, tú inténtalo,
00:00:37
trae, y si algo pasa, catch.
00:00:44
Hemos visto que tenemos el objeto exception, que es la llave que la maquina intenta crear,
00:00:48
y lo más preciso posible con respecto a la...
00:00:59
Entonces, ¿cómo se lanzan las excepciones?
00:01:22
Es decir, ¿cómo puedo hacer yo que en un determinado momento la ejecución de mi programa,
00:01:27
en un cierto momento se dé cuenta que algo aquí está yendo mal,
00:01:34
y diga, oye mira, en este momento sí pasa esta cosa o bajo determinadas condiciones,
00:01:40
lo único que puedes hacer es explotar y lanzar una excepción.
00:01:46
Esta excepción luego podrá ser capturada con el try-catch que hemos visto antes.
00:01:51
Entonces yo tendré este método que lanza las excepciones,
00:01:58
no lo pronunciaré nunca más, nunca viene.
00:02:02
Las exceptions las tendré dentro de un try-catch,
00:02:05
y si llega a lanzar la excepción, pues lo recogerá el catch apropiado.
00:02:09
Entonces, para lanzar esta excepción se usa el comando throw.
00:02:15
Entonces, en un determinado momento de mi programa,
00:02:24
de un método o de algo que estoy programando,
00:02:28
le puedo decir que if no sé qué no sé cuánto,
00:02:31
si pasa esto, si la cosa no va bien,
00:02:34
o tengo que indicar que aquí mi programa tiene que fallar
00:02:37
porque no puede seguir adelante porque ha tenido un problema,
00:02:41
puedo lanzar una excepción.
00:02:44
Claramente crearé este objeto exception,
00:02:47
o crearé un objeto de una clase mía que es la xException,
00:02:50
que es hereda de exception,
00:02:56
y una vez que he creado ese objeto, lo lanzo.
00:02:59
Lo que se le pasa, o sea, el objeto este de aquí,
00:03:05
tiene que ser o exception o una subclase de exception.
00:03:08
Lo que decíamos antes.
00:03:13
Por lo tanto, incluirá todos los métodos que hemos visto antes,
00:03:15
más si yo estoy haciendo un manejo de excepciones,
00:03:19
míos, personales,
00:03:23
entonces a lo mejor yo puedo necesitar algunas cosas más,
00:03:25
algunos datos más o algunos métodos más,
00:03:28
y como me estoy creando mi propia clase que está en excepciones,
00:03:31
puedo añadir lo que me da la gana,
00:03:35
además de lo que hace exception normalmente.
00:03:37
Digamos que exception me da la infraestructura,
00:03:41
el esqueleto general de que todas las excepciones tienen que tener,
00:03:45
y a eso yo le añado lo que yo necesito.
00:03:49
Cuando se usa el throw,
00:03:57
se sale inmediatamente del bloco de código actual.
00:03:59
Es decir, que cuando llego a ejecutar un throw,
00:04:02
quiero decir que allí es que tengo que bloquear la ejecución.
00:04:04
No es que lanzo el throw y luego sigo con los datos que están detrás.
00:04:08
Porque si llego a ejecutar uno de estos,
00:04:12
quiere decir que ya ha llegado el momento de hacer saber
00:04:14
a quién ha lanzado o quién está trabajando con este método,
00:04:21
que aquí ha habido un error.
00:04:25
Si hay un error, no puedo seguir adelante.
00:04:27
Si yo estoy haciendo una división por cero,
00:04:29
no puedo decir que hago una división por cero
00:04:31
y sigo adelante utilizando el resultado de esta operación.
00:04:33
Si yo intento acceder a una celda que no existe
00:04:37
y luego desde esta celda tengo que sacar los datos
00:04:40
y hacer algo con esos datos,
00:04:43
si no he podido sacar, pues no puedo seguir adelante.
00:04:44
Si el bloqueo está asociado a la cláusula catch adecuada,
00:04:48
para el tipo de excepción generada,
00:04:51
se ejecuta ese cuerpo de catch.
00:04:53
O sea que si yo cuando lanzo throw,
00:04:55
esto está en un try catch y hay un catch para esa excepción,
00:04:57
pues se ejecuta ese catch.
00:05:01
Si no, se sale directamente del bloqueo
00:05:03
o del método donde estoy
00:05:07
y se lanzará esta excepción
00:05:09
a quien me ha llamado y de allí a quien me ha llamado
00:05:14
y de allí a quien me ha llamado
00:05:17
hasta que encontre una cláusula catch
00:05:18
que me permite depillarme.
00:05:22
Es decir, imaginaos que yo tengo el método A
00:05:25
que llama al método B, que llama al método C
00:05:28
y es en el método C donde se lanza la excepción,
00:05:31
donde se hace la throw.
00:05:34
Lo que se intentará hacer es
00:05:36
volver atrás en las llamadas
00:05:39
hasta buscar si uno de estos métodos
00:05:42
tiene un try catch con un catch
00:05:45
que pille este tipo de excepción.
00:05:47
Entonces, si el try catch
00:05:50
yo lo he metido directamente en el método C,
00:05:51
pues usaré el catch de ese método.
00:05:54
En cierto sentido, al explotar la excepción,
00:05:56
el método mismo intenta recuperarse.
00:05:59
Si en vez de no lo he hecho así,
00:06:02
el método C no tiene ningún try catch,
00:06:04
podría ser que el método B,
00:06:06
el que llamaba al método C,
00:06:08
tenga un try catch
00:06:10
y que el método B al método C
00:06:12
haya sido llamado dentro del try.
00:06:14
Entonces, en este caso voy a mirar
00:06:17
si algún catch de ese bloque
00:06:19
me permite pillar esta excepción.
00:06:21
Y si no, voy al método A.
00:06:24
Y si no llego al método A,
00:06:26
llegaré a un cierto momento
00:06:27
que llegaré al main, digamos,
00:06:28
al que ha lanzado,
00:06:32
y a ese punto no he manejado la excepción.
00:06:33
Si no he manejado la excepción, ¿qué pasa?
00:06:37
Pasa lo que ha pasado hasta ahora
00:06:41
cuando salía una excepción.
00:06:43
¿Qué os ha pasado ahora?
00:06:44
Hasta hoy no hemos gestionado ninguna excepción
00:06:45
y si yo llego arriba, arriba, arriba, arriba
00:06:51
y nadie ha hecho un try catch,
00:06:53
nadie ha hecho algo para manejarla,
00:06:55
pues simplemente bloqueo la ejecución del programa
00:06:57
y te escribo un pantallazo de
00:07:00
hoy mira, ha pasado esto.
00:07:02
Y se acabó.
00:07:04
No has gestionado el error.
00:07:05
¿Sí?
00:07:09
El proceso continúa hasta llegar
00:07:12
al método main de la aplicación.
00:07:13
Si ahí tampoco existe una causa catch adecuada,
00:07:14
la máquina Java virtual finaliza su ejecución
00:07:17
y da un mensaje error.
00:07:20
¿Dudas?
00:07:22
También está otra cosa que es el throws, ¿vale?
00:07:27
Con la S.
00:07:31
Este de aquí es algo que se pone
00:07:33
no dentro del cuerpo de un método
00:07:35
sino en el prototipo del método,
00:07:38
en la declaración del método,
00:07:40
como es aquí, ¿vale?
00:07:42
Por ejemplo, public void método F
00:07:43
que no pilla parámetros,
00:07:46
throws, una excepción.
00:07:47
Esto quiere decir que estás declarando
00:07:50
que el método F,
00:07:52
dentro de su ejecución,
00:07:55
puede en un determinado momento
00:07:57
lanzar una excepción de tipo E.
00:08:00
Tú estás diciendo sustancialmente
00:08:05
a quién te va a utilizar,
00:08:07
a quién va a utilizar F,
00:08:09
cuidado que cuando usas F
00:08:11
el resultado podría ser que explote
00:08:14
porque F hace determinadas operaciones
00:08:17
como por ejemplo hacerse un array
00:08:19
y haga un determinado momento
00:08:21
que si hace de malo el array
00:08:23
pues te lanzaría un índice autobando derecho.
00:08:24
De esta forma, yo desde fuera
00:08:30
que voy a utilizar F,
00:08:33
quiero meterlo dentro del try-catch
00:08:35
que pille ese tipo de excepción.
00:08:40
En vez de E puede ser índice autobando derecho.
00:08:43
E sería una excepción genérica de la clase E.
00:08:46
Si en el código método F
00:08:50
se lanza una excepción de la clase E,
00:08:52
sea cual sea porque la has creado tú,
00:08:54
es una clase tuya o una de que ya existe,
00:08:56
pues entonces en el prototipo
00:08:58
deberías poner throws E.
00:09:00
Es un modo para decir
00:09:03
mira, aquí hay un problema
00:09:06
pero no lo voy a gestionar yo,
00:09:08
lo voy a pasar por arriba.
00:09:10
Quien me llama tiene que estar consciente
00:09:12
que aquí puede haber un error
00:09:14
y entonces lo tiene que manejar él.
00:09:16
Y yo no te voy a manejar directamente
00:09:19
porque yo no siempre,
00:09:22
desde mi perspectiva optimista quizás,
00:09:24
yo voy a hacer las cosas con E
00:09:26
pero si explotara, explotará con esta excepción
00:09:28
y entonces se va a avanzar.
00:09:31
Esto pasa por ejemplo en cosas como
00:09:33
el acceso a ficheros.
00:09:35
Si tú accesas a ficheros,
00:09:37
podría ser que el fichero no exista
00:09:38
y que tú intentes leer un fichero que no existe.
00:09:40
Entonces algunos métodos
00:09:43
para creación de ficheros,
00:09:45
para buscar ficheros y cosas por el estilo
00:09:46
lanzan errores de tipo IOException,
00:09:48
Input Output Exception.
00:09:52
Y tú dices,
00:09:54
tiene quien va a crear el fichero,
00:09:55
manejar el fichero,
00:09:58
que tener en cuenta
00:10:00
que podría en algún momento
00:10:01
haber una IOException
00:10:02
y que entonces tendrá que manejar
00:10:04
y ver qué pasa cuando va a saltar
00:10:06
una de estas excepciones.
00:10:08
Esto sirve para que potenciales usuarios de EFE
00:10:11
sepan a qué atenerse.
00:10:14
Yo sé que si voy a utilizar EFE
00:10:16
me puede pasar esto,
00:10:18
por lo tanto, lo voy a manejar.
00:10:19
Si un método lanza más de un tipo de excepciones
00:10:21
se indican detrás de throws
00:10:23
separadas por comas.
00:10:24
Por ejemplo, público EFE,
00:10:26
throws E1, E2, E3.
00:10:27
Esto E1, E2, E3 no son objetos,
00:10:30
son clases.
00:10:32
Son excepciones.
00:10:34
Siempre lanza las excepciones.
00:10:41
¿Cuándo en un código utilizamos
00:10:44
métodos que lanzan potencialmente excepciones?
00:10:46
Siempre todavía tengo throws.
00:10:49
Estamos obligados a hacer
00:10:51
una de estas dos cosas.
00:10:52
Vamos a ver si yo tengo un código
00:10:54
y en este código estoy utilizando
00:10:56
un método que tiene declarado un throws.
00:10:58
Puede hacer dos cosas.
00:11:01
O proteger esta llamada del método
00:11:03
con un try catch.
00:11:05
Proteger esta llamada del método
00:11:07
con un try catch, fenomenal.
00:11:09
O decir que yo también lanzo esa excepción.
00:11:11
¿Arriba?
00:11:15
Yo soy un método que lanza la excepción.
00:11:17
Tengo otro método que usa ese método
00:11:21
que lanza la excepción.
00:11:23
Tiene dos opciones.
00:11:25
O manejo la excepción,
00:11:27
o la lanzo para ti.
00:11:29
Y será quien me ha llamado a mí
00:11:31
a hacer algo.
00:11:34
Depende un poco de cómo queréis
00:11:36
estructurar vuestro programa.
00:11:38
Esto delega la responsabilidad
00:11:43
de manejo a otras clases invocantes.
00:11:45
Y de ahí viene el sentido
00:11:47
del print stack trace.
00:11:49
El print stack trace que me permite saber
00:11:51
todas las llamadas de
00:11:53
quién me ha llamado a mí, etc.
00:11:55
Para saber más o menos
00:11:59
dónde es que ha explotado
00:12:01
y quién estaba llamando
00:12:03
para saber quién se debería haber
00:12:05
encargado de eso.
00:12:07
Y ver un poco.
00:12:09
Si la excepción lanzada es hija
00:12:11
de runtime exception,
00:12:13
no es necesario manejarla.
00:12:15
Esto es interesante.
00:12:17
Tenerlo por ahora allí.
00:12:21
Hago esta transparencia aquí
00:12:23
y luego os lo digo.
00:12:25
Pero hay excepciones especiales
00:12:27
si lo que se está lanzando
00:12:29
es una runtime excepción
00:12:31
o hijos de la runtime excepción,
00:12:33
no estoy obligado
00:12:35
a ni hacer la trace
00:12:37
ni hacer el breakage.
00:12:39
Vosotros habéis
00:12:45
utilizado
00:12:49
arrays.
00:12:51
¿Os ha salido alguna vez
00:12:55
una excepción?
00:12:57
¿No habéis puesto nunca un breakage?
00:12:59
Acceder por allí
00:13:03
puede causar una excepción
00:13:05
pero nadie os ha obligado
00:13:07
a usar un breakage para pillar.
00:13:09
¿Os habéis hecho divisiones?
00:13:11
X dividido A
00:13:15
siendo una variable.
00:13:17
¿Y si esa A era cero, no debería haber explotado?
00:13:19
¿No habéis protegido
00:13:21
ese código con breakage?
00:13:23
Nos ha dado un error de
00:13:25
oye mira, aquí habría debido
00:13:27
proteger este código.
00:13:29
Porque estas excepciones
00:13:31
tanto divide by zero
00:13:33
como reindex out of bound
00:13:35
son hijas
00:13:37
de runtime excepción.
00:13:39
Entonces nos obliga
00:13:41
a manejarlas.
00:13:43
Hay otras como por ejemplo
00:13:45
la IOException
00:13:47
que si vuestro programa, si vuestro método
00:13:49
lanza una IOException
00:13:51
os da un error a tiempo de compilación
00:13:53
si no la habéis puesto
00:13:55
en un breakage.
00:13:57
Dependiendo del tipo de excepciones que hay
00:14:19
hay excepciones que las tienes que manejar
00:14:21
si o si.
00:14:23
Todas las excepciones
00:14:37
como son hijas de,
00:14:39
hijas de, etc.
00:14:41
crean una jerarquía.
00:14:43
Entonces la clase por arriba
00:14:45
de todas las excepciones
00:14:47
es la clase throwable.
00:14:49
Se llama throwable y parece una
00:14:51
interfaz, pero no es una
00:14:53
interfaz, es una clase.
00:14:55
Sustancialmente cualquier
00:14:57
error que pueda surgir
00:14:59
y que se pueda lanzar ese error
00:15:01
es de la clase throwable.
00:15:03
Y luego hay dos posibles
00:15:05
tipologías de errores
00:15:07
en general.
00:15:09
Lo que son error,
00:15:11
la clase error y todos los que derivan
00:15:13
de error, que son errores
00:15:15
graves.
00:15:17
Errores que si explotan
00:15:19
es un problema realmente
00:15:21
serio para mi programa porque
00:15:23
tampoco tengo mucho
00:15:25
control sobre eso.
00:15:29
Son errores que
00:15:31
no derivan
00:15:33
casi siempre de mi código.
00:15:35
Son errores
00:15:37
que van más allá del código
00:15:39
que estoy escribiendo yo, como por ejemplo
00:15:41
virtual machine error.
00:15:43
Si la máquina virtual machine
00:15:45
hace un error, yo no he
00:15:47
implementado la virtual machine.
00:15:49
Yo la he bajado e instalado.
00:15:51
Y como es software eso también,
00:15:53
podrá tener errores.
00:15:55
Si explota la virtual machine,
00:15:57
¿qué hago?
00:15:59
O hacerse un error que no me acuerdo que es.
00:16:01
Pero son errores
00:16:03
serios, errores a nivel
00:16:05
de infraestructura que estoy
00:16:07
utilizando yo.
00:16:09
Si tengo mi infraestructura que me permite
00:16:11
trabajar con Java, mi programa está por encima de esta infraestructura.
00:16:13
Si hay un problema a nivel
00:16:15
de infraestructura que me permite
00:16:17
trabajar con Java, pues ese es un error.
00:16:19
Y luego están las excepciones, que son siempre hijas
00:16:25
de throwable, pero sí que son
00:16:27
las mías que puedo manejar.
00:16:29
Estas de aquí, los errores,
00:16:33
no deben ser manejados
00:16:35
y normalmente no pasan, y espero que no pasen.
00:16:37
Si pasan, pues tendré
00:16:39
que ir a mirar
00:16:41
la instalación del JBK
00:16:43
y cosas por estilo de por qué ha pasado eso.
00:16:45
Sin embargo, las excepciones son
00:16:47
cosas que yo sí puedo gestionar dentro
00:16:49
de mis
00:16:51
programas y que tengo
00:16:53
muchas veces que manejar.
00:16:55
Dentro de las excepciones, que son manejables
00:16:57
o me puedo recuperar de ellos
00:16:59
sin problema,
00:17:01
pero haciendo algo,
00:17:03
es parte de mi programación, es parte de mi algoritmo
00:17:05
recuperarme de estos errores, de este tipo de errores,
00:17:07
pues hay la Runtime Exception
00:17:09
y las otras.
00:17:11
La Runtime Exception
00:17:13
son las que hemos visto ahora, que son
00:17:15
errores que son tan habituales
00:17:17
que pueden pasar
00:17:19
tan a menudo, es normal
00:17:21
que puedan pasar,
00:17:23
que no tiene sentido
00:17:25
manejarlas y vigilarlas constantemente,
00:17:27
porque sobrecargarían
00:17:29
muchísimo el código.
00:17:31
Imaginaos que cada división que hacéis
00:17:33
tenéis que ponerle hoy, pero cuidado que
00:17:35
no se pueda explotar,
00:17:37
pues
00:17:39
haría todo mucho más
00:17:41
engordoso, ¿vale?
00:17:43
Y por lo tanto, no se requiere que se haga,
00:17:45
se puede hacer,
00:17:47
pero no se requiere.
00:17:49
Y ejemplos de eso son como Arithmetic Exception,
00:17:51
Index Outbound Exception,
00:17:53
Null Pointer Exception, también cuando vosotros
00:17:55
habéis utilizado objetos
00:17:57
y lo habéis puesto a NULL y lo habéis
00:17:59
utilizado, allí no habéis hecho otra excepción,
00:18:01
esta otra excepción no la hemos usado nunca.
00:18:03
Y aún así, la excepción puede saltar.
00:18:05
Pero como Null Pointer Exception
00:18:07
es hija de Runtime Exception,
00:18:09
pues no se requiere.
00:18:11
¿Vale?
00:18:13
Sin embargo, todas las demás,
00:18:15
las que no son hijas de Runtime Exception,
00:18:17
sí, ¿vale?
00:18:19
En el sentido que cuando yo hago
00:18:21
un método que puede lanzar
00:18:23
una excepción
00:18:25
que no sea Runtime Exception,
00:18:27
pues sí que tengo que utilizar
00:18:29
un Trag-Etch o Throws.
00:18:31
¿Vale?
00:18:35
Como por ejemplo,
00:18:37
Certificate Exception,
00:18:39
Clone No Support Exception,
00:18:41
y esto es un dibujito
00:18:43
de la jerarquía, ¿vale?
00:18:45
Tenemos los Throwable, que claramente
00:18:47
son una clase, por lo tanto, de Object.
00:18:49
Dentro de Throwable
00:18:51
hay Error o Exception,
00:18:53
los Error son Virtual Machine Error,
00:18:55
No Class Default Error,
00:18:57
Assertion Error,
00:18:59
Stack Overflow Error,
00:19:01
Stack Overflow Send Back.
00:19:03
¿Vale?
00:19:05
Stack Overflow, por ejemplo,
00:19:07
es cuando yo llamo un método
00:19:09
que llamo otro método,
00:19:11
que llamo otro método,
00:19:13
imaginaos que hacéis un while
00:19:15
donde yo llamo
00:19:17
al mismo método que hace este while.
00:19:19
Entonces lo llamo otra vez,
00:19:21
lo llamo otra vez,
00:19:23
y llega un momento que ha hecho
00:19:25
infinitas llamadas.
00:19:27
Cada llamada se mete en una stack,
00:19:29
este llama a este, que llama a este,
00:19:31
y llega un momento que mi memoria
00:19:33
no me permite llamar más.
00:19:35
O sea, allí, Stack Overflow.
00:19:37
¿Vale?
00:19:39
Y estas son cosas
00:19:41
de errores.
00:19:43
Hace poco nada. ¿Vale?
00:19:45
Sin embargo, están las excepciones,
00:19:47
y aquí hay un montón de Class Not Found
00:19:49
Exception, Illegal Access,
00:19:51
Interrupted.
00:19:53
¿Vale? Interrupted, por ejemplo,
00:19:55
es cuando
00:19:57
tú puedes desde
00:19:59
un hilo de ejecución
00:20:01
interrumpir otro hilo de ejecución
00:20:03
y que él diga, mira, yo estaba
00:20:05
haciendo cosas y ahora sé que alguien
00:20:07
me ha mandado una señal.
00:20:09
¿Vale? Cuando se manda esta señal,
00:20:11
se lanza una Interrupted Exception que se puede
00:20:13
recoger y por lo tanto hacer algo.
00:20:15
¿Vale?
00:20:17
Aquí están las IO Exception,
00:20:21
por ejemplo, que tienen otras
00:20:23
cosas por aquí también, y todas
00:20:25
estas
00:20:27
sí que tengo que manejarlas.
00:20:29
¿Vale? Sin embargo,
00:20:31
hay otra rama que es la
00:20:33
Runtime Exception, y estas de aquí
00:20:35
no requieren un manejo
00:20:37
explícito. Las puedo recoger,
00:20:39
pero no es requerido.
00:20:41
¿Vale? Y aquí están todas las cosas
00:20:43
muy, muy comunes, como esto de
00:20:45
Index Outbound,
00:20:47
como...
00:20:49
otras que podamos haber visto,
00:20:51
Null Pointer Exception,
00:20:53
Negative Array Size
00:20:57
Exception.
00:20:59
Ese es el Number Format Exception
00:21:05
que está aquí.
00:21:07
Sí,
00:21:15
entonces esto lo echáis un vistazo.
00:21:17
Aún así, Eclipse los ha hecho a la mano.
00:21:19
Si vosotros usáis un método
00:21:21
que
00:21:23
nos muestra una excepción que requiere
00:21:25
ser manejada, os la marca.
00:21:27
Os dice, oye, mira, aquí tiene que poner
00:21:29
un Try Catch. Es más, botón derecho, añade
00:21:31
el Try Catch, y te lo añade él.
00:21:33
¿Sí? Por ahora yo creo que
00:21:35
no hemos visto cosas así, porque no hemos visto
00:21:37
las excepciones. Ahora algunos métodos
00:21:39
que veremos, pues, sí que lo
00:21:41
necesitarán. ¿Vale?
00:21:43
En todo esto, ¿vale?, hay
00:21:47
una marea, como hemos visto ahora,
00:21:49
de
00:21:51
excepciones que ya
00:21:53
se pueden, que existen,
00:21:55
y que la Java Extra Machine, el API, me
00:21:57
proporciona para que yo la pueda utilizar,
00:21:59
y eso no quita que yo me pueda crear
00:22:01
mis propias excepciones.
00:22:03
¿Vale? Que se basarán sobre
00:22:05
mi sistema concreto.
00:22:07
Errores que
00:22:09
no usan
00:22:11
mecanismos generales
00:22:13
de Java, como por ejemplo
00:22:15
los Arrays, sino que es un error
00:22:17
propio del programa que estoy creando yo.
00:22:19
¿Vale? Claramente los programitas
00:22:21
que hacemos nosotros, esto tiene muy poco
00:22:23
sentido. ¿Vale? Esto
00:22:25
empieza a crear un error propio
00:22:27
de un sistema, es cuando el sistema
00:22:29
empieza a ser ya suficientemente complejo.
00:22:31
Un programita de
00:22:33
calcúlame los primeros 20
00:22:35
números de Fibonacci,
00:22:37
pues, no es que tienes
00:22:39
Fibonacci exception.
00:22:41
Lo puedes inventar
00:22:43
a la hora de practicar con eso,
00:22:45
como haremos nosotros, pero claramente esto ya
00:22:47
sería un sistema un poco más avanzado.
00:22:49
Creas tus propias excepciones,
00:22:51
pues, esto. ¿Vale?
00:22:53
¿Y cómo la creo?
00:22:55
Pues, puedo
00:22:57
crear haciendo, heredando
00:22:59
de Trovavol o alguna
00:23:01
de sus hijos
00:23:03
o hijas de Trovavol.
00:23:05
¿Vale? En particular,
00:23:07
desde Exception. ¿Sí?
00:23:09
Entonces cuando yo creo mi excepción,
00:23:11
creo una public class a mi excepción
00:23:13
que está en Exception, y allí ya tengo
00:23:15
todo lo que tiene Exception
00:23:17
más lo que yo quiero.
00:23:19
Pero lo que se suele hacer es
00:23:21
crear un constructor de este estilo
00:23:23
¿Vale? Para que utilice
00:23:25
el mensaje
00:23:27
que tienen todas las Exception.
00:23:29
¿Sí? Entonces luego puedo
00:23:31
utilizar el toString, el
00:23:33
getMessage
00:23:35
que hemos visto antes de Exception, porque
00:23:37
como la extendo, y si no
00:23:39
creo un constructor como este,
00:23:41
pues, el message
00:23:43
de error se queda vacío
00:23:45
y por lo tanto cuando luego explota
00:23:47
pues no me da un mensaje.
00:23:49
¿Sí?
00:23:51
Y de esta forma puedo crear objetos de esta clase
00:23:53
con un mensaje personalizado.
00:23:55
¿Sí? Que sea asociado al
00:23:57
getMessage.
00:23:59
La idea es que luego yo me cree
00:24:01
new miException
00:24:03
y entre paréntesis le pondré
00:24:05
comillas
00:24:07
el error que ha pasado desde aquí.
00:24:09
Dos puntos. No me gustan el número 3.
00:24:11
Haciendo referencia
00:24:13
a la StefanoException
00:24:15
de antes. ¿Vale?
00:24:17
¡Ejemplo!
00:24:19
Por lo tanto, yo me creo
00:24:21
public divideByZeroException
00:24:23
¿Vale?
00:24:25
Que extende ArithmeticException
00:24:27
Me creo una nueva excepción
00:24:29
que extende
00:24:31
una excepción aritmética
00:24:33
que es dividir por cero.
00:24:35
¿Vale? Entonces,
00:24:37
aquí tengo un public
00:24:39
divideByZeroException stringMessage
00:24:41
superMessage.
00:24:43
Y ya está. Te hago una nueva
00:24:45
excepción que
00:24:47
tiene solo un constructor que me permite
00:24:49
construir un constructor con un mensaje.
00:24:51
¿Cómo la uso?
00:24:53
¿Cómo lo hago?
00:24:55
¿Cómo lo hago?
00:24:57
¿Cómo lo hago?
00:24:59
No sé si se ve mejor.
00:25:01
¡Ahhh!
00:25:03
¡Ahhh!
00:25:05
Así.
00:25:07
Vale. Deja así.
00:25:09
Entonces, aquí tengo
00:25:11
public doubleDivide. Este es un
00:25:13
método, ¿vale? No sé, en otra clase
00:25:15
voy a utilizar este método
00:25:17
de aquí, que dice, dame
00:25:19
un número, un numerador y un
00:25:21
denominador. Vale, fenomenal.
00:25:23
Y este método de aquí lanza
00:25:25
divideByZeroException.
00:25:27
¿Vale? Entonces, ¿quién va a utilizar
00:25:29
este señor de aquí?
00:25:31
Sabrá, tendrá escrito
00:25:33
por algún lado que este método podría
00:25:35
lanzar esta excepción.
00:25:37
¿Vale? Como esta excepción
00:25:39
deriva, si no me equivoco, de
00:25:41
RuntimeException, pues posiblemente
00:25:43
puedo no manejarla.
00:25:45
¿Sí? Pero sí puedo
00:25:47
manejarla. Este es como un
00:25:49
un aviso.
00:25:51
Oye, esto puede pasar.
00:25:53
Luego tú sabrás que tienes que hacer.
00:25:55
Si es
00:25:57
hija de RuntimeException,
00:25:59
pues entonces puedes o no
00:26:01
manejarla si no fuera
00:26:03
hija de RuntimeException, tienes.
00:26:05
Y te lo dice. ¿Vale?
00:26:07
¿Y cómo funciona? Que si el denominador
00:26:09
que me has dado es cero,
00:26:11
lanza un nuevo
00:26:13
divideByZeroException con escrito error.
00:26:15
Este error podría ser un poquito
00:26:17
más interesante, como decir
00:26:19
has intentado dividir por cero.
00:26:21
¿Sí?
00:26:23
Y si no,
00:26:25
si esto no lo hace,
00:26:27
returna doubleNum
00:26:29
dividido por doubleNum.
00:26:31
¿Sí?
00:26:33
Si no es cero, lo puedes hacer.
00:26:35
Fijaos que aquí es un if, no tiene
00:26:37
las paréntesis, porque si no tiene paréntesis
00:26:39
solo esto entra en el if.
00:26:41
¿Hace falta
00:26:43
hacer el cast de double
00:26:45
en ambos?
00:26:47
¿El número pariado? ¿Solo por curiosidad?
00:26:49
¿O se podría hacer double y entre
00:26:51
paréntesis?
00:26:53
Yo creo que con uno solo es suficiente.
00:26:55
Es que no es más extraño.
00:26:57
Yo creo que esto es más bien por
00:26:59
¿cómo se dice?
00:27:01
Por
00:27:03
complejo y
00:27:05
por formalidad.
00:27:07
Quiero que esta operación sea entre double
00:27:09
para que sea, pero no.
00:27:11
Con que uno sea double ya la operación es entre double.
00:27:13
¿Dudas?
00:27:17
Y estas son las excepciones.
00:27:19
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 10
- Fecha:
- 21 de febrero de 2023 - 12:08
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 27′ 26″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 229.43 MBytes