1 00:00:01,000 --> 00:00:07,639 Estoy grabando, por lo tanto, si habláis, me dais vuestro consentimiento a que se graben vuestras voces, ¿vale? 2 00:00:07,780 --> 00:00:13,759 Hoy vamos a ver un tema nuevo, que es un tema relativamente pequeño y relativamente fácil, ¿vale? 3 00:00:13,960 --> 00:00:19,359 Que es el manejo de excepciones. Como todas las cosas en Java, pues la base es muy sencilla, 4 00:00:19,859 --> 00:00:27,100 luego si me empiezo a hilar fino y a ir a cosas un poquito más complejas, pues puedo complicarlo cuanto me da la gana, ¿vale? 5 00:00:27,100 --> 00:00:36,299 Una excepción es, en un cierto sentido, lo que es un error dentro de la programación en Java 6 00:00:36,299 --> 00:00:41,700 ¿Vale? Cuando hay un error dentro de mi programa 7 00:00:41,700 --> 00:00:48,280 Lo que se detecta por el sistema, por la Javator Machine, pues se crea una excepción 8 00:00:48,280 --> 00:00:51,939 ¿Vale? Cuidado, hay distintos tipos de errores 9 00:00:51,939 --> 00:00:55,280 ¿Vale? El concepto de error es muy, muy, muy amplio 10 00:00:55,280 --> 00:01:12,099 El error más feo y más malvado dentro de la programación es el error semántico. Es el que yo estoy calculando la media de 10 números y en vez de calcular la media de 10 números, calculo la suma de 10 números. 11 00:01:12,099 --> 00:01:17,000 Pues eso, desde una perspectiva de programación, es perfecto 12 00:01:17,000 --> 00:01:25,200 No hay errores de sintaxis, no hay errores que explota errores en los tipos de datos 13 00:01:25,200 --> 00:01:29,500 O acceda a una posición de array que no tenía que acceder 14 00:01:29,500 --> 00:01:31,599 No hay errores a nivel de programación 15 00:01:31,599 --> 00:01:33,500 El error sois vosotros 16 00:01:33,500 --> 00:01:37,599 Sois vosotros que cuando habéis hecho el algoritmo, cuando habéis pensado la fórmula 17 00:01:37,599 --> 00:01:41,099 Que teníais que hacer, en vez de calcular la media de 10 números 18 00:01:41,099 --> 00:01:42,640 habéis hecho la suma de 10 números 19 00:01:42,640 --> 00:01:45,079 ¿vale? no podéis decir 20 00:01:45,079 --> 00:01:46,659 ¡ah! malvado eclipse 21 00:01:46,659 --> 00:01:49,040 que me estás calculando la suma 22 00:01:49,040 --> 00:01:51,319 cuando tenías que calcularme la media 23 00:01:51,319 --> 00:01:53,079 pues el problema es vuestro, sois vosotros 24 00:01:53,079 --> 00:01:54,459 que os habéis equivocado, ¿vale? 25 00:01:54,579 --> 00:01:57,120 esos son los errores semánticos y son los que 26 00:01:57,120 --> 00:01:58,459 con el tiempo 27 00:01:58,459 --> 00:01:59,900 son los que 28 00:01:59,900 --> 00:02:02,939 os molestarán, ¿vale? 29 00:02:03,319 --> 00:02:05,040 ahora lucháis, como sois 30 00:02:05,040 --> 00:02:06,620 programadores iniciales, ¿vale? 31 00:02:06,680 --> 00:02:09,020 desde iniciando ahora, lucháis también contra 32 00:02:09,020 --> 00:02:11,060 los errores sintácticos, contra las excepciones 33 00:02:11,060 --> 00:02:12,539 Que no sabéis que son 34 00:02:12,539 --> 00:02:14,979 Contra las cosas rojas 35 00:02:14,979 --> 00:02:16,319 Que aparecen de vez en cuando 36 00:02:16,319 --> 00:02:17,379 Porque he explotado algo 37 00:02:17,379 --> 00:02:20,879 Pero con el tiempo cuando esas cosas se mecanizarán 38 00:02:20,879 --> 00:02:24,060 Y lo podéis trabajar normalmente 39 00:02:24,060 --> 00:02:25,719 Se quedará en vuestra mente 40 00:02:25,719 --> 00:02:27,960 El pensar el algoritmo 41 00:02:27,960 --> 00:02:30,879 ¿Por qué mi programa no está haciendo lo que yo quiero? 42 00:02:30,979 --> 00:02:32,740 Porque en algún lado me he equivocado 43 00:02:32,740 --> 00:02:34,719 Me he hecho un paso del algoritmo 44 00:02:34,719 --> 00:02:36,719 O una operación que no tenía que hacer 45 00:02:36,719 --> 00:02:37,819 Y la tengo que modificar 46 00:02:37,819 --> 00:02:40,000 Y son los errores más difíciles de detectar 47 00:02:40,000 --> 00:02:41,979 Porque no hay nada que te ayuda 48 00:02:41,979 --> 00:02:43,740 En eso, vale 49 00:02:43,740 --> 00:02:46,639 Sin embargo aquí estamos hablando 50 00:02:46,639 --> 00:02:48,199 De errores un poquito distintos 51 00:02:48,199 --> 00:02:50,099 Estamos hablando no de errores sintácticos 52 00:02:50,099 --> 00:02:52,719 Porque quien pilla los errores sintácticos 53 00:02:52,719 --> 00:02:55,080 ¿Qué es un error sintáctico? 54 00:02:58,939 --> 00:02:59,740 El sintáctico es 55 00:02:59,740 --> 00:03:00,960 Se me ha olvidado el punto y coma 56 00:03:00,960 --> 00:03:02,840 El error sintáctico es 57 00:03:02,840 --> 00:03:05,620 He puesto public mi método 58 00:03:05,620 --> 00:03:07,340 Abierta paréntesis, cerrada paréntesis 59 00:03:07,340 --> 00:03:09,460 Y me falta algo allí para completarlo 60 00:03:09,460 --> 00:03:10,819 ¿Y quien pilla eso? 61 00:03:11,620 --> 00:03:12,659 El compilador 62 00:03:12,659 --> 00:03:15,919 El entorno de desarrollo 63 00:03:15,919 --> 00:03:18,379 Que sustancialmente está pre-compilando 64 00:03:18,379 --> 00:03:19,419 Todo constantemente 65 00:03:19,419 --> 00:03:21,800 Me dice, aquí falta algo, me lo marca en rojo 66 00:03:21,800 --> 00:03:24,840 Pero quien luego lo pillaría es el compilador 67 00:03:24,840 --> 00:03:25,400 De Java 68 00:03:25,400 --> 00:03:27,419 Os recuerdo que Java tiene dos fases 69 00:03:27,419 --> 00:03:29,020 La compilación y luego la interpretación 70 00:03:29,020 --> 00:03:32,460 Sin embargo, estos son otros tipos de errores 71 00:03:32,460 --> 00:03:34,759 Son errores en tiempo de ejecución 72 00:03:34,759 --> 00:03:36,180 O sea, yo lanzo el programa 73 00:03:36,180 --> 00:03:38,240 Y mientras el programa funciona 74 00:03:38,240 --> 00:03:40,099 Que es todo sintéticamente correcto 75 00:03:40,099 --> 00:03:41,960 Pues ocurre un problema 76 00:03:41,960 --> 00:03:44,539 ¿Vale? El típico problema es 77 00:03:44,539 --> 00:03:46,719 O dos típicos problemas que hemos visto varias veces 78 00:03:46,719 --> 00:03:48,780 Intento acceder a una posición 79 00:03:48,780 --> 00:03:50,199 De un array que no existe 80 00:03:50,199 --> 00:03:53,259 Mi array es de 10 posiciones y yo accedo a la posición 15 81 00:03:53,259 --> 00:03:54,020 ¿Vale? 82 00:03:55,919 --> 00:03:56,479 Sintácticamente 83 00:03:56,479 --> 00:03:59,099 Yo he accedido a la posición de un entero 84 00:03:59,099 --> 00:04:00,819 Entonces, perfecto 85 00:04:00,819 --> 00:04:02,099 No hay problemas allí 86 00:04:02,099 --> 00:04:04,960 Tengo mi array 87 00:04:04,960 --> 00:04:06,580 Paréntesis cuadra, x 88 00:04:06,580 --> 00:04:07,819 Paréntesis cuadra 89 00:04:07,819 --> 00:04:09,479 Y yo no sé que valor tiene x 90 00:04:09,479 --> 00:04:11,979 Y si ese x vale de 0 a 9 91 00:04:11,979 --> 00:04:13,539 Me funciona perfectamente 92 00:04:13,539 --> 00:04:16,800 Pero resulta que por un error mío semántico 93 00:04:16,800 --> 00:04:19,019 En algún lado he metido en este x 15 94 00:04:19,019 --> 00:04:21,639 Y entonces intenta acceder a la posición 15 95 00:04:21,639 --> 00:04:22,620 Y no existe 96 00:04:22,620 --> 00:04:26,319 Entonces es un error que a tiempo de compilación 97 00:04:26,319 --> 00:04:27,639 No se puede encontrar 98 00:04:27,639 --> 00:04:30,160 Donde se encuentra ese tiempo de ejecución 99 00:04:30,160 --> 00:04:32,000 Cuando hay este tipo de error 100 00:04:32,000 --> 00:04:33,360 Salta un exception 101 00:04:33,360 --> 00:04:35,500 En particular la 102 00:04:35,500 --> 00:04:40,540 Index out of bound exception 103 00:04:40,540 --> 00:04:41,740 Para esta x 104 00:04:41,740 --> 00:04:42,240 ¿Vale? 105 00:04:42,699 --> 00:04:43,620 Otra cosa 106 00:04:43,620 --> 00:04:44,699 Yo tengo un objeto 107 00:04:44,699 --> 00:04:45,720 Tengo una variable 108 00:04:45,720 --> 00:04:47,939 Mi objeto 109 00:04:47,939 --> 00:04:49,860 Obg 110 00:04:49,860 --> 00:04:51,139 Por ahí 111 00:04:51,139 --> 00:04:53,660 Y hago obg.nombre 112 00:04:53,660 --> 00:04:57,420 Y de repente resulta que este obg es null 113 00:04:57,420 --> 00:04:59,220 ¿Por qué? 114 00:04:59,319 --> 00:05:01,079 Porque no lo he inicializado en ningún lado 115 00:05:01,079 --> 00:05:05,519 O porque me lo pasan por un parámetro en un método 116 00:05:05,519 --> 00:05:07,000 Y me han pasado null 117 00:05:07,000 --> 00:05:09,980 O me han pasado otro objeto que no ha sido inicializado 118 00:05:09,980 --> 00:05:12,019 Entonces cuando yo tengo un objeto 119 00:05:12,019 --> 00:05:14,279 Que no ha sido inicializado, no ha sido distanciado 120 00:05:14,279 --> 00:05:15,399 Y le hago 121 00:05:15,399 --> 00:05:17,920 Un accedo a un atributo suyo 122 00:05:17,920 --> 00:05:19,000 O a un método suyo 123 00:05:19,000 --> 00:05:20,079 ¿Qué pasa? 124 00:05:22,399 --> 00:05:23,620 No hay excepción 125 00:05:23,620 --> 00:05:25,959 ¿Lo puedo detectar esto 126 00:05:25,959 --> 00:05:27,379 A nivel de compilación? 127 00:05:27,800 --> 00:05:28,600 Probablemente no 128 00:05:28,600 --> 00:05:30,839 Yo qué sé, me han pasado 129 00:05:30,839 --> 00:05:33,519 Yo tengo un objeto como parámetro 130 00:05:33,519 --> 00:05:35,899 Y no puedo prever si alguien 131 00:05:35,899 --> 00:05:37,540 Me lo pasa, lo puedo controlar 132 00:05:37,540 --> 00:05:40,240 Sí, pero a nivel de compilación 133 00:05:40,240 --> 00:05:41,620 Esto está bien escrito 134 00:05:41,620 --> 00:05:43,860 Luego el problema es que a nivel de 135 00:05:43,860 --> 00:05:45,720 Cuando llego a tiempo de ejecución 136 00:05:45,720 --> 00:05:47,759 Que tengo que hacer algo sobre este objeto 137 00:05:47,759 --> 00:05:49,079 Y voy a buscar este objeto 138 00:05:49,079 --> 00:05:50,860 Me encuentro que este objeto no existe 139 00:05:50,860 --> 00:05:54,180 Y por lo tanto, la virtual machine 140 00:05:54,180 --> 00:05:55,560 Se da cuenta y dice 141 00:05:55,560 --> 00:05:58,120 Oye, paro, bloqueo la ejecución 142 00:05:58,120 --> 00:05:59,800 Lanzando una excepción 143 00:05:59,800 --> 00:06:01,399 Una excepción que 144 00:06:01,399 --> 00:06:03,699 Sostancialmente lo que intenta hacer 145 00:06:03,699 --> 00:06:06,360 Es avisarme de lo que ha pasado 146 00:06:06,360 --> 00:06:08,060 Para que yo lo pueda corregir 147 00:06:08,060 --> 00:06:10,379 O para que yo lo pueda capturar 148 00:06:10,379 --> 00:06:12,160 Y ahora lo veremos 149 00:06:12,160 --> 00:06:12,519 ¿Vale? 150 00:06:13,620 --> 00:06:16,680 Cuando un error ocurre, lo normal es que se detenga el programa 151 00:06:16,680 --> 00:06:18,160 Y se proporciona un mensaje 152 00:06:18,160 --> 00:06:19,480 Después de que explique el fallo 153 00:06:19,480 --> 00:06:19,779 ¿Vale? 154 00:06:20,939 --> 00:06:21,899 Es lo básico 155 00:06:21,899 --> 00:06:23,920 Ha habido un error, yo no sé qué hacer 156 00:06:23,920 --> 00:06:26,839 Porque me esperaba de encontrarme un objeto aquí y no está 157 00:06:26,839 --> 00:06:29,079 Me esperaba de encontrarme un objeto aquí y no está 158 00:06:29,079 --> 00:06:30,339 O lo que sea 159 00:06:30,339 --> 00:06:32,480 Pues no puedo seguir adelante 160 00:06:32,480 --> 00:06:33,560 Haciendo como, ah, sí, bueno 161 00:06:33,560 --> 00:06:36,040 aquí tenía que haber un número, me invento 162 00:06:36,040 --> 00:06:37,860 el 3, pues no, no lo sé, tenía que 163 00:06:37,860 --> 00:06:39,459 pillar un valor y no está este valor 164 00:06:39,459 --> 00:06:41,339 por lo tanto, bloco 165 00:06:41,339 --> 00:06:43,959 el programa, me paro 166 00:06:43,959 --> 00:06:45,060 ¿sí? y 167 00:06:45,060 --> 00:06:47,740 cortesía del programador, normalmente 168 00:06:47,740 --> 00:06:49,399 voy a explicar 169 00:06:49,399 --> 00:06:51,779 que ha pasado, oye, estaba 170 00:06:51,779 --> 00:06:53,519 intentando acceder al 171 00:06:53,519 --> 00:06:55,600 array alumnos 172 00:06:55,600 --> 00:06:57,160 y me he encontrado que 173 00:06:57,160 --> 00:06:59,660 he intentado acceder a una posición que no está 174 00:06:59,660 --> 00:07:01,819 ¿vale? y esto depende de vosotros 175 00:07:01,819 --> 00:07:03,079 lo veremos más adelante 176 00:07:03,079 --> 00:07:15,680 Hay algunos errores que tienen un mensaje por defecto, como el array index out of bound te dice, oye, mira, he intentado acceder a esta posición y esta posición no está. 177 00:07:17,300 --> 00:07:27,560 Pero normalmente en nuestros programas deberíamos tunear estos mensajes para que sean más relevantes, para que quien vea este mensaje diga, ah, mira, ha pasado esto. 178 00:07:27,560 --> 00:07:33,339 Tened en cuenta también que estos tipos de mensajes no salen por System.out 179 00:07:33,339 --> 00:07:35,639 Salen por System.er 180 00:07:35,639 --> 00:07:37,860 Salen en rojo 181 00:07:37,860 --> 00:07:45,339 Eso no debería, cada proceso tiene una entrada 182 00:07:45,339 --> 00:07:49,180 Que nosotros utilizamos con el System.in para leer de teclado 183 00:07:49,180 --> 00:07:50,620 Y dos salidas 184 00:07:50,620 --> 00:07:54,040 Un output, que es el output normal en consola 185 00:07:54,040 --> 00:07:58,600 Que sería como tu dialogas con el usuario que está usando tu programa 186 00:07:58,600 --> 00:08:01,680 Y luego un output error, soundsystem.er 187 00:08:01,680 --> 00:08:04,980 Que es por donde van los errores 188 00:08:04,980 --> 00:08:09,620 En teoría tu este error, que normalmente sale por consola 189 00:08:09,620 --> 00:08:13,259 Lo podrías redireccionar en un ficherito de log 190 00:08:13,259 --> 00:08:16,500 Para que el usuario no vea los errores 191 00:08:16,500 --> 00:08:19,180 Pero tu administrador, tu programador 192 00:08:19,180 --> 00:08:23,379 Puedas ir a mirar ese fichero y ver que problema ha habido 193 00:08:23,379 --> 00:08:26,879 Sobre todo cuando das mantenimiento 194 00:08:26,879 --> 00:08:28,819 Hay que considerar que nosotros somos informáticos 195 00:08:28,819 --> 00:08:30,860 Pero la gente que usa nuestros programas 196 00:08:30,860 --> 00:08:32,019 Muchas veces no lo es 197 00:08:32,019 --> 00:08:34,960 Entonces que le aparezcan pantallazos azules 198 00:08:34,960 --> 00:08:36,039 Con escrito código 199 00:08:36,039 --> 00:08:38,539 7.944 ha explotado todo 200 00:08:38,539 --> 00:08:41,340 Pues no sé cuánto es user friendly 201 00:08:41,340 --> 00:08:42,539 ¿Sí? 202 00:08:43,379 --> 00:08:43,840 Vale 203 00:08:43,840 --> 00:08:47,000 Java proporciona un mecanismo 204 00:08:47,000 --> 00:08:48,860 Para controlar situaciones que normalmente provocaría 205 00:08:48,860 --> 00:08:50,740 Una interrupción de ejecución 206 00:08:50,740 --> 00:08:52,980 Permitiendo gestionar el comportamiento 207 00:08:52,980 --> 00:08:54,820 del programa en caso de error 208 00:08:54,820 --> 00:08:57,059 o sea que tenemos un mecanismo 209 00:08:57,059 --> 00:08:59,240 para que si explota 210 00:08:59,240 --> 00:09:01,100 algo, en vez de decir 211 00:09:01,100 --> 00:09:02,240 vale, aquí se ha acabado 212 00:09:02,240 --> 00:09:04,039 yo pueda recoger 213 00:09:04,039 --> 00:09:07,200 capturar esa excepción 214 00:09:07,200 --> 00:09:09,139 e ir a analizarla 215 00:09:09,139 --> 00:09:10,980 a ver, oye, mira, ¿qué ha pasado 216 00:09:10,980 --> 00:09:13,100 de verdad? porque si yo me puedo 217 00:09:13,100 --> 00:09:15,100 recuperar de este 218 00:09:15,100 --> 00:09:17,320 error, pues me recupero 219 00:09:17,320 --> 00:09:19,360 y sigo adelante con el programa 220 00:09:19,360 --> 00:09:20,879 no hago que el programa explote 221 00:09:20,879 --> 00:09:23,399 Si es un error demasiado grave 222 00:09:23,399 --> 00:09:24,799 Que no puedo seguir adelante 223 00:09:24,799 --> 00:09:26,480 Pues entonces explotaré 224 00:09:26,480 --> 00:09:27,960 ¿Si? 225 00:09:29,299 --> 00:09:30,519 Más o menos la idea 226 00:09:30,519 --> 00:09:35,549 Nosotros 227 00:09:35,549 --> 00:09:36,830 Hasta ahora 228 00:09:36,830 --> 00:09:39,590 Hemos intentado manejar 229 00:09:39,590 --> 00:09:41,990 Los errores de forma pesimista 230 00:09:41,990 --> 00:09:42,889 ¿Vale? 231 00:09:42,909 --> 00:09:45,370 La forma pesimista es sustancialmente 232 00:09:45,370 --> 00:09:47,669 De si yo sé que puede surgir 233 00:09:47,669 --> 00:09:48,289 Un error 234 00:09:48,289 --> 00:09:50,509 Lo voy a comprobar 235 00:09:50,509 --> 00:09:52,570 Por ejemplo, cuando nosotros decimos 236 00:09:52,570 --> 00:09:54,789 Tengo un objeto que me han pasado por parámetro 237 00:09:54,789 --> 00:09:55,450 ¿Vale? 238 00:09:55,629 --> 00:09:57,669 Y este objeto podría ser null 239 00:09:57,669 --> 00:09:59,669 ¿Qué hago yo para evitar que sea null? 240 00:10:10,029 --> 00:10:12,549 If este objeto es not null 241 00:10:12,549 --> 00:10:14,789 Entonces haz lo que tienes que hacer 242 00:10:14,789 --> 00:10:15,610 ¿Vale? 243 00:10:15,669 --> 00:10:17,429 Esta es una forma de pensar 244 00:10:17,429 --> 00:10:18,850 De que cada vez que paso por allí 245 00:10:18,850 --> 00:10:21,950 Independientemente de que me hayan dado un objeto null o no 246 00:10:21,950 --> 00:10:24,769 Voy a comprobar si esto es así 247 00:10:24,769 --> 00:10:26,230 Y si no es así 248 00:10:26,230 --> 00:10:27,529 Si hay un objeto real 249 00:10:27,529 --> 00:10:29,210 Pues entonces uso el objeto 250 00:10:29,210 --> 00:10:30,850 Si no hay este objeto real 251 00:10:30,850 --> 00:10:31,929 Pues entonces 252 00:10:31,929 --> 00:10:35,029 Hay un else o no hago nada 253 00:10:35,029 --> 00:10:35,889 O lo que sea 254 00:10:35,889 --> 00:10:38,289 ¿Cuál es el problema de esto? 255 00:10:38,450 --> 00:10:41,450 Es que normalmente en un 90% de los casos 256 00:10:41,450 --> 00:10:43,049 Cuando yo uso un método 257 00:10:43,049 --> 00:10:45,049 Que requiere un objeto 258 00:10:45,049 --> 00:10:46,970 ¿Quién llama este objeto? 259 00:10:47,129 --> 00:10:48,230 ¿Quién llama este método? 260 00:10:48,549 --> 00:10:49,769 No me pasará un null 261 00:10:49,769 --> 00:10:53,370 Me pasará el objeto sobre el que yo quiero trabajar 262 00:10:53,370 --> 00:10:55,629 Si yo tengo un busca alumno 263 00:10:55,629 --> 00:10:57,269 Y me pasas un alumno 264 00:10:57,269 --> 00:10:58,629 Y me lo busca en un array 265 00:10:58,629 --> 00:11:01,529 ¿Vale? Pues yo me espero que lo que me estás 266 00:11:01,529 --> 00:11:03,450 Pasando aquí como parámetro, el nombre 267 00:11:03,450 --> 00:11:05,529 O un string con nombre, o un alumno 268 00:11:05,529 --> 00:11:07,789 O un código, pues tenga significado 269 00:11:07,789 --> 00:11:08,389 No sea null 270 00:11:08,389 --> 00:11:10,490 Porque si es null no puede hacer nada 271 00:11:10,490 --> 00:11:13,889 ¿Vale? Entonces, el hecho de poner el if 272 00:11:13,889 --> 00:11:15,529 Quiere decir que cada vez que 273 00:11:15,529 --> 00:11:16,509 Ejecuto este método 274 00:11:16,509 --> 00:11:19,389 Pierdo tiempo en ver 275 00:11:19,389 --> 00:11:21,509 ¿De verdad me has dado un código 276 00:11:21,509 --> 00:11:23,950 Correcto? Ah sí, venga, entonces te lo busco 277 00:11:23,950 --> 00:11:25,070 Y repito 278 00:11:25,070 --> 00:11:26,929 95% de las veces 279 00:11:26,929 --> 00:11:28,850 es que me han dado un código 280 00:11:28,850 --> 00:11:30,769 un código real, que puede hacer 281 00:11:30,769 --> 00:11:33,049 luego a lo mejor no está el alumno, pero el código 282 00:11:33,049 --> 00:11:34,929 se puede utilizar, no sé si me explico 283 00:11:34,929 --> 00:11:36,669 lo que quiere decir, entonces 284 00:11:36,669 --> 00:11:37,710 el pesimista 285 00:11:37,710 --> 00:11:41,029 lo que, los problemas que tiene 286 00:11:41,029 --> 00:11:42,450 es que primero es difícil 287 00:11:42,450 --> 00:11:44,710 ver todos los posibles fallos 288 00:11:44,710 --> 00:11:47,049 o sea, yo te voy a decir, si este objeto 289 00:11:47,049 --> 00:11:48,990 es nul, vale, y si este otro 290 00:11:48,990 --> 00:11:50,929 código es mayor que 291 00:11:50,929 --> 00:11:52,769 cero, y si este de aquí 292 00:11:52,769 --> 00:11:55,230 debería hacer un montón de comprobaciones 293 00:11:55,230 --> 00:11:56,929 Solo para ver si los datos son válidos 294 00:11:56,929 --> 00:11:58,230 Y a este punto utilizarlos 295 00:11:58,230 --> 00:12:01,710 Y a lo mejor algunas de esas comprobaciones 296 00:12:01,710 --> 00:12:03,230 No las pienso 297 00:12:03,230 --> 00:12:05,610 A lo mejor yo compruebo que alumno 298 00:12:05,610 --> 00:12:07,490 No sea null 299 00:12:07,490 --> 00:12:08,590 ¿Vale? 300 00:12:08,809 --> 00:12:11,750 Pero luego dentro de alumno 301 00:12:11,750 --> 00:12:13,009 Me han creado un objeto alumno 302 00:12:13,009 --> 00:12:14,289 Con todos los campos a null 303 00:12:14,289 --> 00:12:16,129 Y entonces tengo un problema con él 304 00:12:16,129 --> 00:12:22,090 La segunda cosa es que si los datos son correctos 305 00:12:22,090 --> 00:12:24,309 Pues estoy sobrecargando 306 00:12:24,309 --> 00:12:26,409 El programa con if innecesario 307 00:12:26,409 --> 00:12:27,370 Estoy haciendo un if 308 00:12:27,370 --> 00:12:29,289 Pero no sirve de nada 309 00:12:29,289 --> 00:12:30,629 Porque si es correcto 310 00:12:30,629 --> 00:12:33,710 Y entonces existe 311 00:12:33,710 --> 00:12:36,450 El manejo de excepciones 312 00:12:36,450 --> 00:12:37,610 Optimista 313 00:12:37,610 --> 00:12:39,549 Que es 314 00:12:39,549 --> 00:12:42,029 Yo programo 315 00:12:42,029 --> 00:12:44,429 Pensando que todo sale bien 316 00:12:44,429 --> 00:12:46,269 Sin ningún problema 317 00:12:46,269 --> 00:12:48,830 Y lo que voy a hacer 318 00:12:48,830 --> 00:12:50,129 Es marcar 319 00:12:50,129 --> 00:12:52,129 Los códigos peligrosos 320 00:12:52,129 --> 00:12:54,429 Las secciones de códigos con peligro 321 00:12:54,429 --> 00:12:55,850 Donde pueda pasar algo 322 00:12:55,850 --> 00:12:57,850 Malo, con un bloque 323 00:12:57,850 --> 00:12:59,250 Try-catch 324 00:12:59,250 --> 00:13:02,210 ¿Vale? El bloque try 325 00:13:02,210 --> 00:13:04,029 Es un bloque que dice, oye mira 326 00:13:04,029 --> 00:13:06,450 Pruébalo, tú prueba a hacer esto 327 00:13:06,450 --> 00:13:08,230 Por ejemplo, en el alumno 328 00:13:08,230 --> 00:13:10,149 Me han pasado un alumno que se llama el alumno A 329 00:13:10,149 --> 00:13:12,809 Pues A, A.getName 330 00:13:12,809 --> 00:13:14,049 ¿Vale? 331 00:13:14,110 --> 00:13:15,710 Si esto A es null 332 00:13:15,710 --> 00:13:17,090 Me explota 333 00:13:17,090 --> 00:13:19,669 Pero en un 95% de los casos 334 00:13:19,669 --> 00:13:21,850 A no será null y por lo tanto me funcionará 335 00:13:22,129 --> 00:13:33,129 El día que explote, saltará una excepción, en este caso una null pointer exception 336 00:13:33,129 --> 00:13:40,970 Si salta una excepción, tengo un bloque catch que me permite pillar esa excepción 337 00:13:40,970 --> 00:13:44,850 Y en vez de explotar y parar todo, intentar ver qué ha pasado 338 00:13:44,850 --> 00:13:51,529 Como por ejemplo, ver aquí, que oye mira, aquí compruebo y veo que es una null pointer exception 339 00:13:51,529 --> 00:13:54,970 Y por lo tanto que el objeto que he intentado utilizar es null 340 00:13:54,970 --> 00:13:58,049 Y mando un mensaje al usuario diciendo 341 00:13:58,049 --> 00:14:00,990 El alumno que estás buscando no se puede buscar 342 00:14:00,990 --> 00:14:03,889 Y en vez de acabar el programa 343 00:14:03,889 --> 00:14:07,950 Vuelvo a mi menú inicial de poder buscar alumno 344 00:14:07,950 --> 00:14:09,450 Crear un alumno y cosas por el estilo 345 00:14:09,450 --> 00:14:11,830 No sé si me explico lo que quiero decir 346 00:14:11,830 --> 00:14:14,549 Es parecido a un if 347 00:14:14,549 --> 00:14:17,629 Pero mientras un if lo ejecutas todas las veces 348 00:14:17,629 --> 00:14:21,470 Esto es un bloque que tú ejecutas normalmente 349 00:14:21,470 --> 00:14:23,389 Que está preparado en el caso 350 00:14:23,389 --> 00:14:25,809 Haya un error, a pillar el error 351 00:14:25,809 --> 00:14:28,409 Pero las veces que no hay error 352 00:14:28,409 --> 00:14:29,870 Pues esto 353 00:14:29,870 --> 00:14:31,070 Va más 354 00:14:31,070 --> 00:14:33,129 Más ligero 355 00:14:33,129 --> 00:14:35,870 Con respecto al if que en vez tienes que hacer la comprobación 356 00:14:35,870 --> 00:14:42,250 Es lo que hemos dicho 357 00:14:42,250 --> 00:14:43,750 Si tú lo haces 358 00:14:43,750 --> 00:14:45,649 Pesimista, el problema es que si metes el if 359 00:14:45,649 --> 00:14:47,769 Tú estás comprobando 360 00:14:47,769 --> 00:14:49,250 Tanto cuando los datos son buenos 361 00:14:49,250 --> 00:14:50,549 Como cuando los datos son malos 362 00:14:50,549 --> 00:14:53,129 O sea, estás gastando recursos de procesación 363 00:14:53,129 --> 00:14:54,450 De procesamiento 364 00:14:54,450 --> 00:14:55,590 Siempre 365 00:14:55,590 --> 00:14:59,049 En vez de aquí, que tendrá un sobrecosto 366 00:14:59,049 --> 00:15:00,649 Porque no es gratis el try 367 00:15:00,649 --> 00:15:03,470 Pero es un sobrecosto menor 368 00:15:03,470 --> 00:15:04,750 Con respecto a diciendo 369 00:15:04,750 --> 00:15:07,110 Mira, tú trabajas como si todo fuera bien 370 00:15:07,110 --> 00:15:08,809 Tú esperas que las cosas 371 00:15:08,809 --> 00:15:11,129 Eres optimista, que las cosas van a funcionar bien 372 00:15:11,129 --> 00:15:12,929 Y la vez que explota 373 00:15:12,929 --> 00:15:15,950 Pues tienes un mecanismo que te lo recupera 374 00:15:15,950 --> 00:15:17,370 Pero aquí no estás haciendo el if 375 00:15:17,370 --> 00:15:18,350 Cada vez 376 00:15:18,350 --> 00:15:21,169 ¿Vale? Estás esperando a la vez que explote 377 00:15:21,169 --> 00:15:23,750 Cuando explota, pues esto lo recoge 378 00:15:23,750 --> 00:15:25,450 ¿Y tengo que decir qué tipo de excepción va a haber? 379 00:15:25,450 --> 00:15:26,330 Ahora, ahora, vayamos 380 00:15:26,330 --> 00:15:32,580 No, el bloque try-catch 381 00:15:32,580 --> 00:15:35,980 ¿A qué serviría? 382 00:15:39,279 --> 00:15:41,120 Por si puedes hacer un try-final 383 00:15:41,120 --> 00:15:42,200 Pero 384 00:15:42,200 --> 00:15:46,299 La idea es que tú 385 00:15:46,299 --> 00:15:48,740 Si pruebas esto con un try 386 00:15:48,740 --> 00:15:50,539 Es porque te esperas que aquí 387 00:15:50,539 --> 00:15:51,600 Pueda ir algo mal 388 00:15:51,600 --> 00:15:53,860 Y si algo va mal, pues 389 00:15:53,860 --> 00:15:56,259 Tendrás que hacer algo, que puede ser nada 390 00:15:56,259 --> 00:15:58,899 Aquí no pones nada y dices, vale, si explota no haga nada 391 00:15:58,899 --> 00:15:59,659 Pero 392 00:15:59,659 --> 00:16:01,399 Lo tienes que poner, ¿vale? 393 00:16:02,419 --> 00:16:04,879 Para esto en Java se protege el código potencialmente 394 00:16:04,879 --> 00:16:06,259 Peligroso usando una estructura 395 00:16:06,259 --> 00:16:08,039 Tragic, ¿vale? Esta es la idea 396 00:16:08,039 --> 00:16:12,419 Entonces, ejemplo de 397 00:16:12,419 --> 00:16:14,919 Programación pesimista y optimista 398 00:16:14,919 --> 00:16:15,700 Entre comillas 399 00:16:15,700 --> 00:16:19,379 Vamos a ver este ejercicio 400 00:16:19,379 --> 00:16:20,460 ¿Vale? 401 00:16:20,539 --> 00:16:23,740 Leo un entero desde 402 00:16:23,740 --> 00:16:26,080 Teclado 403 00:16:26,080 --> 00:16:26,840 ¿Vale? 404 00:16:28,100 --> 00:16:30,120 Leo dos enteros 405 00:16:30,120 --> 00:16:31,779 ¿Vale? El segundo entero 406 00:16:31,779 --> 00:16:33,419 Podría ser cero 407 00:16:33,419 --> 00:16:34,919 Porque nada aquí me lo dice 408 00:16:34,919 --> 00:16:37,259 Y digo que si den 409 00:16:37,259 --> 00:16:39,480 Que sería el denominador, el de abajo 410 00:16:39,480 --> 00:16:40,759 Pues es 411 00:16:40,759 --> 00:16:42,460 Distinto de cero 412 00:16:42,460 --> 00:16:44,919 Pues entonces hago num dividido den 413 00:16:44,919 --> 00:16:46,480 Hago la división 414 00:16:46,480 --> 00:16:48,960 Y si no, diré, oye, mira 415 00:16:48,960 --> 00:16:51,259 hay un error, ¿vale? que estoy comprobando 416 00:16:51,259 --> 00:16:53,399 aquí, estoy haciendo una división 417 00:16:53,399 --> 00:16:55,259 de este número entre este 418 00:16:55,259 --> 00:16:55,639 número 419 00:16:55,639 --> 00:16:59,159 el concepto es que no se puede dividir por cero 420 00:16:59,159 --> 00:17:01,059 si hago cualquier número dividido por cero 421 00:17:01,059 --> 00:17:03,519 me da un error, Java, error aritmético 422 00:17:03,519 --> 00:17:04,519 ¿sí? 423 00:17:04,940 --> 00:17:07,079 entonces, ¿aquí qué estoy haciendo? estoy haciendo 424 00:17:07,079 --> 00:17:09,220 una cosa pesimista, estoy diciendo, oye mira 425 00:17:09,220 --> 00:17:11,279 voy a comprobar que dem no sea 426 00:17:11,279 --> 00:17:13,200 cero, porque si es cero no puedo hacer 427 00:17:13,200 --> 00:17:13,799 esta operación 428 00:17:13,799 --> 00:17:17,220 ¿sí? ahora, todas las 429 00:17:17,220 --> 00:17:19,099 veces que este señor no sea 430 00:17:19,099 --> 00:17:21,140 cero, esta será una operación 431 00:17:21,140 --> 00:17:21,519 inútil 432 00:17:21,519 --> 00:17:25,200 entonces 433 00:17:25,200 --> 00:17:26,500 si yo me espero que 434 00:17:26,500 --> 00:17:29,119 la gente que usa esto lo sepa 435 00:17:29,119 --> 00:17:31,160 utilizar este método o lo que sea 436 00:17:31,160 --> 00:17:33,279 y que entonces aquí no me 437 00:17:33,279 --> 00:17:35,319 de ceros, porque no se puede 438 00:17:35,319 --> 00:17:37,079 dividir por cero, pues 439 00:17:37,079 --> 00:17:38,519 estoy haciendo esta operación 440 00:17:38,519 --> 00:17:40,960 inútil cada vez que estoy usando 441 00:17:40,960 --> 00:17:43,019 este programa, entonces como se hace 442 00:17:43,019 --> 00:17:44,500 desde una forma 443 00:17:44,500 --> 00:17:46,339 optimista 444 00:17:46,339 --> 00:17:48,680 Pues leo el número 445 00:17:48,680 --> 00:17:51,039 El numerador y el denominador 446 00:17:51,039 --> 00:17:52,319 Y a este punto 447 00:17:52,319 --> 00:17:53,599 Hago la operación 448 00:17:53,599 --> 00:17:57,380 Pero esta operación, que sé que es la que podría ir mal 449 00:17:57,380 --> 00:17:58,859 Porque aquí está haciendo 450 00:17:58,859 --> 00:18:00,019 La división 451 00:18:00,019 --> 00:18:01,660 Que si den es cero 452 00:18:01,660 --> 00:18:03,940 Pues esta cosa aquí explotaría 453 00:18:03,940 --> 00:18:06,460 ¿Vale? Porque un número dividido en cero no me vale 454 00:18:06,460 --> 00:18:08,799 Pues la pongo dentro de un bloc 455 00:18:08,799 --> 00:18:09,480 Que trae 456 00:18:09,480 --> 00:18:12,200 Tú prueba a hacer esto 457 00:18:12,200 --> 00:18:13,799 Que va bien 458 00:18:13,799 --> 00:18:15,440 Pues lo has hecho y sigues adelante 459 00:18:15,440 --> 00:18:17,180 Te saltas esto y no hay ningún problema 460 00:18:17,180 --> 00:18:20,599 Que aquí dentro explota algo 461 00:18:20,599 --> 00:18:23,279 Pues entonces te vas a mirar en catch 462 00:18:23,279 --> 00:18:25,039 Y por ejemplo aquí 463 00:18:25,039 --> 00:18:26,279 Lo he hecho muy genérico 464 00:18:26,279 --> 00:18:27,619 Pilla solo una excepción 465 00:18:27,619 --> 00:18:29,559 Si ha explotado una excepción 466 00:18:29,559 --> 00:18:31,119 Pues entonces te metes aquí 467 00:18:31,119 --> 00:18:33,680 Y dices no es válido dividir por cero 468 00:18:33,680 --> 00:18:35,660 Es como un if 469 00:18:35,660 --> 00:18:37,680 Al fin y al cabo lógicamente sí 470 00:18:37,680 --> 00:18:40,380 Pero cambia la forma con que se hace 471 00:18:40,380 --> 00:18:42,440 El otro está haciendo un if directo 472 00:18:42,440 --> 00:18:44,319 Mientras este de aquí lo intenta 473 00:18:44,319 --> 00:18:45,420 Ejecuta normalmente 474 00:18:45,420 --> 00:18:48,339 Y solo si la Java Virtual Machine explota 475 00:18:48,339 --> 00:18:51,099 Pues a este punto recoge la excepción 476 00:18:51,099 --> 00:18:52,660 Y hace lo que tiene que hacer 477 00:18:52,660 --> 00:18:52,839 ¿Vale? 478 00:18:53,140 --> 00:18:56,259 Una de las ventajas de tener un nivel en el medio 479 00:18:56,259 --> 00:18:58,019 Que es la Java Virtual Machine 480 00:18:58,019 --> 00:19:00,519 Que sustantivamente me está interpretando las cosas 481 00:19:00,519 --> 00:19:02,380 Entonces me puede ayudar en este sentido 482 00:19:02,380 --> 00:19:05,660 Él interpreta este comando 483 00:19:05,660 --> 00:19:06,519 Lo va a ejecutar 484 00:19:06,519 --> 00:19:08,880 Si cuando interpreta este comando 485 00:19:08,880 --> 00:19:11,200 Explota y entonces es la Java Virtual Machine 486 00:19:11,200 --> 00:19:12,220 La que crea la excepción 487 00:19:12,220 --> 00:19:14,220 Al darse cuenta que ha creado una excepción 488 00:19:14,220 --> 00:19:16,599 Pues entonces va a buscar si hay un 489 00:19:16,599 --> 00:19:18,880 Un bloque catch que pueda encajar con ese cc 490 00:19:18,880 --> 00:19:20,160 Y si lo hay 491 00:19:20,160 --> 00:19:22,500 Pues ejecuta eso, en vez de explotar 492 00:19:22,500 --> 00:19:24,180 ¿Dudas? 493 00:19:30,299 --> 00:19:30,619 Vale 494 00:19:30,619 --> 00:19:32,519 Existe una clase 495 00:19:32,519 --> 00:19:35,200 Exception, que vosotros buscaréis 496 00:19:35,200 --> 00:19:35,900 En Java 497 00:19:35,900 --> 00:19:38,240 En Google 498 00:19:38,240 --> 00:19:40,319 Java Exception 499 00:19:40,319 --> 00:19:42,579 Y os vais a leer dentro del API 500 00:19:42,579 --> 00:19:45,420 Todo lo que es relacionado con Exception 501 00:19:45,420 --> 00:19:46,559 Para conocerla 502 00:19:46,559 --> 00:19:47,819 A fondo, vale 503 00:19:47,819 --> 00:19:51,200 Cuando hay uno de estos 504 00:19:51,200 --> 00:19:53,579 Errores a tiempo de compilación 505 00:19:53,579 --> 00:19:55,319 A tiempo de ejecución y cosas así 506 00:19:55,319 --> 00:19:57,000 Es la Java Virtual Machine 507 00:19:57,000 --> 00:19:59,539 Que se da cuenta que ha habido este error 508 00:19:59,539 --> 00:20:01,119 Y lo que hace es crear 509 00:20:01,119 --> 00:20:02,700 Un objeto exception 510 00:20:02,700 --> 00:20:05,880 Que sostanzialmente es como un manejador de esta excepción 511 00:20:05,880 --> 00:20:07,359 Es donde se coloca 512 00:20:07,359 --> 00:20:09,519 La información sobre, oye, ¿qué ha pasado? 513 00:20:09,619 --> 00:20:11,599 ¿Ha pasado un error? Pues este es un objeto 514 00:20:11,599 --> 00:20:13,160 Que si tú lo miras dentro 515 00:20:13,160 --> 00:20:14,799 Tiene varios campos y varios métodos 516 00:20:14,799 --> 00:20:15,900 Ahora veremos alguno de ellos 517 00:20:15,900 --> 00:20:17,859 Y aquí dentro está escrito un poco 518 00:20:17,859 --> 00:20:20,859 Lo que pensamos que ha pasado 519 00:20:20,859 --> 00:20:21,539 ¿Vale? 520 00:20:21,740 --> 00:20:23,940 En base a esto tú puedes elegir 521 00:20:23,940 --> 00:20:24,339 ¿Qué hago? 522 00:20:24,799 --> 00:20:28,259 Paro el programa pero aviso el usuario 523 00:20:28,259 --> 00:20:29,420 No digo nada 524 00:20:29,420 --> 00:20:30,940 Lo escribo en un fichero 525 00:20:30,940 --> 00:20:33,700 Me recupero y vuelvo al menú inicial 526 00:20:33,700 --> 00:20:36,440 Lanzo unas rutinas 527 00:20:36,440 --> 00:20:38,099 Para apagar bien 528 00:20:38,099 --> 00:20:40,359 Porque había abierto varios ficheros 529 00:20:40,359 --> 00:20:41,339 Y varias conexiones 530 00:20:41,339 --> 00:20:43,079 Y antes de apagar todo 531 00:20:43,079 --> 00:20:44,920 Pues voy a cerrar estos ficheros 532 00:20:44,920 --> 00:20:46,099 No lo sé 533 00:20:46,099 --> 00:20:49,079 Te da la posibilidad de reaccionar 534 00:20:49,079 --> 00:20:51,019 Frente a un error que no sea una reacción 535 00:20:51,019 --> 00:20:53,400 De ha explotado todo, se ha parado el programa 536 00:20:53,400 --> 00:20:54,680 Y se ha cerrado 537 00:20:54,680 --> 00:20:59,099 En este objeto se va a dar información 538 00:20:59,099 --> 00:21:00,140 Del relevante del error 539 00:21:00,140 --> 00:21:02,079 Como quien lo ha producido 540 00:21:02,079 --> 00:21:05,019 En que línea de código ha explotado esto 541 00:21:05,019 --> 00:21:06,559 Cual es el método que ha hecho 542 00:21:06,559 --> 00:21:08,480 Que ha provocado este error 543 00:21:08,480 --> 00:21:10,619 Cuando 544 00:21:10,619 --> 00:21:12,940 Que ha causado 545 00:21:12,940 --> 00:21:17,579 Un mismo código peligroso 546 00:21:17,579 --> 00:21:19,759 Podría causar distintos tipos de excepciones 547 00:21:19,759 --> 00:21:21,680 Yo puedo marcar este código aquí 548 00:21:21,680 --> 00:21:23,440 Donde hay un acceso a un 549 00:21:23,440 --> 00:21:25,740 Array de objetos 550 00:21:25,740 --> 00:21:28,119 Y pillado el objeto 551 00:21:28,119 --> 00:21:29,140 En posición 3 552 00:21:29,140 --> 00:21:30,319 Hace .name 553 00:21:30,319 --> 00:21:33,880 Esto podría causar tanto una null pointer exception 554 00:21:33,880 --> 00:21:36,660 Como una index out of bound exception 555 00:21:36,660 --> 00:21:38,819 Lo que yo puedo hacer 556 00:21:38,819 --> 00:21:39,799 Es crear 557 00:21:39,799 --> 00:21:41,019 Varios 558 00:21:41,019 --> 00:21:42,859 Catch 559 00:21:42,859 --> 00:21:45,180 De cada una de las excepciones 560 00:21:45,180 --> 00:21:47,279 A partir de las exceptions 561 00:21:47,279 --> 00:21:49,920 Que es la clase, la superclase 562 00:21:49,920 --> 00:21:51,740 Todas son exceptions, digamos así 563 00:21:51,740 --> 00:21:53,920 Pues hay subclases 564 00:21:53,920 --> 00:21:56,720 Más apropiadas para los varios errores 565 00:21:56,720 --> 00:21:58,940 Como puede haber la null pointer exception 566 00:21:58,940 --> 00:22:01,839 La number format exception 567 00:22:01,839 --> 00:22:03,920 La hemos visto, la number format exception 568 00:22:03,920 --> 00:22:10,759 Cuando tú lees nextint 569 00:22:10,759 --> 00:22:12,339 Y escribes gato 570 00:22:12,339 --> 00:22:14,000 Salta una norma 571 00:22:14,000 --> 00:22:14,920 FormatException 572 00:22:14,920 --> 00:22:18,099 Porque tú me has dicho que iba a salir un entero 573 00:22:18,099 --> 00:22:21,200 Y el formato del número 574 00:22:21,200 --> 00:22:21,900 No es correcto 575 00:22:21,900 --> 00:22:24,000 Porque has escrito una letra 576 00:22:24,000 --> 00:22:24,779 Un carácter 577 00:22:24,779 --> 00:22:26,519 IOException 578 00:22:26,519 --> 00:22:28,519 Esta es InputAutoException 579 00:22:28,519 --> 00:22:31,599 Esta suele saltar cuando lo veremos 580 00:22:31,599 --> 00:22:33,880 Al final de este trimestre 581 00:22:33,880 --> 00:22:36,779 Cuando haremos accesos a ficheros 582 00:22:36,779 --> 00:22:38,680 Lectura y escritura en ficheros 583 00:22:38,680 --> 00:22:40,099 Pues esas son entradas y salidas 584 00:22:40,099 --> 00:22:41,880 Y por lo tanto pueden causar 585 00:22:41,880 --> 00:22:45,000 Y hay muchas más 586 00:22:45,000 --> 00:22:47,180 Ahora veremos un esquema más adelante 587 00:22:47,180 --> 00:22:47,700 ¿Vale? 588 00:22:48,720 --> 00:22:50,859 Estas excepciones se pueden manejar 589 00:22:50,859 --> 00:22:52,779 De forma más fina, lo que decíamos antes 590 00:22:52,779 --> 00:22:54,839 En vez de tener un único bloque 591 00:22:54,839 --> 00:22:56,420 Como hemos hecho el ejemplo aquí 592 00:22:56,420 --> 00:22:59,500 Que dice 593 00:22:59,500 --> 00:23:01,920 Pilla 594 00:23:01,920 --> 00:23:03,839 Una excepción cualquiera 595 00:23:03,839 --> 00:23:06,700 Todas son exception, null pointer exception es una exception 596 00:23:06,700 --> 00:23:07,779 Pues cae aquí 597 00:23:07,779 --> 00:23:11,380 Number format exception es una exception 598 00:23:11,380 --> 00:23:13,660 pues cae aquí, entonces estoy haciendo 599 00:23:13,660 --> 00:23:15,519 cualquier excepción haya pasado aquí 600 00:23:15,519 --> 00:23:17,960 pues se ejecuta esto, independientemente 601 00:23:17,960 --> 00:23:19,819 de que sea lo que haya 602 00:23:19,819 --> 00:23:21,700 hecho explotar mi programa 603 00:23:21,700 --> 00:23:23,359 ¿vale? ahora 604 00:23:23,359 --> 00:23:25,799 en el ejemplo que hemos hecho antes, que yo estoy 605 00:23:25,799 --> 00:23:27,779 accediendo a un array de objetos 606 00:23:27,779 --> 00:23:29,740 y luego hago un método sobre este objeto 607 00:23:29,740 --> 00:23:31,259 y puede ser que me equivoque 608 00:23:31,259 --> 00:23:33,380 por distintas formas, puede ser que 609 00:23:33,380 --> 00:23:35,019 o es un 610 00:23:35,019 --> 00:23:37,460 null pointer exception o es un 611 00:23:37,460 --> 00:23:39,500 index out of bound, pues lo que puedo hacer 612 00:23:39,500 --> 00:23:40,900 es un manejo un poquito más fino 613 00:23:40,900 --> 00:23:43,400 ¿Cómo? Simplemente poniendo un solo 614 00:23:43,400 --> 00:23:44,779 Bloque try 615 00:23:44,779 --> 00:23:47,500 Pero poniendo varios bloques catch 616 00:23:47,500 --> 00:23:48,880 Cada catch 617 00:23:48,880 --> 00:23:50,039 Por una 618 00:23:50,039 --> 00:23:53,460 De las excepciones más finas 619 00:23:53,460 --> 00:23:54,460 O sea 620 00:23:54,460 --> 00:23:57,680 Catch number format exception 621 00:23:57,680 --> 00:23:59,559 Pues en el caso en que haya saltado 622 00:23:59,559 --> 00:24:00,619 Una number format exception 623 00:24:00,619 --> 00:24:02,220 Esto es lo que tienes que hacer 624 00:24:02,220 --> 00:24:05,279 Catch arithmetic exception 625 00:24:05,279 --> 00:24:07,779 En el caso en que haya saltado una excepción aritmética 626 00:24:07,779 --> 00:24:09,140 Esto es lo que tienes que hacer 627 00:24:09,140 --> 00:24:11,079 Catch null pointer exception 628 00:24:11,079 --> 00:24:14,000 En caso de que sea un puntador a null 629 00:24:14,000 --> 00:24:15,339 Pues esto es lo que tienes que hacer 630 00:24:15,339 --> 00:24:17,940 Y cuantas me da la gana 631 00:24:17,940 --> 00:24:18,299 ¿Vale? 632 00:24:21,299 --> 00:24:22,920 A ver si me desculpa 633 00:24:22,920 --> 00:24:25,839 De esta forma conseguimos 634 00:24:25,839 --> 00:24:27,480 Tractar excepciones diferentes 635 00:24:27,480 --> 00:24:29,119 De forma diferente, este es el objetivo 636 00:24:29,119 --> 00:24:32,180 Si no nos interesa manejarla de forma diferente 637 00:24:32,180 --> 00:24:34,359 Puedo hacerlo más amplio 638 00:24:34,359 --> 00:24:35,200 O sea, si yo digo 639 00:24:35,200 --> 00:24:37,720 Por ejemplo, la null pointer exception la quiero hacer 640 00:24:37,720 --> 00:24:39,700 De una forma, pero todas las demás 641 00:24:39,700 --> 00:24:41,460 De otra, pues hago dos catch 642 00:24:41,460 --> 00:24:43,680 El primer catch será null pointer 643 00:24:43,680 --> 00:24:45,220 Exception, con su 644 00:24:45,220 --> 00:24:47,779 Gestión, y luego la siguiente 645 00:24:47,779 --> 00:24:49,220 Será un catch de exception 646 00:24:49,220 --> 00:24:51,680 General, entonces si es null pointer 647 00:24:51,680 --> 00:24:53,880 Pillará la primera, y en cualquier 648 00:24:53,880 --> 00:24:55,640 Otro caso, pillará la siguiente 649 00:24:55,640 --> 00:24:57,180 ¿Si? 650 00:24:58,319 --> 00:25:01,039 No, si 651 00:25:01,039 --> 00:25:01,839 Pilla un catch 652 00:25:01,839 --> 00:25:04,200 El catch más adecuado 653 00:25:04,200 --> 00:25:11,170 No, porque o ha explotado con null 654 00:25:11,170 --> 00:25:12,210 O ha explotado con index 655 00:25:12,210 --> 00:25:15,549 O ha explotado cuando ha accedido al objeto 656 00:25:15,549 --> 00:25:17,410 Y entonces es un null pointer 657 00:25:17,410 --> 00:25:19,690 O ha explotado cuando ha accedido a la posición 658 00:25:19,690 --> 00:25:21,269 Que no era dentro del array 659 00:25:21,269 --> 00:25:22,829 Y entonces te ha dado la index out 660 00:25:22,829 --> 00:25:24,410 Las dos no te las puedes dar 661 00:25:24,410 --> 00:25:27,210 A lo mejor luego te habría dado también la siguiente 662 00:25:27,210 --> 00:25:29,710 Pero dependiendo del orden 663 00:25:29,710 --> 00:25:30,549 Con que la has ejecutado 664 00:25:30,549 --> 00:25:31,750 O una o la otra antes 665 00:25:31,750 --> 00:25:35,170 Por ahora nosotros no tenemos paralelismo 666 00:25:35,170 --> 00:25:36,650 Es todo secuencial 667 00:25:36,650 --> 00:25:38,710 Entonces cuando llego a la operación 668 00:25:38,710 --> 00:25:40,730 Que me da el error, pues el error será ese 669 00:25:40,730 --> 00:25:47,950 Existe también otra cláusula que puedo añadir 670 00:25:47,950 --> 00:25:50,789 O sea, try, catch, catch, catch, catch, catch 671 00:25:50,789 --> 00:25:53,529 Y al final puedo poner una cláusula finally 672 00:25:53,529 --> 00:25:57,869 La cláusula finally es un trozo, un bloque 673 00:25:57,869 --> 00:26:00,869 Que se ejecutará siempre 674 00:26:00,869 --> 00:26:04,049 Tanto si no ha habido excepciones 675 00:26:04,049 --> 00:26:06,430 Como si ha habido una excepción 676 00:26:06,430 --> 00:26:10,710 Para que nos entendamos 677 00:26:10,710 --> 00:26:15,109 Por ejemplo, aquí tengo un bloque 1 678 00:26:15,109 --> 00:26:17,930 Luego tengo el try, bloque 2 679 00:26:17,930 --> 00:26:22,049 Catch, arithmetic exception, bloque 3 680 00:26:22,049 --> 00:26:26,130 Catch, exception, bloque 4 681 00:26:26,130 --> 00:26:27,430 Y luego bloque 5 682 00:26:27,430 --> 00:26:28,250 ¿Vale? 683 00:26:28,670 --> 00:26:31,049 Si no hay excepciones, todo va bien 684 00:26:31,049 --> 00:26:33,009 Se ejecutará el bloque 1 685 00:26:33,009 --> 00:26:34,809 Luego el bloque 2 686 00:26:34,809 --> 00:26:36,470 Y luego el bloque 5 687 00:26:36,470 --> 00:26:40,140 Los catch me lo certo 688 00:26:40,140 --> 00:26:43,940 Si en la ejecución del bloque 2 689 00:26:43,940 --> 00:26:47,180 Hubiese un error de tipo aritmético 690 00:26:47,180 --> 00:26:48,880 O sea, un Arithmetic Exception 691 00:26:48,880 --> 00:26:50,839 Se ejecuta el bloque 1 692 00:26:50,839 --> 00:26:53,160 Se empieza a ejecutar el bloque 2 693 00:26:53,160 --> 00:26:55,440 Aquí hay la Arithmetic Exception 694 00:26:55,440 --> 00:26:58,059 Por lo tanto, se ejecutaría el bloque 3 695 00:26:58,059 --> 00:27:00,240 Y después se saltaría el bloque 5 696 00:27:00,240 --> 00:27:02,940 1, 2 con error 697 00:27:02,940 --> 00:27:04,019 3, 5 698 00:27:04,019 --> 00:27:05,559 ¿Sí? 699 00:27:06,079 --> 00:27:08,500 Si en vez el error es de otro tipo 700 00:27:08,500 --> 00:27:09,960 Por ejemplo, un Null Pointer Exception 701 00:27:09,960 --> 00:27:12,039 O un I.O. exception 702 00:27:12,039 --> 00:27:13,700 Pues lo que haría es 703 00:27:13,700 --> 00:27:15,980 Ejecuto el bloque 1, ejecuto el bloque 2 704 00:27:15,980 --> 00:27:17,259 Donde salta el error 705 00:27:17,259 --> 00:27:19,079 Porque el bloque protegido es este 706 00:27:19,079 --> 00:27:22,140 Me saltaría esta catch de aquí 707 00:27:22,140 --> 00:27:24,480 Que pero diría, no, esta no es una arithmetic exception 708 00:27:24,480 --> 00:27:26,480 Es otra exception, es una I.O. exception 709 00:27:26,480 --> 00:27:27,819 Por ejemplo, por lo tanto 710 00:27:27,819 --> 00:27:29,359 Pilaría el segundo catch 711 00:27:29,359 --> 00:27:31,680 Ejecutaría el bloque 4 712 00:27:31,680 --> 00:27:33,599 Y una vez ejecutado el bloque 4 713 00:27:33,599 --> 00:27:35,319 Sigue adelante con el bloque 5 714 00:27:35,319 --> 00:27:38,839 Dudas hasta aquí 715 00:27:38,839 --> 00:27:41,539 Tened en cuenta que si yo no pusiera 716 00:27:41,539 --> 00:27:43,619 esto, cuando llega 717 00:27:43,619 --> 00:27:44,940 aquí y explota 718 00:27:44,940 --> 00:27:47,400 se acabó el programa, esto no lo ejecutará 719 00:27:47,400 --> 00:27:49,339 nunca, en vez con 720 00:27:49,339 --> 00:27:50,940 este mecanismo de try-catch 721 00:27:50,940 --> 00:27:53,299 lo que estoy haciendo es recuperarme de un error 722 00:27:53,299 --> 00:27:55,519 a tiempo de ejecución, ha habido el error 723 00:27:55,519 --> 00:27:57,319 lo he pillado, lo he 724 00:27:57,319 --> 00:27:58,200 gestionado 725 00:27:58,200 --> 00:28:00,359 y sigue adelante 726 00:28:00,359 --> 00:28:02,900 por ejemplo, cuando nosotros usamos una list 727 00:28:02,900 --> 00:28:04,920 y no sabemos si la lista es nula o no 728 00:28:04,920 --> 00:28:06,519 y decimos list.add 729 00:28:06,519 --> 00:28:08,279 mi lista.add 730 00:28:08,279 --> 00:28:11,119 pues a lo mejor la lista 731 00:28:11,119 --> 00:28:13,000 es null, y por lo tanto aquí explota 732 00:28:13,000 --> 00:28:15,160 y aquí me pongo un catch 733 00:28:15,160 --> 00:28:16,480 null pointer exception 734 00:28:16,480 --> 00:28:18,960 y si pillan null pointer exception, lo que hago es 735 00:28:18,960 --> 00:28:20,779 que mi lista es igual a new 736 00:28:20,779 --> 00:28:23,119 array list, paréntesis, paréntesis 737 00:28:23,119 --> 00:28:24,519 y luego rehago la add 738 00:28:24,519 --> 00:28:26,980 entonces he conseguido recuperarme 739 00:28:26,980 --> 00:28:28,660 de este error y seguir allá 740 00:28:28,660 --> 00:28:31,039 ¿tú das? 741 00:28:35,240 --> 00:28:37,640 en teoría sí 742 00:28:37,640 --> 00:28:40,339 en teoría desde 743 00:28:40,339 --> 00:28:42,759 el primero que encuentra es el que ejecuta 744 00:28:42,759 --> 00:28:48,759 Entonces, si pusiera esto antes, pues me saltaría siempre exception, o sea, creo. 745 00:28:48,759 --> 00:28:58,480 ¿Te pone un mensaje o algo? 746 00:28:58,480 --> 00:29:00,480 Si tú quieres, sí. 747 00:29:00,480 --> 00:29:02,480 ¿Dónde lo tienes el mensaje? 748 00:29:02,480 --> 00:29:08,480 Este es el objeto que la, la, la llave de tool machine has creado, 749 00:29:08,480 --> 00:29:12,480 donde está la información sobre lo que ha pasado, 750 00:29:12,480 --> 00:29:18,480 y si tú haces un ae.getMessage, tendrás el mensaje que ha pasado allí. 751 00:29:18,480 --> 00:29:27,039 que ha pasado allí, si tu no pones nada, no te hace nada, si tu pones system.auto.println 752 00:29:27,039 --> 00:29:32,839 de ae.getmessage te escribirá el mensaje, lo mismo que aparece cuando explota y te aparece 753 00:29:32,839 --> 00:29:40,119 ahí pasa, lo mismo que aparece, y si tu haces ae.printstack, no me acuerdo, lo veremos, 754 00:29:40,119 --> 00:29:47,079 pues te escribe exactamente lo que ves normalmente, pero estas aquí y puedes recuperarte, no 755 00:29:47,079 --> 00:29:54,920 No has perdido, no has apagado el ordenador, puedes escribir el mismo objeto, el mismo error y seguir adelante si quieres, recuperarlo y seguir adelante. 756 00:29:55,799 --> 00:30:05,480 O este error, escribirlo en un fichero de log de, mira, hoy a esta hora ha pasado este error de aquí, para que luego tú cuando lo tienes en producción una semana, 757 00:30:05,480 --> 00:30:12,920 después de una semana te vas a mirar los logs y ves, mira, tres veces a lo largo de esta semana ha dado una excepción porque este usuario ha intentado conectarse y ha pasado esto. 758 00:30:12,920 --> 00:30:15,059 Y vas haciendo un plan de 759 00:30:15,059 --> 00:30:17,259 ¿Sí? 760 00:30:18,759 --> 00:30:20,059 Cuidado en rojo 761 00:30:20,059 --> 00:30:21,319 El orden es importante 762 00:30:21,319 --> 00:30:24,140 Otra opción 763 00:30:24,140 --> 00:30:25,519 Con un bloque finally 764 00:30:25,519 --> 00:30:26,380 ¿Vale? 765 00:30:26,799 --> 00:30:29,039 Entonces, ¿qué pasa sin excepciones? 766 00:30:30,059 --> 00:30:31,319 El bloque 1 se ejecuta 767 00:30:31,319 --> 00:30:33,339 Luego se ejecuta el bloque 2 768 00:30:33,339 --> 00:30:35,519 Después de haber ejecutado el bloque 2 769 00:30:35,519 --> 00:30:37,299 Siempre se ejecuta el finally 770 00:30:37,299 --> 00:30:38,799 Y luego se sigue adelante 771 00:30:38,799 --> 00:30:40,039 ¿Sí? 772 00:30:41,339 --> 00:30:42,859 Excepción de tipo aritmético 773 00:30:42,859 --> 00:30:44,319 Que es un arithmetic exception 774 00:30:44,319 --> 00:30:46,220 Pues entonces bloque 1 775 00:30:46,220 --> 00:30:48,539 En el bloque 2 hay el error 776 00:30:48,539 --> 00:30:50,059 El bloque error 777 00:30:50,059 --> 00:30:52,180 Se pilla, se ejecuta 778 00:30:52,180 --> 00:30:54,799 Se ha recogido desde este catch 779 00:30:54,799 --> 00:30:56,420 Por lo tanto va al bloque 3 780 00:30:56,420 --> 00:30:57,500 Ejecuta el bloque 3 781 00:30:57,500 --> 00:31:00,079 Luego está la final y que se ejecuta siempre 782 00:31:00,079 --> 00:31:03,119 Entonces se ejecuta y después se pasa al bloque 5 783 00:31:03,119 --> 00:31:09,170 Esto es algo que se hace 784 00:31:09,170 --> 00:31:11,490 Tanto si hay error como si no 785 00:31:11,490 --> 00:31:14,869 No necesariamente 786 00:31:14,869 --> 00:31:29,819 es un bloque 787 00:31:29,819 --> 00:31:31,359 puede poner lo que te haga, me llama a todos 788 00:31:31,359 --> 00:31:34,539 métodos, while, truth 789 00:31:34,539 --> 00:31:35,519 lo que sea 790 00:31:35,519 --> 00:31:38,140 esto es más bien porque 791 00:31:38,140 --> 00:31:40,099 si tú aquí hicieras una cosa 792 00:31:40,099 --> 00:31:41,940 y luego aquí harías la misma 793 00:31:41,940 --> 00:31:44,259 pues la idea es que tú 794 00:31:44,259 --> 00:31:46,099 estas dos cosas las pongas aquí 795 00:31:46,099 --> 00:31:47,740 y se ejecutará siempre así 796 00:31:47,740 --> 00:31:50,160 y está referido a este bloque aquí 797 00:31:50,160 --> 00:31:52,579 el ejemplo de antes de añadir a una lista 798 00:31:52,579 --> 00:31:53,480 tú dices 799 00:31:53,480 --> 00:31:54,859 Añadir a la lista 800 00:31:54,859 --> 00:31:56,099 Pues a lo mejor la añado a la lista 801 00:31:56,099 --> 00:31:56,759 Lo meto aquí 802 00:31:56,759 --> 00:31:59,099 Y aquí hago otro hacer 803 00:31:59,099 --> 00:31:59,640 No lo sé 804 00:31:59,640 --> 00:32:00,960 Un ejemplo un poco feo 805 00:32:00,960 --> 00:32:02,240 Pero no lo sé 806 00:32:02,240 --> 00:32:02,799 ¿Sí? 807 00:32:06,539 --> 00:32:09,200 El exception de otro tipo diferente 808 00:32:09,200 --> 00:32:10,880 Imaginémonos que yo estoy aquí 809 00:32:10,880 --> 00:32:11,319 Try 810 00:32:11,319 --> 00:32:13,579 Lo que pasa es que 811 00:32:13,579 --> 00:32:15,019 El bloque 1 lo ejecuto 812 00:32:15,019 --> 00:32:17,059 El bloque 2 explota una IO exception 813 00:32:17,059 --> 00:32:18,460 Cuidado que no hay un catch 814 00:32:18,460 --> 00:32:19,920 De IO exception 815 00:32:19,920 --> 00:32:20,619 ¿Vale? 816 00:32:20,680 --> 00:32:21,920 Entonces no se ejecuta nada 817 00:32:21,920 --> 00:32:23,059 Pero el finally sí se ejecuta 818 00:32:23,480 --> 00:32:24,140 El 4 819 00:32:24,140 --> 00:32:25,319 ¿Vale? 820 00:32:25,500 --> 00:32:26,599 Y después 821 00:32:26,599 --> 00:32:28,339 No se ejecuta el 5 822 00:32:28,339 --> 00:32:30,359 Porque ha explotado 823 00:32:30,359 --> 00:32:31,359 No lo ha capturado 824 00:32:31,359 --> 00:32:33,339 ¿Sí? 825 00:32:33,799 --> 00:32:34,839 Entonces aquí veis 826 00:32:34,839 --> 00:32:35,259 La 827 00:32:35,259 --> 00:32:36,920 La función 828 00:32:36,920 --> 00:32:40,400 Si voy a exception 829 00:32:40,400 --> 00:32:41,799 ¿Qué método me encuentro? 830 00:32:41,880 --> 00:32:42,519 Unos cuantos 831 00:32:42,519 --> 00:32:43,279 Los vais a ver 832 00:32:43,279 --> 00:32:43,519 ¿Vale? 833 00:32:43,599 --> 00:32:44,319 Los útiles 834 00:32:44,319 --> 00:32:45,420 GetMessage 835 00:32:45,420 --> 00:32:45,880 ¿Vale? 836 00:32:45,920 --> 00:32:47,119 Me devuelve un string 837 00:32:47,119 --> 00:32:48,400 Este getMessage 838 00:32:48,400 --> 00:32:49,240 Es el mensaje 839 00:32:49,240 --> 00:32:50,059 Que me explica 840 00:32:50,059 --> 00:32:50,759 Que ha pasado 841 00:32:50,759 --> 00:32:51,819 Uno en pointer exception 842 00:32:51,819 --> 00:32:52,319 Me dirá 843 00:32:52,319 --> 00:32:53,220 El objeto 844 00:32:53,220 --> 00:32:54,559 Que ha pedido 845 00:32:54,559 --> 00:32:55,039 Es null 846 00:32:55,039 --> 00:32:57,720 Un index out of bound exception me dirá 847 00:32:57,720 --> 00:32:59,940 Has intentado acceder a la posición 13 848 00:32:59,940 --> 00:33:01,619 La posición 13 no existe en el array 849 00:33:01,619 --> 00:33:03,759 Un IO exception me dirá 850 00:33:03,759 --> 00:33:06,819 Has alcanzado el final del fichero 851 00:33:06,819 --> 00:33:08,920 Intentando leer más cosas 852 00:33:08,920 --> 00:33:10,200 Pues me da 853 00:33:10,200 --> 00:33:11,539 Un mensaje 854 00:33:11,539 --> 00:33:13,640 Está claro que estos mensajes son muy genéricos 855 00:33:13,640 --> 00:33:15,779 Porque valen en general 856 00:33:15,779 --> 00:33:18,039 Cuando nosotros crearemos 857 00:33:18,039 --> 00:33:20,420 Nuestras propias excepciones 858 00:33:20,420 --> 00:33:22,779 Y lanzaremos nuestras propias excepciones 859 00:33:22,779 --> 00:33:23,900 Pues entonces 860 00:33:23,900 --> 00:33:26,099 Lo que podemos hacer es meter un mensaje 861 00:33:26,099 --> 00:33:27,720 Más explícito y más interesante 862 00:33:27,720 --> 00:33:30,200 Para nuestro caso, en nuestra situación 863 00:33:30,200 --> 00:33:37,579 ToString, ¿vale? 864 00:33:37,640 --> 00:33:39,299 El toString devuelve 865 00:33:39,299 --> 00:33:42,359 Más o menos lo mismo, pero es una representación 866 00:33:42,359 --> 00:33:43,960 De esta excepción, entonces ¿qué hace? 867 00:33:44,559 --> 00:33:46,740 Devuelve la clase de la excepción 868 00:33:46,740 --> 00:33:48,079 ¿Qué clase es? 869 00:33:48,160 --> 00:33:50,099 Por ejemplo, IOException 870 00:33:50,099 --> 00:33:52,440 ¿Vale? Concadenada con esta cosa 871 00:33:52,440 --> 00:33:54,559 Entonces, es lo mismo 872 00:33:54,559 --> 00:33:56,759 Es siempre el mensaje, pero además me da información 873 00:33:56,759 --> 00:33:57,900 Sobre cuál es la clase 874 00:33:57,900 --> 00:34:00,440 Digamos que esto es más orientado 875 00:34:00,440 --> 00:34:01,900 Para que lo digas al usuario 876 00:34:01,900 --> 00:34:03,920 Esto es más orientado para ti programador 877 00:34:03,920 --> 00:34:06,039 Para ver qué excepción es 878 00:34:06,039 --> 00:34:10,219 Exception de string es un constructor 879 00:34:10,219 --> 00:34:11,679 Que me permite crear una excepción 880 00:34:11,679 --> 00:34:14,019 Este string es el mensaje 881 00:34:14,019 --> 00:34:15,900 Entonces si yo me quiero crear una 882 00:34:15,900 --> 00:34:18,340 Excepción mía, lo puedo hacer 883 00:34:18,340 --> 00:34:19,119 Creando 884 00:34:19,119 --> 00:34:22,360 Exception x es igual a new exception 885 00:34:22,360 --> 00:34:22,860 De 886 00:34:22,860 --> 00:34:26,099 No has pedido que haga las cosas 887 00:34:26,099 --> 00:34:26,699 Por favor 888 00:34:26,699 --> 00:34:29,099 Esa es una excepción que luego lanzaré 889 00:34:29,099 --> 00:34:30,420 Y me dirá como error 890 00:34:30,420 --> 00:34:31,619 Pues no lo has pedido por favor 891 00:34:31,619 --> 00:34:35,480 PrintStackTrace 892 00:34:35,480 --> 00:34:38,219 Es lo que sale normalmente 893 00:34:38,219 --> 00:34:39,739 Toda esa parrafada roja 894 00:34:39,739 --> 00:34:40,960 Que sale normalmente 895 00:34:40,960 --> 00:34:42,320 Me está diciendo 896 00:34:42,320 --> 00:34:45,400 La traza de la pila 897 00:34:45,400 --> 00:34:46,519 De llamadas 898 00:34:46,519 --> 00:34:48,179 Que ha llegado a este error 899 00:34:48,179 --> 00:34:49,380 O sea, muchas veces 900 00:34:49,380 --> 00:34:50,679 Yo tengo un programa 901 00:34:50,679 --> 00:34:52,559 Que llama add 902 00:34:52,559 --> 00:34:54,300 Pero dentro de add 903 00:34:54,300 --> 00:34:55,820 Se llama otro método 904 00:34:55,820 --> 00:34:57,179 Que se llama otro método 905 00:34:57,179 --> 00:34:59,460 Y es en este método aquí donde ha explotado 906 00:34:59,460 --> 00:35:01,900 ¿Vale? Entonces el print stack trace 907 00:35:01,900 --> 00:35:03,139 Lo que me dice es, mira 908 00:35:03,139 --> 00:35:04,760 Yo estaba en este método de aquí 909 00:35:04,760 --> 00:35:06,360 Este método de aquí ha explotado 910 00:35:06,360 --> 00:35:09,440 Y ha mandado, ha intentado 911 00:35:09,440 --> 00:35:11,579 Ver si había una catch 912 00:35:11,579 --> 00:35:13,380 En el método que lo ha llamado 913 00:35:13,380 --> 00:35:15,760 Como no había una catch allí 914 00:35:15,760 --> 00:35:17,340 Ha salido a tu método 915 00:35:17,340 --> 00:35:18,179 A tu método add 916 00:35:18,179 --> 00:35:20,519 Y allí no había una catch, entonces ha salido arriba 917 00:35:20,519 --> 00:35:21,659 Hasta llegar a tu main 918 00:35:21,659 --> 00:35:24,099 Y como no ha habido en ningún lado de estos 919 00:35:24,099 --> 00:35:26,519 Una quechua que me ha recuperado este problema 920 00:35:26,519 --> 00:35:28,059 Pues he explotado 921 00:35:28,059 --> 00:35:29,199 Pero tú ves 922 00:35:29,199 --> 00:35:31,659 Todas las llamadas que ha habido 923 00:35:31,659 --> 00:35:34,000 Para saber dónde está de verdad el error 924 00:35:34,000 --> 00:35:36,500 ¿Entiende más o menos? 925 00:35:37,599 --> 00:35:38,579 Si lo miráis 926 00:35:38,579 --> 00:35:41,019 Cuando sale una de estas pantallazos rojos 927 00:35:41,019 --> 00:35:42,980 Pues dentro hay todos los métodos 928 00:35:42,980 --> 00:35:44,340 Algunos vuestros 929 00:35:44,340 --> 00:35:47,860 Y algunos de clases que estáis utilizando 930 00:35:47,860 --> 00:35:50,739 Que os hace entender 931 00:35:50,739 --> 00:35:52,239 donde ha habido el error de verdad 932 00:35:52,239 --> 00:35:56,090 entonces 933 00:35:56,090 --> 00:35:58,550 así como se pueden capturar 934 00:35:58,550 --> 00:36:01,250 excepciones, se pueden lanzar 935 00:36:01,250 --> 00:36:03,010 excepciones, o sea yo puedo hacer 936 00:36:03,010 --> 00:36:04,929 que mi programa en un determinado momento 937 00:36:04,929 --> 00:36:06,829 diga, oye mira, si llegas aquí 938 00:36:06,829 --> 00:36:08,769 y hay una determinada condición 939 00:36:08,769 --> 00:36:10,889 pues explota, lanza 940 00:36:10,889 --> 00:36:12,489 una condición, lanza una excepción 941 00:36:12,489 --> 00:36:14,769 y imaginaos, normalmente esto se hace 942 00:36:14,769 --> 00:36:16,449 en un método, yo tengo mi método 943 00:36:16,449 --> 00:36:19,070 que hace cosas, y en un determinado 944 00:36:19,070 --> 00:36:20,730 momento dice, oye mira, no puedo seguir 945 00:36:20,730 --> 00:36:23,250 adelante, entonces lánzame una excepción 946 00:36:23,250 --> 00:36:24,409 por ejemplo 947 00:36:24,409 --> 00:36:26,150 si yo tengo el método divide 948 00:36:26,150 --> 00:36:28,210 que pilla dos números 949 00:36:28,210 --> 00:36:31,190 y divide el primero por el segundo 950 00:36:31,190 --> 00:36:32,789 si entra aquí dentro 951 00:36:32,789 --> 00:36:34,769 y se da cuenta que el segundo número 952 00:36:34,769 --> 00:36:36,670 es igual a cero 953 00:36:36,670 --> 00:36:38,949 podría lanzar una excepción 954 00:36:38,949 --> 00:36:40,389 aritmética excepción 955 00:36:40,389 --> 00:36:42,769 o mi excepción propia de 956 00:36:42,769 --> 00:36:45,130 division divided by zero 957 00:36:45,130 --> 00:36:46,650 excepción 958 00:36:46,650 --> 00:36:48,170 para comunicarte 959 00:36:48,170 --> 00:36:50,070 oye mira, no puedo seguir adelante 960 00:36:50,070 --> 00:36:52,070 Porque me estás intentando hacer una división por cero 961 00:36:52,070 --> 00:36:58,039 Es mi método que la lanza 962 00:36:58,039 --> 00:37:00,219 Ahora, quien usa mi método 963 00:37:00,219 --> 00:37:02,400 Puede hacer una try-catch 964 00:37:02,400 --> 00:37:04,900 Para intentar recolectar esa excepción 965 00:37:04,900 --> 00:37:08,340 Es un mecanismo de funcionamiento 966 00:37:08,340 --> 00:37:09,019 Es 967 00:37:09,019 --> 00:37:12,679 Imagínate que tú estás haciendo algo complejo 968 00:37:12,679 --> 00:37:13,960 Estás haciendo tu propia 969 00:37:13,960 --> 00:37:16,539 Linked list 970 00:37:16,539 --> 00:37:17,159 ¿Vale? 971 00:37:17,239 --> 00:37:18,239 Como hemos hecho nosotros 972 00:37:18,239 --> 00:37:19,260 Mi lista es 973 00:37:19,260 --> 00:37:22,019 Y quieres que cuando alguien intente poner 974 00:37:22,019 --> 00:37:23,679 Un objeto nuevo en la lista 975 00:37:23,679 --> 00:37:24,820 Y este objeto es null 976 00:37:24,820 --> 00:37:27,320 Tú lo avises que no lo puede hacer 977 00:37:27,320 --> 00:37:29,519 Y en vez de decir, no hago nada 978 00:37:29,519 --> 00:37:32,059 Si él añade null y no pasa nada 979 00:37:32,059 --> 00:37:34,079 Mágicamente, pues lo que hago es 980 00:37:34,079 --> 00:37:35,579 Crearme una excepción que sea 981 00:37:35,579 --> 00:37:38,320 Has añadido null exception 982 00:37:38,320 --> 00:37:40,460 Y cuando yo 983 00:37:40,460 --> 00:37:42,300 Estoy implementando mi método 984 00:37:42,300 --> 00:37:44,039 Y voy allí 985 00:37:44,039 --> 00:37:46,480 Y digo, el objeto que me has pasado es null 986 00:37:46,480 --> 00:37:48,860 Y el objeto que me has pasado es null 987 00:37:48,860 --> 00:37:50,260 Pues lanza 988 00:37:50,260 --> 00:37:51,300 La excepción 989 00:37:51,300 --> 00:37:53,159 Has pasado un efecto null 990 00:37:53,159 --> 00:37:54,739 ¿Vale? 991 00:37:55,139 --> 00:37:56,679 ¿Qué hace esto? 992 00:37:56,960 --> 00:37:59,239 Hace que el método art que estoy creando yo 993 00:37:59,239 --> 00:38:02,019 Pues otros cuando lo usan 994 00:38:02,019 --> 00:38:04,199 Puedan ponerlo dentro de un try catch 995 00:38:04,199 --> 00:38:05,880 Y poner un catch de 996 00:38:05,880 --> 00:38:08,179 Has añadido un null exception 997 00:38:08,179 --> 00:38:09,980 Y en el caso en que 998 00:38:09,980 --> 00:38:11,380 Alguien intenta añadir algo 999 00:38:11,380 --> 00:38:13,679 Pues recogen esa cosa aquí 1000 00:38:13,679 --> 00:38:15,059 Y ven que ha pasado 1001 00:38:15,059 --> 00:38:16,559 Porque has intentado añadir un null 1002 00:38:16,559 --> 00:38:17,619 O no querías 1003 00:38:17,619 --> 00:38:19,519 O a lo mejor si lo querías 1004 00:38:19,519 --> 00:38:22,079 Y cuando pasa eso es una señal para hacer otra cosa 1005 00:38:22,079 --> 00:38:22,860 No sé 1006 00:38:22,860 --> 00:38:24,780 Este es el mecanismo 1007 00:38:24,780 --> 00:38:26,420 Luego para qué sirve 1008 00:38:26,420 --> 00:38:28,840 Depende del momento 1009 00:38:28,840 --> 00:38:29,440 ¿Sí? 1010 00:38:29,599 --> 00:38:30,820 Vamos a hacer unos ejemplitos 1011 00:38:30,820 --> 00:38:32,559 De ejercicios 1012 00:38:32,559 --> 00:38:32,780 ¿Vale? 1013 00:38:32,840 --> 00:38:34,039 ¿Cómo se lanza una excepción? 1014 00:38:34,139 --> 00:38:35,019 Con el comando throw 1015 00:38:35,019 --> 00:38:36,039 Lanzar 1016 00:38:36,039 --> 00:38:45,199 Depende 1017 00:38:45,199 --> 00:38:48,440 Habrá situaciones en que a lo mejor no hay unir 1018 00:38:48,440 --> 00:38:49,019 A lo mejor 1019 00:38:49,019 --> 00:38:49,900 Pero sí 1020 00:38:49,900 --> 00:38:50,380 O sea 1021 00:38:50,380 --> 00:38:51,519 No hay que existe 1022 00:38:51,519 --> 00:38:53,659 O programas de una forma o programas de otra 1023 00:38:53,659 --> 00:38:54,360 ¿Vale? 1024 00:38:54,360 --> 00:38:57,480 Además la programación optimista 1025 00:38:57,480 --> 00:38:59,199 La puedes hacer 1026 00:38:59,199 --> 00:39:01,019 Porque alguien te está lanzando las excepciones 1027 00:39:01,019 --> 00:39:02,579 Si alguien no lanza las excepciones 1028 00:39:02,579 --> 00:39:03,420 Pues entonces no 1029 00:39:03,420 --> 00:39:06,340 Tú dices, si yo hago la 1030 00:39:06,340 --> 00:39:07,860 Nextint 1031 00:39:07,860 --> 00:39:11,059 Y podría ser que explote 1032 00:39:11,059 --> 00:39:12,260 Pero yo digo 1033 00:39:12,260 --> 00:39:14,780 Cruzo los dedos y sigo adelante 1034 00:39:14,780 --> 00:39:17,300 Pero esto porque quien ha implementado la Nextint 1035 00:39:17,300 --> 00:39:18,380 Dentro 1036 00:39:18,380 --> 00:39:19,500 En un determinado momento 1037 00:39:19,500 --> 00:39:21,920 Pues si pasa esta cosa aquí, explota 1038 00:39:21,920 --> 00:39:24,119 O si tú explotas de otra forma 1039 00:39:24,119 --> 00:39:26,019 En una cache allí dentro 1040 00:39:26,019 --> 00:39:28,219 Pues lanza esta excepción aquí 1041 00:39:28,219 --> 00:39:30,579 Esto podría ir en una cache 1042 00:39:30,579 --> 00:39:32,739 Cosa se complica 1043 00:39:32,739 --> 00:39:33,980 ¿Sí? 1044 00:39:34,920 --> 00:39:36,179 Pero la idea es que 1045 00:39:36,179 --> 00:39:38,340 Si esto, el try-catch 1046 00:39:38,340 --> 00:39:41,099 Es para pillar una excepción 1047 00:39:41,099 --> 00:39:42,579 Capturar una excepción 1048 00:39:42,579 --> 00:39:45,139 Quiere decir que alguien la lanza en algún lado de la excepción 1049 00:39:45,139 --> 00:39:46,880 ¿Y cómo se lanza una excepción? 1050 00:39:47,239 --> 00:39:47,739 Pues así 1051 00:39:47,739 --> 00:39:49,719 ¿Vale? 1052 00:39:50,139 --> 00:39:52,559 Yo puedo comandar en un determinado momento 1053 00:39:52,559 --> 00:39:54,420 de mi programa 1054 00:39:54,420 --> 00:39:56,760 o si llegas aquí y hay determinadas 1055 00:39:56,760 --> 00:39:58,860 condiciones, pues aquí no puedes 1056 00:39:58,860 --> 00:40:00,639 seguir adelante, lanza una excepción 1057 00:40:00,639 --> 00:40:02,539 para que diga, oye mira, aquí 1058 00:40:02,539 --> 00:40:04,780 nos bloqueamos y esta excepción 1059 00:40:04,780 --> 00:40:06,380 empezará a subir 1060 00:40:06,380 --> 00:40:08,460 a quien me ha llamado a mí 1061 00:40:08,460 --> 00:40:10,619 a quien ha llamado el que me ha llamado a mí 1062 00:40:10,619 --> 00:40:12,860 a quien ha llamado el que no ha llamado el que no ha llamado a mí 1063 00:40:12,860 --> 00:40:13,880 hasta llegar al main 1064 00:40:13,880 --> 00:40:16,820 en la esperanza que por algún lado haya un catch 1065 00:40:16,820 --> 00:40:17,739 que la rejoja 1066 00:40:17,739 --> 00:40:20,239 si no hay ningún catch y llega al main 1067 00:40:20,239 --> 00:40:21,820 pues entonces el programa se para 1068 00:40:21,820 --> 00:40:27,920 El objetivo que se le pasa 1069 00:40:27,920 --> 00:40:29,340 El objeto que se le pasa a Tro 1070 00:40:29,340 --> 00:40:31,059 Tiene que ser de la clase Exception 1071 00:40:31,059 --> 00:40:33,460 O de cualquier subclase que extienda esta 1072 00:40:33,460 --> 00:40:34,840 Incluido 1073 00:40:34,840 --> 00:40:38,400 Una clase mía 1074 00:40:38,400 --> 00:40:39,679 Que me creo yo 1075 00:40:39,679 --> 00:40:41,920 De clase miException 1076 00:40:41,920 --> 00:40:43,820 ExtendsException 1077 00:40:43,820 --> 00:40:45,920 Y me hago mis propias excepciones 1078 00:40:45,920 --> 00:40:48,380 Cuando un programa es suficientemente complejo 1079 00:40:48,380 --> 00:40:49,760 Y hay cosas que pueden pasar 1080 00:40:49,760 --> 00:40:52,039 Por ejemplo, en esto de las alumnos 1081 00:40:52,039 --> 00:40:53,420 Escuela y cosas por el estilo 1082 00:40:53,420 --> 00:40:55,059 Pues yo podría crear 1083 00:40:55,059 --> 00:40:57,800 Excepciones del tipo 1084 00:40:57,800 --> 00:40:59,480 Alumnos ya existentes 1085 00:40:59,480 --> 00:41:00,019 Exception 1086 00:41:00,019 --> 00:41:02,880 Que si alguien intenta crear un nuevo alumno 1087 00:41:02,880 --> 00:41:04,699 Que ya existe porque tiene el mismo código 1088 00:41:04,699 --> 00:41:05,619 Pues explote 1089 00:41:05,619 --> 00:41:07,179 Con una excepción 1090 00:41:07,179 --> 00:41:11,420 Luego será recogida y que siga 1091 00:41:11,420 --> 00:41:14,139 Throw 1092 00:41:14,139 --> 00:41:17,019 En el momento que se hace el throw 1093 00:41:17,019 --> 00:41:19,460 Se sale inmediatamente del bloco de código actual 1094 00:41:19,460 --> 00:41:21,019 Yo estoy en un bloque, lanzo el throw 1095 00:41:21,019 --> 00:41:23,300 Pues salgo, típicamente este es un método 1096 00:41:23,300 --> 00:41:25,940 Este método en determinado momento 1097 00:41:25,940 --> 00:41:27,800 Lanza la throw, pues se sale del método 1098 00:41:27,800 --> 00:41:29,659 Y se vuelve arriba 1099 00:41:29,659 --> 00:41:30,500 A quien ha llamado 1100 00:41:30,500 --> 00:41:33,539 Si el bloque tiene asociado una cláusula 1101 00:41:33,539 --> 00:41:34,639 Catch 1102 00:41:34,639 --> 00:41:37,159 Adecuada para este tipo de excepción 1103 00:41:37,159 --> 00:41:40,179 O sea que hay una catch con la excepción correcta 1104 00:41:40,179 --> 00:41:42,480 Con la excepción que he lanzado 1105 00:41:42,480 --> 00:41:43,960 Pues entonces se entra 1106 00:41:43,960 --> 00:41:46,059 En el cuerpo de ese catch 1107 00:41:46,059 --> 00:41:47,099 Y se ejecuta 1108 00:41:47,099 --> 00:41:50,480 Si no, se sale de ese bloque 1109 00:41:50,480 --> 00:41:51,880 también y se va 1110 00:41:51,880 --> 00:41:53,639 al llamante 1111 00:41:53,639 --> 00:41:55,360 al bloque superior 1112 00:41:55,360 --> 00:41:57,679 y así, así, así, hasta 1113 00:41:57,679 --> 00:41:59,739 dos opciones, o llego 1114 00:41:59,739 --> 00:42:01,300 a una cláusula catch apropiada 1115 00:42:01,300 --> 00:42:03,659 y entonces la ejecuto y luego sigo 1116 00:42:03,659 --> 00:42:05,940 adelante en el programa 1117 00:42:05,940 --> 00:42:07,360 o llego al main 1118 00:42:07,360 --> 00:42:09,659 y una vez llegado al main no puedo 1119 00:42:09,659 --> 00:42:11,679 subir más y entonces el programa se va 1120 00:42:11,679 --> 00:42:15,659 proceso continuo hasta llegar al 1121 00:42:15,659 --> 00:42:17,619 método main de la aplicación, si ahí tampoco 1122 00:42:17,619 --> 00:42:19,920 existe una cláusula catch adecuada 1123 00:42:19,920 --> 00:42:22,480 La máquina virtual finaliza su ejecución 1124 00:42:22,480 --> 00:42:23,780 Con un mensaje de error 1125 00:42:23,780 --> 00:42:29,059 Luego existe otra cosa 1126 00:42:29,059 --> 00:42:30,059 Que no es throw 1127 00:42:30,059 --> 00:42:32,039 Sino que es throws 1128 00:42:32,039 --> 00:42:33,579 ¿Vale? 1129 00:42:33,880 --> 00:42:36,719 Y esto no se usa dentro del código 1130 00:42:36,719 --> 00:42:39,300 Se usa donde se declara 1131 00:42:39,300 --> 00:42:39,900 Un método 1132 00:42:39,900 --> 00:42:43,019 O sea, public void 1133 00:42:43,019 --> 00:42:44,380 Mi método 1134 00:42:44,380 --> 00:42:45,920 Que pilla sus parámetros 1135 00:42:45,920 --> 00:42:47,780 Y después throws 1136 00:42:47,780 --> 00:42:49,039 IOException 1137 00:42:49,039 --> 00:42:50,760 ¿Qué quiere decir? 1138 00:42:50,760 --> 00:42:53,820 Quiere decir que por algún lado de este método 1139 00:42:53,820 --> 00:42:55,380 Por ejemplo aquí está el método F 1140 00:42:55,380 --> 00:42:58,340 Que puede lanzar una excepción de clase E 1141 00:42:58,340 --> 00:42:59,960 Pues sería esto, public void 1142 00:42:59,960 --> 00:43:02,460 El método throws E 1143 00:43:02,460 --> 00:43:05,000 Quiere decir que dentro del cuerpo de F 1144 00:43:05,000 --> 00:43:05,880 Del cuerpo de F 1145 00:43:05,880 --> 00:43:07,380 En algún lado 1146 00:43:07,380 --> 00:43:11,280 Puede ser que salte una excepción E 1147 00:43:11,280 --> 00:43:14,199 Pero yo no la capturo allí 1148 00:43:14,199 --> 00:43:17,860 En automático esto salta por arriba 1149 00:43:17,860 --> 00:43:21,000 Es como avisar a quien usa F 1150 00:43:21,000 --> 00:43:27,000 De, oye, mira, mi método F puede lanzar excepciones de este tipo 1151 00:43:27,000 --> 00:43:31,219 Por lo tanto, si quieres usar F, no lo uses directamente 1152 00:43:31,219 --> 00:43:33,659 Ponlo dentro de un try-catch 1153 00:43:33,659 --> 00:43:37,860 Y haz un catch de esta excepción 1154 00:43:37,860 --> 00:43:39,579 ¿Se me explica? 1155 00:43:40,579 --> 00:43:43,860 Es como avisar a quien va a usar mis métodos 1156 00:43:44,420 --> 00:43:47,260 Que como es posible que explote una determinada cosa 1157 00:43:47,260 --> 00:43:48,900 Pues lo tienes que gestionar 1158 00:43:48,900 --> 00:43:50,400 Tienes que tener en cuenta 1159 00:43:50,400 --> 00:43:51,900 Que cada vez que usas f 1160 00:43:51,900 --> 00:43:54,400 Puede ser que te encuentres una excepción e 1161 00:43:54,400 --> 00:43:55,780 Y por lo tanto 1162 00:43:55,780 --> 00:43:57,119 Ponlo en un try catch 1163 00:43:57,119 --> 00:43:58,960 Con un catch de excepción e 1164 00:43:58,960 --> 00:44:00,619 ¿Si? 1165 00:44:02,280 --> 00:44:04,239 Esto sirve para que potenciales de f 1166 00:44:04,239 --> 00:44:05,519 Sepan a qué atenerse 1167 00:44:05,519 --> 00:44:07,500 A qué puede pasar 1168 00:44:07,500 --> 00:44:10,460 Si un método lanza más de un tipo de excepciones 1169 00:44:10,460 --> 00:44:11,679 Se puede poner throws 1170 00:44:11,679 --> 00:44:13,559 Con las excepciones separadas 1171 00:44:13,559 --> 00:44:15,159 O sea, ioException 1172 00:44:15,159 --> 00:44:16,820 Coma null pointer exception 1173 00:44:16,820 --> 00:44:18,239 Coma no sé qué exception 1174 00:44:18,239 --> 00:44:20,880 ¿Dudas hasta aquí? 1175 00:44:25,289 --> 00:44:26,929 Cuando en un código utilizamos 1176 00:44:26,929 --> 00:44:29,070 Métodos que lanzan potencialmente excepciones 1177 00:44:29,070 --> 00:44:31,329 Es decir, que su procedido tiene throws 1178 00:44:31,329 --> 00:44:34,550 Estamos obligados a hacer una de estas dos cosas 1179 00:44:34,550 --> 00:44:35,090 ¿Vale? 1180 00:44:35,510 --> 00:44:37,130 Entonces, yo soy un método 1181 00:44:37,130 --> 00:44:38,510 Un código 1182 00:44:38,510 --> 00:44:41,449 Que usa un método como este 1183 00:44:41,449 --> 00:44:43,550 ¿Sí? 1184 00:44:44,150 --> 00:44:45,409 Puede hacer dos cosas 1185 00:44:45,409 --> 00:44:48,389 O protejo la llamada de F 1186 00:44:48,389 --> 00:44:50,130 Con un bloque try-catch 1187 00:44:50,130 --> 00:44:51,510 Función 1 1188 00:44:51,510 --> 00:44:54,429 O indico 1189 00:44:54,429 --> 00:44:56,510 En el prototipo de este método 1190 00:44:56,510 --> 00:44:58,210 O sea, el método que usa F 1191 00:44:58,210 --> 00:45:00,409 Que él también 1192 00:45:00,409 --> 00:45:02,030 Lanza esta excepción 1193 00:45:02,030 --> 00:45:05,889 Imaginamos el método 1194 00:45:05,889 --> 00:45:07,269 Otro método 1195 00:45:07,269 --> 00:45:10,449 Que dentro usa este método de aquí 1196 00:45:10,449 --> 00:45:13,929 Pues o cuando llamo F 1197 00:45:13,929 --> 00:45:15,269 Lo pongo en un try-catch 1198 00:45:15,269 --> 00:45:17,489 O en el prototipo del 1199 00:45:17,489 --> 00:45:19,590 Otro método, pongo public void 1200 00:45:19,590 --> 00:45:21,329 Otro método, paréntesis, paréntesis 1201 00:45:21,329 --> 00:45:23,010 Trous y también 1202 00:45:23,010 --> 00:45:25,090 ¿Sí? 1203 00:45:26,090 --> 00:45:27,210 Es en un cierto sentido de 1204 00:45:27,210 --> 00:45:29,750 ¿Quién va a ocuparse 1205 00:45:29,750 --> 00:45:30,510 De esta excepción? 1206 00:45:30,989 --> 00:45:32,469 Y tengo dos opciones, o me ocupo yo 1207 00:45:32,469 --> 00:45:35,010 O lo dejo por arriba 1208 00:45:35,010 --> 00:45:37,309 Será quien me llama a mí que se escupe de eso 1209 00:45:37,309 --> 00:45:38,429 ¿Sí? 1210 00:45:42,510 --> 00:45:44,570 Luego tú como programador 1211 00:45:44,570 --> 00:45:46,070 Tendrás que encontrar 1212 00:45:46,070 --> 00:45:48,710 Donde es el sitio mejor 1213 00:45:48,710 --> 00:45:50,030 Donde se ejecuta esa 1214 00:45:50,030 --> 00:45:52,010 Donde se captura esa ejecución 1215 00:45:52,010 --> 00:45:54,570 Hay situaciones en las que 1216 00:45:54,570 --> 00:45:56,690 En cuanto pase, pues te compensa 1217 00:45:56,690 --> 00:45:57,969 Pillarla allí, pero 1218 00:45:57,969 --> 00:45:59,889 Tú imagínate que 1219 00:45:59,889 --> 00:46:02,670 Imagínate esto 1220 00:46:02,670 --> 00:46:09,539 Que yo tengo un método 1221 00:46:10,099 --> 00:46:11,699 Es el método A 1222 00:46:11,699 --> 00:46:13,199 ¿Vale? 1223 00:46:13,679 --> 00:46:15,099 Que hace cosas 1224 00:46:15,099 --> 00:46:17,059 Luego llama este método F 1225 00:46:17,059 --> 00:46:19,860 Luego hacer otras cosas 1226 00:46:19,860 --> 00:46:22,340 Y entonces 1227 00:46:22,340 --> 00:46:23,960 Y aquí tengo el método f 1228 00:46:23,960 --> 00:46:25,460 Que throws 1229 00:46:25,460 --> 00:46:28,920 La excepción 1230 00:46:28,920 --> 00:46:37,269 Entonces cuando yo uso esto 1231 00:46:37,269 --> 00:46:39,329 Aquí pues tengo dos opciones 1232 00:46:39,329 --> 00:46:41,130 La primera es ponerlo dentro de un track edge 1233 00:46:41,130 --> 00:46:43,010 Si lo pongo dentro de un track edge 1234 00:46:43,010 --> 00:46:45,829 Recuperaré esta excepción 1235 00:46:45,829 --> 00:46:47,610 Y luego puedo seguir 1236 00:46:47,610 --> 00:46:48,849 Trabajando con esto 1237 00:46:48,849 --> 00:46:53,309 O sea, que si tú quieres que en el caso en que f falle 1238 00:46:53,309 --> 00:46:57,170 Mi método a siga igualmente haciendo cosas 1239 00:46:57,170 --> 00:46:59,349 Pues entonces el try catch lo pongo aquí 1240 00:46:59,349 --> 00:47:03,550 Pero imagínate que tú quieres que si a ha llegado a f 1241 00:47:03,550 --> 00:47:06,949 Si f falla, a no siga adelante haciendo cosas 1242 00:47:06,949 --> 00:47:08,809 A también tiene que explotar 1243 00:47:08,809 --> 00:47:10,909 Pues entonces no le pongo un try catch aquí 1244 00:47:10,909 --> 00:47:14,269 Y pongo que este también throws i 1245 00:47:14,269 --> 00:47:20,139 Entonces cuando esto explota 1246 00:47:20,139 --> 00:47:20,880 Llega aquí 1247 00:47:20,880 --> 00:47:22,519 No encuentra un try-catch 1248 00:47:22,519 --> 00:47:26,139 Pero lo tanto sale de aquí también 1249 00:47:26,139 --> 00:47:27,500 E irá a 1250 00:47:27,500 --> 00:47:28,800 El método X 1251 00:47:28,800 --> 00:47:30,599 Que era un método 1252 00:47:30,599 --> 00:47:32,659 Que en un determinado momento llamaba 1253 00:47:32,659 --> 00:47:36,360 Y aquí tengo lo mismo 1254 00:47:36,360 --> 00:47:38,800 O he puesto un try-catch aquí 1255 00:47:38,800 --> 00:47:40,860 O he puesto que un 1256 00:47:40,860 --> 00:47:42,460 ThrowsException 1257 00:47:42,460 --> 00:47:44,420 Y así hasta llegar al main 1258 00:47:44,420 --> 00:47:45,760 Si llega el main 1259 00:47:45,760 --> 00:47:47,139 Y el main no tiene un track edge 1260 00:47:47,139 --> 00:47:55,820 Esto delega la responsabilidad 1261 00:47:55,820 --> 00:47:57,760 Del manejo a otras clases invocantes 1262 00:47:57,760 --> 00:47:59,380 Y de ahí viene el sentido 1263 00:47:59,380 --> 00:48:01,219 De printStackTrace 1264 00:48:01,219 --> 00:48:01,679 ¿Vale? 1265 00:48:05,059 --> 00:48:07,199 Si aquí es donde explota 1266 00:48:07,199 --> 00:48:09,199 Y hago un printStackTrace 1267 00:48:09,199 --> 00:48:13,940 Pues lo que me dirá es 1268 00:48:13,940 --> 00:48:16,199 Mira, yo estaba en la F cuando ha explotado 1269 00:48:16,199 --> 00:48:17,920 Y entonces 1270 00:48:17,920 --> 00:48:18,920 Se lo ha mandado a la E 1271 00:48:18,920 --> 00:48:20,320 Que ha explotado también 1272 00:48:20,320 --> 00:48:22,159 Y entonces la han mandado a X 1273 00:48:22,159 --> 00:48:23,699 Que me dice 1274 00:48:23,699 --> 00:48:26,440 La pila de llamadas que ha habido 1275 00:48:26,440 --> 00:48:27,780 Y por qué ha explotado 1276 00:48:27,780 --> 00:48:28,739 ¿Dónde ha explotado? 1277 00:48:29,420 --> 00:48:29,860 ¿Se entiende? 1278 00:48:31,159 --> 00:48:36,239 Si la excepción lanzada es hija de RuntimeException 1279 00:48:36,239 --> 00:48:38,199 No es necesario manejarla 1280 00:48:38,199 --> 00:48:40,860 Vamos a verlo 1281 00:48:40,860 --> 00:48:42,880 Aquí 1282 00:48:42,880 --> 00:48:43,460 ¿Vale? 1283 00:48:44,460 --> 00:48:45,900 Ahora volvemos sobre este tema 1284 00:48:45,900 --> 00:48:48,420 Todos son throwable 1285 00:48:48,420 --> 00:48:50,380 Se pueden lanzar 1286 00:48:50,380 --> 00:48:51,360 ¿Vale? 1287 00:48:51,360 --> 00:48:55,440 Y dentro de las cosas que se pueden lanzar 1288 00:48:55,440 --> 00:48:56,599 Hay dos cosas 1289 00:48:56,599 --> 00:48:59,420 Errores y excepciones 1290 00:48:59,420 --> 00:49:02,719 Los errors, que son troubles también 1291 00:49:02,719 --> 00:49:04,619 Pues son errores graves 1292 00:49:04,619 --> 00:49:07,840 Son errores que normalmente no dependen de vosotros directamente 1293 00:49:07,840 --> 00:49:10,079 Sino errores de la máquina virtual 1294 00:49:10,079 --> 00:49:10,739 ¿Vale? 1295 00:49:11,280 --> 00:49:13,760 Y que no deberían ser manejados 1296 00:49:13,760 --> 00:49:17,079 Ha habido un fallo tan grave que el programa tiene que acabar 1297 00:49:17,079 --> 00:49:17,679 ¿Vale? 1298 00:49:17,900 --> 00:49:19,980 Como por ejemplo, virtual machine error 1299 00:49:19,980 --> 00:49:21,920 Hay un error de la máquina virtual 1300 00:49:21,920 --> 00:49:23,460 Pues no puedes hacer nada 1301 00:49:23,460 --> 00:49:25,500 El error no es tuyo, es de la máquina virtual 1302 00:49:25,500 --> 00:49:27,079 Search on error 1303 00:49:27,079 --> 00:49:28,420 Ni siquiera que se que es 1304 00:49:28,420 --> 00:49:30,760 Pero pensad 1305 00:49:30,760 --> 00:49:33,320 Si vosotros creáis 1306 00:49:33,320 --> 00:49:35,059 Demasiadas llamadas de método 1307 00:49:35,059 --> 00:49:37,539 Ponéis un while true 1308 00:49:37,539 --> 00:49:38,840 Llamar un método 1309 00:49:38,840 --> 00:49:39,940 Y que dentro de este método 1310 00:49:39,940 --> 00:49:41,000 Llama este método 1311 00:49:41,000 --> 00:49:44,800 Entonces la pila de llamadas de método 1312 00:49:44,800 --> 00:49:46,360 Crece, crece, crece 1313 00:49:46,360 --> 00:49:48,739 Hasta llegar a un momento 1314 00:49:48,739 --> 00:49:50,380 En que la virtual job machine 1315 00:49:50,380 --> 00:49:51,940 Ha ocupado toda la RAM 1316 00:49:51,940 --> 00:49:53,760 Y no puede hacer otra llamada 1317 00:49:53,760 --> 00:49:56,360 La RAM que tiene a disposición 1318 00:49:56,360 --> 00:49:58,679 Pues esto es un error de este tipo 1319 00:49:58,679 --> 00:49:59,780 Ya no puedo hacer nada 1320 00:49:59,780 --> 00:50:00,739 Exploto 1321 00:50:00,739 --> 00:50:03,440 Esto es de aquí 1322 00:50:03,440 --> 00:50:06,179 Si pasan, es grave 1323 00:50:06,179 --> 00:50:07,420 Hay que entender que es 1324 00:50:07,420 --> 00:50:09,579 Pero no se hace un try catch 1325 00:50:09,579 --> 00:50:10,659 Esto es un error 1326 00:50:10,659 --> 00:50:14,260 Sin embargo las excepciones 1327 00:50:14,260 --> 00:50:15,840 Son errores a tiempo de ejecución 1328 00:50:15,840 --> 00:50:18,599 Que si pueden ser manejados 1329 00:50:18,599 --> 00:50:20,780 manejados son manejables 1330 00:50:20,780 --> 00:50:22,019 y recuperables 1331 00:50:22,019 --> 00:50:24,960 puede ser que este error de aquí se me pasa 1332 00:50:24,960 --> 00:50:26,599 quiera acabar mi programa 1333 00:50:26,599 --> 00:50:28,800 pero puede ser que este error de aquí se me pasa 1334 00:50:28,800 --> 00:50:30,179 esta excepción de aquí se me pasa 1335 00:50:30,179 --> 00:50:33,000 pues me recupere de la excepción y siga adelante 1336 00:50:33,000 --> 00:50:34,699 ¿vale? he insertado 1337 00:50:34,699 --> 00:50:36,739 un alumno que ya existía, pues me salta 1338 00:50:36,739 --> 00:50:38,820 alumno existente exception 1339 00:50:38,820 --> 00:50:40,920 pero yo de allí me recupero y vuelvo 1340 00:50:40,920 --> 00:50:41,739 al menú principal 1341 00:50:41,739 --> 00:50:44,860 diciendo un mensaje de error de, oye, este alumno 1342 00:50:44,860 --> 00:50:46,320 no lo puedo insertar porque ya existe 1343 00:50:46,320 --> 00:50:48,400 y vuelvo al menú principal, no acabo 1344 00:50:48,400 --> 00:50:49,260 Mi programa 1345 00:50:49,260 --> 00:50:52,340 Dentro de Exception 1346 00:50:52,340 --> 00:50:54,360 Hay dos tipos de Exception 1347 00:50:54,360 --> 00:50:56,739 Hay la Runtime Exception 1348 00:50:56,739 --> 00:50:58,179 Y las otras 1349 00:50:58,179 --> 00:50:59,679 ¿Vale? 1350 00:50:59,980 --> 00:51:03,139 Las Runtime Exception son errores 1351 00:51:03,139 --> 00:51:05,880 Que pero son bastante habituales 1352 00:51:05,880 --> 00:51:07,679 Suelen pasar mucho 1353 00:51:07,679 --> 00:51:09,019 Como por ejemplo 1354 00:51:09,019 --> 00:51:10,400 El Null Pointer Exception 1355 00:51:10,400 --> 00:51:13,380 O como por ejemplo el Index Outbound Exception 1356 00:51:13,380 --> 00:51:13,940 ¿Vale? 1357 00:51:14,219 --> 00:51:15,920 Estos errores de aquí 1358 00:51:15,920 --> 00:51:19,039 No se vigilan 1359 00:51:19,039 --> 00:51:20,579 O mejor 1360 00:51:20,579 --> 00:51:22,219 No se vigilan siempre 1361 00:51:22,219 --> 00:51:24,960 ¿Cuántas veces vosotros habéis hecho 1362 00:51:24,960 --> 00:51:27,860 Objeto.nombre 1363 00:51:27,860 --> 00:51:29,780 Objeto.metodo 1364 00:51:29,780 --> 00:51:31,380 Y lo habéis puesto 1365 00:51:31,380 --> 00:51:33,460 En un bloque try-catch 1366 00:51:33,460 --> 00:51:35,679 Ninguno 1367 00:51:35,679 --> 00:51:36,840 Porque no lo conocí 1368 00:51:36,840 --> 00:51:38,880 Sin embargo ha funcionado 1369 00:51:38,880 --> 00:51:40,539 Pero al llamar un método 1370 00:51:40,539 --> 00:51:42,860 Podría haber lanzado una null pointer exception 1371 00:51:42,860 --> 00:51:44,440 De hecho a veces la ha lanzado 1372 00:51:44,440 --> 00:51:46,659 Cuando vosotros hacéis el next int 1373 00:51:46,659 --> 00:51:49,639 El next int puede lanzar un number format exception 1374 00:51:49,639 --> 00:51:51,460 ¿Lo habéis puesto en un track edge? 1375 00:51:52,340 --> 00:51:52,739 No 1376 00:51:52,739 --> 00:51:55,139 ¿Por qué esto? 1377 00:51:55,780 --> 00:51:58,340 Porque el coste computacional 1378 00:51:58,340 --> 00:52:00,139 De controlar absolutamente 1379 00:52:00,139 --> 00:52:01,199 Todas estas cosas 1380 00:52:01,199 --> 00:52:03,800 Es demasiado elevado para hacerlo 1381 00:52:03,800 --> 00:52:05,860 Pensad todas las veces que habéis usado 1382 00:52:05,860 --> 00:52:06,940 Un array 1383 00:52:06,940 --> 00:52:09,039 Todas las veces que habéis usado un array 1384 00:52:09,039 --> 00:52:12,760 Os habéis puesto la posibilidad de un index out of bound exception 1385 00:52:12,760 --> 00:52:15,420 Pues habrías tenido que poner un try que he hecho 1386 00:52:15,420 --> 00:52:16,699 Diciendo que si es una interrupción 1387 00:52:16,699 --> 00:52:17,500 Haz algo 1388 00:52:17,500 --> 00:52:20,280 Pues llega un momento en que este tipo de excepciones 1389 00:52:20,280 --> 00:52:23,179 Se dice, mira, oye, se asume que pueden pasar 1390 00:52:23,179 --> 00:52:25,539 Las puedes controlar si quieres 1391 00:52:25,539 --> 00:52:27,260 Pero no es obligatorio 1392 00:52:27,260 --> 00:52:30,639 Para que el coste computacional 1393 00:52:30,639 --> 00:52:31,980 El sobrecoste computacional 1394 00:52:31,980 --> 00:52:33,300 De tener cuidado de estas cosas 1395 00:52:33,300 --> 00:52:35,300 Pues en un cierto sentido 1396 00:52:35,300 --> 00:52:37,559 Se quita a la máquina virtual 1397 00:52:37,559 --> 00:52:39,519 Y se da al programador 1398 00:52:39,519 --> 00:52:42,159 Sois vosotros que tenéis que tener cuidado 1399 00:52:42,159 --> 00:52:44,179 Con no salir de la red 1400 00:52:44,179 --> 00:52:45,139 No la mat 1401 00:52:45,139 --> 00:52:49,860 Y estos son como 1402 00:52:49,860 --> 00:52:51,179 Arithmetic exception 1403 00:52:51,179 --> 00:52:52,519 Index at all 1404 00:52:52,519 --> 00:52:54,840 Null pointer exception 1405 00:52:54,840 --> 00:52:55,860 Todas estas son 1406 00:52:55,860 --> 00:52:58,800 Las otras 1407 00:52:58,800 --> 00:53:01,820 Cualquier otra que no derive de esta de aquí 1408 00:53:01,820 --> 00:53:03,000 Que no herede de esta de aquí 1409 00:53:03,000 --> 00:53:05,440 Pues tenéis que 1410 00:53:05,440 --> 00:53:06,920 Manejarla 1411 00:53:06,920 --> 00:53:09,000 Estas se pueden 1412 00:53:09,000 --> 00:53:10,300 No manejar 1413 00:53:10,300 --> 00:53:11,760 Esta de aquí si 1414 00:53:11,760 --> 00:53:14,460 Y tenéis dos métodos para manejarla 1415 00:53:14,460 --> 00:53:15,840 La primera es 1416 00:53:15,840 --> 00:53:19,079 Try catch 1417 00:53:19,079 --> 00:53:20,599 Y el segundo es 1418 00:53:20,599 --> 00:53:22,320 Throw 1419 00:53:22,320 --> 00:53:26,199 O sea, o la manejáis vosotros 1420 00:53:26,199 --> 00:53:28,539 O avisáis a quien os usa 1421 00:53:28,539 --> 00:53:30,280 Que es posible que explote 1422 00:53:30,280 --> 00:53:32,159 ¿Sí? 1423 00:53:34,980 --> 00:53:40,650 No 1424 00:53:40,650 --> 00:53:42,610 No 1425 00:53:42,610 --> 00:53:45,530 Pero sería demasiado costoso 1426 00:53:45,530 --> 00:53:46,809 A nivel computacional 1427 00:53:46,809 --> 00:53:48,329 Comprobar absolutamente 1428 00:53:48,329 --> 00:53:50,610 Que todas las veces que usas un objeto 1429 00:53:50,610 --> 00:53:52,150 Pues que este objeto no se anude 1430 00:53:52,150 --> 00:53:56,679 ¿Veis? 1431 00:53:56,980 --> 00:53:58,139 No es obligatorio 1432 00:53:58,139 --> 00:54:00,440 Es que se te obliga a no hacerlo 1433 00:54:00,440 --> 00:54:03,420 Y de hecho, en determinados casos 1434 00:54:03,420 --> 00:54:04,219 Tú lo puedes poner 1435 00:54:04,219 --> 00:54:06,420 Un uso de un objeto dentro de un try catch 1436 00:54:06,420 --> 00:54:09,300 Y hacer un catch de null pointer exception 1437 00:54:09,300 --> 00:54:09,920 ¿Veis? 1438 00:54:11,099 --> 00:54:12,820 Pero normalmente 1439 00:54:12,820 --> 00:54:14,320 Si tú no lo haces 1440 00:54:14,320 --> 00:54:15,800 Él no te va a decir nada 1441 00:54:15,800 --> 00:54:18,000 Entonces cuando lo haces 1442 00:54:18,000 --> 00:54:20,139 Si tú estás usando un objeto 1443 00:54:20,139 --> 00:54:22,079 Que viene de ti 1444 00:54:22,079 --> 00:54:24,199 Porque es un método interno privado 1445 00:54:24,199 --> 00:54:25,079 Que usas tú 1446 00:54:25,079 --> 00:54:26,940 Y sabes que cada vez que lo haces 1447 00:54:26,940 --> 00:54:29,039 Le pasas un objeto que no es null 1448 00:54:29,039 --> 00:54:30,300 Pues lo obvias 1449 00:54:30,300 --> 00:54:32,940 Si en vez es un método público 1450 00:54:32,940 --> 00:54:34,739 Que otros pueden utilizar 1451 00:54:34,739 --> 00:54:36,159 Y pueden ser malvados 1452 00:54:36,159 --> 00:54:39,539 Y pasarte como objeto un null 1453 00:54:39,539 --> 00:54:41,780 Pues entonces dentro deberías 1454 00:54:41,780 --> 00:54:43,059 Comprobar 1455 00:54:43,059 --> 00:54:44,679 O con un if 1456 00:54:44,679 --> 00:54:46,880 Si quieres hacer programación 1457 00:54:46,880 --> 00:54:48,719 Pesimista 1458 00:54:48,719 --> 00:54:50,760 O poniendo su uso 1459 00:54:50,760 --> 00:54:51,699 Dentro de un try-catch 1460 00:54:51,699 --> 00:54:54,380 Y hacer un catch de exception o de lo que sea 1461 00:54:54,380 --> 00:54:55,940 Que si explota por alguna razón 1462 00:54:55,940 --> 00:54:57,019 Pues te avise por qué 1463 00:54:57,019 --> 00:54:59,500 ¿Si? 1464 00:55:00,719 --> 00:55:02,360 Y esto es esquemita 1465 00:55:02,360 --> 00:55:02,960 ¿Vale? 1466 00:55:03,219 --> 00:55:04,840 Todos son throwables 1467 00:55:04,840 --> 00:55:07,659 Hay los errores 1468 00:55:07,659 --> 00:55:09,920 Que son como virtual machine error 1469 00:55:09,920 --> 00:55:12,179 No class definition found error 1470 00:55:12,179 --> 00:55:13,619 Assertion error 1471 00:55:13,619 --> 00:55:15,059 Stack over flow error 1472 00:55:15,059 --> 00:55:17,099 Stack over flow error es lo que decía antes 1473 00:55:17,099 --> 00:55:20,699 Del que viene el sitio web Stack Overflow 1474 00:55:20,699 --> 00:55:24,019 Y luego están las excepciones 1475 00:55:24,019 --> 00:55:26,380 Dentro de las excepciones hay varias excepciones 1476 00:55:26,380 --> 00:55:27,539 Todas estas 1477 00:55:27,539 --> 00:55:29,659 Como la Class Not Found Exception 1478 00:55:29,659 --> 00:55:31,260 O la IO Exception 1479 00:55:31,260 --> 00:55:33,639 Que puede ser Interrupted Exception 1480 00:55:33,639 --> 00:55:35,260 End of File Exception 1481 00:55:35,260 --> 00:55:37,059 Connection Not Found Exception 1482 00:55:37,059 --> 00:55:39,739 Todas las excepciones de entrada y salida 1483 00:55:39,739 --> 00:55:42,239 Y luego están las Runtime Exception 1484 00:55:42,239 --> 00:55:43,579 Estas 1485 00:55:43,579 --> 00:55:46,539 Son las que podéis no comprobar 1486 00:55:46,539 --> 00:55:49,719 Estas hay que comprobarla siempre 1487 00:55:49,719 --> 00:55:50,800 Si yo tengo un método 1488 00:55:50,800 --> 00:55:53,059 Que throws IOException 1489 00:55:53,059 --> 00:55:56,159 Pues la tengo que poner en un trajecho 1490 00:55:56,159 --> 00:55:57,719 Si yo tengo métodos 1491 00:55:57,719 --> 00:55:59,159 Que lanzan estas cosas de aquí 1492 00:55:59,159 --> 00:56:00,360 Puedo evitarlo 1493 00:56:00,360 --> 00:56:02,559 Como es el caso del NextInt 1494 00:56:02,559 --> 00:56:04,659 O del 1495 00:56:04,659 --> 00:56:06,860 Otros que hemos hecho 1496 00:56:06,860 --> 00:56:08,599 Y aquí están cosas 1497 00:56:08,599 --> 00:56:11,320 Como IndexAutoBoundException 1498 00:56:11,320 --> 00:56:13,760 IllegalArgumentException 1499 00:56:13,760 --> 00:56:14,960 Del que deriva 1500 00:56:14,960 --> 00:56:16,860 NumberFormatException 1501 00:56:16,860 --> 00:56:19,519 ClassCastException 1502 00:56:19,519 --> 00:56:20,579 Alguna vez lo hemos visto 1503 00:56:20,579 --> 00:56:23,340 Cuando te equivocas a hacer un casting 1504 00:56:23,340 --> 00:56:24,059 De clases 1505 00:56:24,059 --> 00:56:26,179 ArithmeticException 1506 00:56:26,179 --> 00:56:27,920 Como la división por cero 1507 00:56:27,920 --> 00:56:29,800 NullPointerException 1508 00:56:29,800 --> 00:56:32,039 NoSuchElementException 1509 00:56:32,039 --> 00:56:34,019 NegativeArraySizeException 1510 00:56:34,019 --> 00:56:35,099 ¿Qué cosa parece? 1511 00:56:38,849 --> 00:56:39,769 NotaNumber 1512 00:56:39,769 --> 00:56:42,329 NotaNumber yo creo que es NormalFormatException 1513 00:56:42,329 --> 00:56:43,909 O sea, un ArithmeticException 1514 00:56:43,909 --> 00:56:48,539 No sé, no pondré 1515 00:56:48,539 --> 00:56:49,199 ¿Vale? 1516 00:56:50,460 --> 00:57:03,699 Y, últimas dos transparencias y acabamos, excepciones personalizadas, es decir, que dentro de mi programa complejo yo puedo crear mis propias excepciones, ¿cómo las creo? 1517 00:57:03,699 --> 00:57:05,159 Pues me creo una clase 1518 00:57:05,159 --> 00:57:07,219 Digo que soy hijo 1519 00:57:07,219 --> 00:57:09,360 De otra clase, por ejemplo 1520 00:57:09,360 --> 00:57:11,500 Puedo ser hijo de Exception 1521 00:57:11,500 --> 00:57:14,219 O puedo ser hijo de Runtime Exception 1522 00:57:14,219 --> 00:57:16,139 O puedo ser hijo de 1523 00:57:16,139 --> 00:57:17,699 Troubles, mejor que no 1524 00:57:17,699 --> 00:57:19,159 ¿Vale? Normalmente 1525 00:57:19,159 --> 00:57:20,179 Tiramos de aquí 1526 00:57:20,179 --> 00:57:23,619 ¿Vale? O sea, Extends Exception 1527 00:57:23,619 --> 00:57:25,739 Y creo Public Class 1528 00:57:25,739 --> 00:57:27,360 Mi excepción, Extend Exception 1529 00:57:27,360 --> 00:57:29,099 Y ahora allí dentro puedo 1530 00:57:29,099 --> 00:57:31,420 Sobrescribir todos los métodos que yo quiero 1531 00:57:31,420 --> 00:57:33,440 Utilizando lo básico 1532 00:57:33,440 --> 00:57:35,699 De Exception, entonces aquí tendré el GetMessage 1533 00:57:35,699 --> 00:57:37,579 Tendré el 1534 00:57:37,579 --> 00:57:39,340 PrintStack, etc, etc 1535 00:57:39,340 --> 00:57:40,420 Y lo puedo 1536 00:57:40,420 --> 00:57:43,659 O llamar directamente el de mi padre 1537 00:57:43,659 --> 00:57:45,760 O reescribir 1538 00:57:45,760 --> 00:57:47,260 Para que haga lo que yo quiero hacer 1539 00:57:47,260 --> 00:57:49,119 De esta forma puedo hacer 1540 00:57:49,119 --> 00:57:51,739 Excepciones más orientadas 1541 00:57:51,739 --> 00:57:53,780 Más personalizadas a lo que quiero hacer 1542 00:57:53,780 --> 00:57:55,019 Por ejemplo 1543 00:57:55,019 --> 00:57:57,699 Tengo la 1544 00:57:57,699 --> 00:57:59,659 Public DivideByZeroException 1545 00:58:00,460 --> 00:58:01,320 ¿Vale? 1546 00:58:01,320 --> 00:58:03,840 Que extend arithmetic exception 1547 00:58:03,840 --> 00:58:06,719 Este es el constructor 1548 00:58:06,719 --> 00:58:07,599 ¿Vale? 1549 00:58:07,719 --> 00:58:09,880 Que usa el constructor de mi padre 1550 00:58:09,880 --> 00:58:11,280 Sin ningún problema 1551 00:58:11,280 --> 00:58:13,059 Y luego tengo un programa 1552 00:58:13,059 --> 00:58:15,059 Que es un método que es dividir 1553 00:58:15,059 --> 00:58:15,539 ¿Vale? 1554 00:58:15,679 --> 00:58:17,619 Que lanza divide by exception 1555 00:58:17,619 --> 00:58:19,380 Entonces, quien usa 1556 00:58:19,380 --> 00:58:21,500 Dividir de estos dos números 1557 00:58:21,500 --> 00:58:23,920 Sabe que se expone a la posibilidad 1558 00:58:23,920 --> 00:58:24,840 De lanzar esto 1559 00:58:24,840 --> 00:58:27,840 Lo tiene que manejar 1560 00:58:27,840 --> 00:58:44,360 Es una runtime exception 1561 00:58:44,360 --> 00:58:46,239 Por lo tanto, no está obligado 1562 00:58:46,239 --> 00:58:47,920 ¿Vale? 1563 00:58:48,119 --> 00:58:50,739 Pero tú sabes que cuando vas a usar dividir 1564 00:58:50,739 --> 00:58:52,920 Puede ser que lance una 1565 00:58:52,920 --> 00:58:54,039 Divide by 0 exception 1566 00:58:54,039 --> 00:58:56,900 Luego, haz tú lo que quieras con eso 1567 00:58:56,900 --> 00:58:57,119 ¿Sí? 1568 00:58:57,340 --> 00:59:01,059 Si esto, en vez de extender a aritmética exception 1569 00:59:01,059 --> 00:59:03,360 Extender a exception directamente 1570 00:59:03,360 --> 00:59:04,800 Pues serías obligado 1571 00:59:04,800 --> 00:59:05,719 ¿Sí? 1572 00:59:06,719 --> 00:59:09,260 Si el denominador 1573 00:59:09,260 --> 00:59:10,920 Es igual a 0 1574 00:59:10,920 --> 00:59:13,340 Lanza una nueva 1575 00:59:13,340 --> 00:59:15,119 Divided by zero exception 1576 00:59:15,119 --> 00:59:15,840 Diciendo error 1577 00:59:15,840 --> 00:59:17,780 O error has dividido por cero 1578 00:59:17,780 --> 00:59:24,289 Y si no devuelve esta cosa aquí 1579 00:59:24,289 --> 00:59:26,150 Ya está 1580 00:59:26,150 --> 00:59:28,780 Entonces 1581 00:59:28,780 --> 00:59:30,420 Quien usa dividir 1582 00:59:30,420 --> 00:59:31,820 Debería poner un try 1583 00:59:31,820 --> 00:59:35,239 Dividir tres coma cero 1584 00:59:35,239 --> 00:59:36,260 Catch 1585 00:59:36,260 --> 00:59:38,559 Divided by zero exception 1586 00:59:38,559 --> 00:59:39,480 Si 1587 00:59:39,480 --> 00:59:47,530 Esto es esta cosa aquí 1588 00:59:47,530 --> 00:59:51,570 Porque 1589 00:59:51,570 --> 00:59:53,670 porque esto es un ejemplo 1590 00:59:53,670 --> 00:59:55,469 de estoy lanzando mi propia 1591 00:59:55,469 --> 00:59:57,369 excepción, pero 1592 00:59:57,369 --> 00:59:59,230 tú tienes exception, tú podrías hacer 1593 00:59:59,230 --> 01:00:01,550 exception, pero entonces no estás usando esta, estás usando 1594 01:00:01,550 --> 01:00:02,670 excepción 1595 01:00:02,670 --> 01:00:11,519 la clase igualmente se llama alumno, pero quiero que 1596 01:00:11,519 --> 01:00:12,480 el mensaje se llame 1597 01:00:12,480 --> 01:00:17,059 esto no es tanto el mensaje, el mensaje lo pones aquí 1598 01:00:17,059 --> 01:00:19,539 esto es el tipo de error que lanzas 1599 01:00:19,539 --> 01:00:20,699 ¿vale? entonces 1600 01:00:20,699 --> 01:00:23,000 la cuestión es, si tú haces un 1601 01:00:23,000 --> 01:00:25,079 programa de tres líneas 1602 01:00:25,079 --> 01:00:27,059 donde tiene que explotar porque 1603 01:00:27,059 --> 01:00:30,199 Usas exception y se acabó 1604 01:00:30,199 --> 01:00:31,800 Si tú haces un programa serio 1605 01:00:31,800 --> 01:00:32,900 Un sistema muy grande 1606 01:00:32,900 --> 01:00:35,420 Donde pueden haber varios errores de tipo distinto 1607 01:00:35,420 --> 01:00:37,059 Si siempre lanzas exception 1608 01:00:37,059 --> 01:00:40,500 Pues sí, de aquí se puede saber el error 1609 01:00:40,500 --> 01:00:42,239 Pero no sabes el tipo de error 1610 01:00:42,239 --> 01:00:43,719 Esto es para jerarquizar 1611 01:00:43,719 --> 01:00:44,820 Y organizar los errores 1612 01:00:44,820 --> 01:00:46,920 Si lo piensas, esto también 1613 01:00:46,920 --> 01:00:49,119 Podría ser todos errores 1614 01:00:49,119 --> 01:00:51,159 Pues lanzamos errores y cualquier cosa pasa 1615 01:00:51,159 --> 01:00:52,780 Pero lo que están haciendo es 1616 01:00:52,780 --> 01:00:54,559 Te lo están dividiendo por categoría 1617 01:00:54,559 --> 01:00:57,900 Para que tú sepas, además del mensaje de error 1618 01:00:57,900 --> 01:01:00,179 En qué tipo de error has hecho 1619 01:01:00,179 --> 01:01:02,719 Estamos haciendo una tipificación de errores 1620 01:01:02,719 --> 01:01:04,559 Entonces dentro de tu escuela 1621 01:01:04,559 --> 01:01:08,760 Tendrás el alumno repetido exception 1622 01:01:08,760 --> 01:01:13,320 Tendrás el no puedo añadir alumno exception 1623 01:01:13,320 --> 01:01:15,599 El no puedo borrar alumno exception 1624 01:01:15,599 --> 01:01:19,239 Y te creas varios tipos que se lanzarán donde se tienen que lanzar 1625 01:01:19,239 --> 01:01:24,099 Es posible que varios métodos lancen el mismo tipo de errores 1626 01:01:24,099 --> 01:01:39,420 Esto es un nombre inventado 1627 01:01:39,420 --> 01:01:40,840 Podría haberlo llamado 1628 01:01:40,840 --> 01:01:42,760 Exploitation Exception 1629 01:01:42,760 --> 01:01:45,760 ¡Tudas!