1 00:00:00,690 --> 00:00:20,609 He elegido Runtan Estetio sin dar ninguna explicación, simplemente la explicación de que es una clase de la jerarquía y que mis clases excepción tienen que insertarse en la jerarquía y si la hago heredera de esta, pues ya hereda a través de ella todo lo de excepción y por tanto puede ser lanzable con el throw, etcétera, sin más. 2 00:00:20,609 --> 00:00:39,289 Vale, pero dentro de esas superclases de la jerarquía está la excepción sin más. Vale, pues, ¿cuál es la diferencia entre si yo lo hubiera hecho de la excepción? Por ejemplo, para no seguir modificando sobre lo mismo una y otra vez, vamos a hacernos otro método en el cual quiera yo indicar otro tipo de excepción. 3 00:00:39,289 --> 00:01:04,989 Por ejemplo, a ver qué se nos ocurre, un método para, yo qué sé, sacar un certificado de notas dado un objeto alumno, vale, por ejemplo, bueno, es que justo ese es el ejemplo que vais a hacer vosotros, entonces vamos a cambiar otra clase. 4 00:01:04,989 --> 00:01:13,439 vale, pues imaginaos 5 00:01:13,439 --> 00:01:16,120 que tenemos una clase factura 6 00:01:16,120 --> 00:01:19,439 por aquí, vamos a hacer 7 00:01:19,439 --> 00:01:24,430 rápidamente una clase 8 00:01:24,430 --> 00:01:30,159 factura, vale 9 00:01:30,159 --> 00:01:32,239 la clase factura, pues bueno 10 00:01:32,239 --> 00:01:33,200 que tenga un número 11 00:01:33,200 --> 00:01:38,959 y que tenga una fecha 12 00:01:38,959 --> 00:01:49,439 fecha, pues venga, para no complicarnos 13 00:01:49,439 --> 00:01:50,780 la vida, la vamos a hacer 14 00:01:50,780 --> 00:01:52,140 de java útil 15 00:01:52,140 --> 00:01:55,640 java time, recordáis que es otro paquete 16 00:01:55,640 --> 00:01:57,439 que tiene clases para trabajar con fechas 17 00:01:57,439 --> 00:01:58,859 más moderno 18 00:01:58,859 --> 00:02:01,359 Java útil es un poco el de toda la vida 19 00:02:01,359 --> 00:02:04,459 Java útil tiene utilidades varias 20 00:02:04,459 --> 00:02:05,640 Para muchas cosas 21 00:02:05,640 --> 00:02:07,019 Entre ellas para fechas 22 00:02:07,019 --> 00:02:08,099 Que es un poco el de toda la vida 23 00:02:08,099 --> 00:02:09,680 Y Java time es más específico 24 00:02:09,680 --> 00:02:10,900 Para fechas, horas, etc 25 00:02:10,900 --> 00:02:13,500 Venga, pues nada 26 00:02:13,500 --> 00:02:17,300 Hacemos un constructor 27 00:02:17,300 --> 00:02:30,219 Vale, y ya está 28 00:02:30,219 --> 00:02:31,039 Y los get y set 29 00:02:31,039 --> 00:02:41,180 Ala, pues venga 30 00:02:41,180 --> 00:02:42,620 Tenemos aquí una aplicación 31 00:02:42,620 --> 00:02:43,960 Para hacer cosas con facturas 32 00:02:43,960 --> 00:02:46,280 esta es nuestra clase factura 33 00:02:46,280 --> 00:02:49,139 que se caracteriza solo por el número y la fecha 34 00:02:49,139 --> 00:02:51,039 ya está, lo que sea que 35 00:02:51,039 --> 00:02:52,879 hace esta aplicación solo le importa 36 00:02:52,879 --> 00:02:54,219 el número y la fecha, no le importa 37 00:02:54,219 --> 00:02:57,080 ni los ítems que hay en la factura, ni el nombre 38 00:02:57,080 --> 00:02:58,939 nada, por lo que sea esta aplicación 39 00:02:58,939 --> 00:03:00,780 solo necesita saber el número y la fecha 40 00:03:00,780 --> 00:03:02,280 para hacer cosas, ya está 41 00:03:02,280 --> 00:03:04,759 pues solo le hace falta saber el número y la fecha 42 00:03:04,759 --> 00:03:06,259 para que meter más propiedades 43 00:03:06,259 --> 00:03:08,879 las propiedades que hay que meter son las que le interesan 44 00:03:08,879 --> 00:03:09,580 a la aplicación 45 00:03:09,580 --> 00:03:12,319 aunque luego una factura tenga muchas más 46 00:03:12,319 --> 00:03:13,840 si a la aplicación le interesan solo esas dos 47 00:03:13,840 --> 00:03:15,479 Pues no se meten esas dos 48 00:03:15,479 --> 00:03:17,979 Venga, pues nuestra aplicación 49 00:03:17,979 --> 00:03:20,099 Ahora pues ya está en un main 50 00:03:20,099 --> 00:03:24,919 Pues vamos a hacernos otro main2 51 00:03:24,919 --> 00:03:32,919 Con su método main 52 00:03:32,919 --> 00:03:35,060 Vale, pues esta aplicación 53 00:03:35,060 --> 00:03:36,460 Tiene una serie de requisitos 54 00:03:36,460 --> 00:03:37,780 Para hacer con las facturas 55 00:03:37,780 --> 00:03:40,780 Y uno de ellos 56 00:03:40,780 --> 00:03:42,659 Que sea, pues yo que sé, por ejemplo 57 00:03:42,659 --> 00:03:45,280 Mostrar 58 00:03:45,280 --> 00:03:50,270 Mostrar datos factura 59 00:03:50,270 --> 00:03:51,789 Al que se le pasa 60 00:03:51,789 --> 00:03:53,750 Un objeto factura como parámetro 61 00:03:53,750 --> 00:04:34,449 Entonces, pues le hacemos aquí un método y se le pasa un objeto factura, factura f, ¿vale? Ahí ves static void. Vale, y el objetivo de este método es simplemente mostrar los datos de la factura, ¿vale? 62 00:04:34,449 --> 00:04:37,649 pero resulta que 63 00:04:37,649 --> 00:04:39,790 puede ocurrir que la fecha 64 00:04:39,790 --> 00:04:41,990 esté mal, entonces si la fecha 65 00:04:41,990 --> 00:04:43,649 está mal, en ese caso 66 00:04:43,649 --> 00:04:45,649 no queremos mostrar los datos de la factura 67 00:04:45,649 --> 00:04:47,850 vale, pero queremos 68 00:04:47,850 --> 00:04:49,689 avisar de que la fecha está mal con 69 00:04:49,689 --> 00:04:51,649 una excepción, lanzando con una excepción 70 00:04:51,649 --> 00:04:53,750 no con un mensajito la fecha 71 00:04:53,750 --> 00:04:55,329 está mal, porque a lo mejor 72 00:04:55,329 --> 00:04:57,250 esto que yo he llamado system out 73 00:04:57,250 --> 00:04:59,730 va directamente, silencio 74 00:04:59,730 --> 00:05:01,829 va directamente a la impresora 75 00:05:01,829 --> 00:05:03,569 entonces yo podría 76 00:05:03,569 --> 00:05:05,569 que avisar si la fecha está mal, 77 00:05:05,649 --> 00:05:07,509 ahora veremos qué significa estar mal, podría poner 78 00:05:07,509 --> 00:05:09,089 un System.out.println, la fecha está mal. 79 00:05:09,509 --> 00:05:11,189 Y si no, muestro los datos. 80 00:05:11,990 --> 00:05:13,990 Pero imaginaos que este System.out.println 81 00:05:13,990 --> 00:05:15,649 en realidad es 82 00:05:15,649 --> 00:05:16,930 mandar a la impresora. 83 00:05:17,649 --> 00:05:19,529 Que yo no lo he puesto porque no sabemos mandar a la impresora. 84 00:05:19,990 --> 00:05:21,370 Entonces, si es mandar a la impresora, 85 00:05:21,910 --> 00:05:23,569 yo no quiero mandar a la impresora 86 00:05:23,569 --> 00:05:25,529 la factura está mal, o sea, la fecha 87 00:05:25,529 --> 00:05:26,730 está mal, vaya gasto de papel. 88 00:05:27,610 --> 00:05:29,750 Entonces, sería estúpido hacer un método en el cual 89 00:05:29,750 --> 00:05:31,750 yo, si la fecha 90 00:05:31,750 --> 00:05:33,730 está mal, mande a la impresora 91 00:05:33,730 --> 00:05:35,649 la factura está mal y si la fecha 92 00:05:35,649 --> 00:05:37,610 está bien, mande a la impresora la factura. Sería 93 00:05:37,610 --> 00:05:39,629 estúpido. Es mucho mejor un método 94 00:05:39,629 --> 00:05:41,490 en el cual si la fecha está mal 95 00:05:41,490 --> 00:05:43,350 el método avisa 96 00:05:43,350 --> 00:05:45,629 y ya el programa principal que haga lo que 97 00:05:45,629 --> 00:05:47,149 quiera, pero el método avisa 98 00:05:47,149 --> 00:05:49,449 y si la factura está bien 99 00:05:49,449 --> 00:05:51,589 la manda a la impresora. Bueno, pues 100 00:05:51,589 --> 00:05:53,509 si yo eso es lo que quiero hacer porque es lo que tiene 101 00:05:53,509 --> 00:05:55,550 sentido, pues entonces 102 00:05:55,550 --> 00:05:57,769 tendré que avisar con un throw, con una excepción. 103 00:05:58,209 --> 00:05:59,449 Tendré que hacer que este método lance 104 00:05:59,449 --> 00:06:01,529 una excepción. Entonces 105 00:06:01,529 --> 00:06:04,050 tendré que hacerme una excepción 106 00:06:04,050 --> 00:06:06,990 ¿qué excepción quiero yo recoger aquí? 107 00:06:07,850 --> 00:06:08,910 la fecha 108 00:06:08,910 --> 00:06:11,050 está mal, vamos a inventarnos 109 00:06:11,050 --> 00:06:12,790 qué puede significar que esté mal 110 00:06:12,790 --> 00:06:14,649 que sea posterior a la de hoy 111 00:06:14,649 --> 00:06:16,649 por ejemplo, si me mandan una factura con fecha 112 00:06:16,649 --> 00:06:18,129 posterior a la de hoy 113 00:06:18,129 --> 00:06:20,990 esa no la puedo imprimir todavía, por ejemplo 114 00:06:20,990 --> 00:06:22,649 lo primero que se me ocurre 115 00:06:22,649 --> 00:06:24,569 lo digo por jugar un poco con fechas 116 00:06:24,569 --> 00:06:25,389 ya que nos ponemos 117 00:06:25,389 --> 00:06:28,370 vale, pues entonces, el error 118 00:06:28,370 --> 00:06:30,970 la excepción que yo quiero recoger 119 00:06:30,970 --> 00:06:33,569 es fecha posterior a la actual 120 00:06:33,569 --> 00:06:35,350 ya he identificado 121 00:06:35,350 --> 00:06:36,569 que eso es lo que quiero recoger 122 00:06:36,569 --> 00:06:39,529 vale, pues venga, nos hacemos una clase excepción 123 00:06:39,529 --> 00:06:44,399 a la que la llamo 124 00:06:44,399 --> 00:06:46,100 con el nombre más parecido 125 00:06:46,100 --> 00:06:49,160 al hecho que yo quiero reflejar 126 00:06:49,160 --> 00:06:54,079 fecha posterior 127 00:06:54,079 --> 00:06:55,399 actual excepción 128 00:06:55,399 --> 00:06:58,000 ala, ya tengo una excepción 129 00:06:58,000 --> 00:07:00,040 que es fecha posterior a la actual excepción 130 00:07:00,040 --> 00:07:01,680 me hago el constructor 131 00:07:01,680 --> 00:07:04,019 lo voy a generar aquí automáticamente 132 00:07:04,019 --> 00:07:05,019 por comodidad 133 00:07:05,019 --> 00:07:15,009 vale, bueno 134 00:07:15,009 --> 00:07:16,250 se me había dado el extens 135 00:07:16,250 --> 00:07:18,569 la vamos a hacer 136 00:07:18,569 --> 00:07:19,610 heredera 137 00:07:19,610 --> 00:07:22,970 pero ahora en lugar de derruntime exception 138 00:07:22,970 --> 00:07:25,189 vamos a hacer la heredera de exception 139 00:07:25,189 --> 00:07:26,529 a ver que implicaciones tiene 140 00:07:26,529 --> 00:07:29,670 exception era una super clase 141 00:07:29,670 --> 00:07:31,449 derruntime exception, la heredera de exception 142 00:07:31,449 --> 00:07:32,870 vale 143 00:07:32,870 --> 00:07:35,470 y venga, vamos a hacerle un constructor 144 00:07:35,470 --> 00:07:40,269 venga 145 00:07:40,269 --> 00:07:41,709 desde 146 00:07:41,709 --> 00:07:43,589 constructor 147 00:07:43,589 --> 00:07:47,329 estoy haciendo en source 148 00:07:47,329 --> 00:07:48,610 para que os vayáis acostumbrando 149 00:07:48,610 --> 00:07:51,649 generar constructor desde la superclase 150 00:07:51,649 --> 00:07:53,449 y marco de la superclase 151 00:07:53,449 --> 00:07:55,629 que dos quiero reutilizar con el super 152 00:07:55,629 --> 00:07:59,079 veis y me lo hace 153 00:07:59,079 --> 00:08:01,399 me lo hace el ya con el super 154 00:08:01,399 --> 00:08:05,399 tan estupendo 155 00:08:05,399 --> 00:08:06,920 estoy escribiendo 156 00:08:06,920 --> 00:08:08,860 lo mismo que antes pero genera automáticamente 157 00:08:08,860 --> 00:08:10,860 vale, en el constructor 158 00:08:10,860 --> 00:08:12,759 sin parámetros hemos dicho que aquí 159 00:08:12,759 --> 00:08:15,300 queremos poner el mensajito que nos interesa 160 00:08:15,300 --> 00:08:19,259 La fecha de la factura 161 00:08:19,259 --> 00:08:21,060 No es válida 162 00:08:21,060 --> 00:08:30,730 Porque es posterior a la actual 163 00:08:30,730 --> 00:08:37,500 Vale 164 00:08:37,500 --> 00:08:41,009 A la actual 165 00:08:41,009 --> 00:08:42,370 Vale 166 00:08:42,370 --> 00:08:45,049 Nada, ya tenemos nuestra clase excepción 167 00:08:45,049 --> 00:08:47,450 Hereda de excepción 168 00:08:47,450 --> 00:08:48,830 Directamente es la única diferencia 169 00:08:48,830 --> 00:08:49,990 Con antes hereda de excepción 170 00:08:49,990 --> 00:08:51,690 Y he puesto el mensajito que yo quiero 171 00:08:51,690 --> 00:08:54,269 Bueno, ahora ya tengo la clase excepción 172 00:08:54,269 --> 00:08:55,590 Ahora vamos a hacernos nuestro método 173 00:08:55,590 --> 00:08:57,529 Aquí tenemos que distinguir 174 00:08:57,529 --> 00:09:00,309 si no hay error 175 00:09:00,309 --> 00:09:01,389 si la fecha está bien 176 00:09:01,389 --> 00:09:03,950 pues mostraremos los datos 177 00:09:03,950 --> 00:09:06,470 de la factura, los mandaremos a la impresora 178 00:09:06,470 --> 00:09:09,250 pues ya está 179 00:09:09,250 --> 00:09:12,070 factura, ponemos aquí el número 180 00:09:12,070 --> 00:09:16,809 f.get 181 00:09:16,809 --> 00:09:17,370 número 182 00:09:17,370 --> 00:09:19,289 más 183 00:09:19,289 --> 00:09:23,940 f.get 184 00:09:23,940 --> 00:09:26,059 fecha 185 00:09:26,059 --> 00:09:27,740 ala 186 00:09:27,740 --> 00:09:29,820 si la fecha 187 00:09:29,820 --> 00:09:31,100 no es posterior a la actual 188 00:09:31,100 --> 00:09:32,720 mostraremos el mensaje 189 00:09:32,720 --> 00:09:35,600 y si la fecha es posterior a la actual 190 00:09:35,600 --> 00:09:37,500 entonces ahora es cuando queremos 191 00:09:37,500 --> 00:09:38,500 lanzar la excepción 192 00:09:38,500 --> 00:09:40,559 entonces haremos 193 00:09:40,559 --> 00:09:43,360 throw new, la excepción se llamaba 194 00:09:43,360 --> 00:09:46,720 así 195 00:09:46,720 --> 00:09:59,610 vale, este será mi método 196 00:09:59,610 --> 00:10:01,350 si la fecha está bien 197 00:10:01,350 --> 00:10:03,129 hago lo que tengo que hacer 198 00:10:03,129 --> 00:10:05,370 y si no está bien, aviso 199 00:10:05,370 --> 00:10:07,210 hasta ahora lo que hemos hecho 200 00:10:07,210 --> 00:10:08,210 ¿qué nos falta aquí? 201 00:10:08,710 --> 00:10:11,809 poner la condición de que la fecha 202 00:10:11,809 --> 00:10:13,549 de la factura sea posterior 203 00:10:13,549 --> 00:10:15,429 a la fecha actual 204 00:10:15,429 --> 00:10:16,289 vale 205 00:10:16,289 --> 00:10:19,990 venga, buscadlo por internet 206 00:10:19,990 --> 00:10:21,389 como sea con lo que vimos de 207 00:10:21,389 --> 00:10:23,590 de aquí hasta la una, a ver que 208 00:10:23,590 --> 00:10:25,970 que, como haríais 209 00:10:25,970 --> 00:10:27,710 eso, pues para practicar un poco con fechas 210 00:10:27,710 --> 00:10:29,350 vale, luego ya la una lo 211 00:10:29,350 --> 00:10:30,950 seguimos completando 212 00:10:30,950 --> 00:10:32,789 venga 213 00:10:32,789 --> 00:10:35,789 vale, bueno, pues en que situación os habéis 214 00:10:35,789 --> 00:10:37,809 encontrado, que estabais con este 215 00:10:37,809 --> 00:10:38,789 método en el cual 216 00:10:38,789 --> 00:10:41,070 había que efectivamente 217 00:10:41,070 --> 00:10:45,389 resolver esto 218 00:10:45,389 --> 00:10:47,470 yo tengo la fecha de mi factura 219 00:10:47,470 --> 00:10:48,129 que es esta 220 00:10:48,129 --> 00:10:51,330 tengo la fecha de mi factura 221 00:10:51,330 --> 00:10:53,549 esta es la fecha de mi factura 222 00:10:53,549 --> 00:10:55,409 porque mi factura ha llegado por aquí 223 00:10:55,409 --> 00:10:56,970 F 224 00:10:56,970 --> 00:10:59,350 y tengo la fecha de mi factura 225 00:10:59,350 --> 00:11:00,889 que es esta, que la he sacado con el get 226 00:11:00,889 --> 00:11:01,929 tengo la fecha de mi factura 227 00:11:01,929 --> 00:11:04,549 y ahora tengo que ver si esa fecha 228 00:11:04,549 --> 00:11:07,629 ese objeto date es posterior a otro 229 00:11:07,629 --> 00:11:08,470 objeto date 230 00:11:08,470 --> 00:11:10,769 entonces tengo dos cosas que resolver 231 00:11:10,769 --> 00:11:14,129 primero, ver cómo averiguar 232 00:11:14,129 --> 00:11:15,570 o sea, ver 233 00:11:15,570 --> 00:11:17,070 si tengo alguna manera de 234 00:11:17,070 --> 00:11:19,990 cómo calculo que esta fecha 235 00:11:19,990 --> 00:11:21,210 sea posterior a otra 236 00:11:21,210 --> 00:11:23,470 y luego esa otra 237 00:11:23,470 --> 00:11:24,509 cómo la genero 238 00:11:24,509 --> 00:11:27,370 entonces, esto es un objeto de una clase 239 00:11:27,370 --> 00:11:29,669 que ya está hecha, como todas las clases 240 00:11:29,669 --> 00:11:31,389 que ya están hechas tendrán mil métodos 241 00:11:31,389 --> 00:11:32,870 para permitirnos hacer mil cosas 242 00:11:32,870 --> 00:11:35,269 entonces, lo primero que uno hace es 243 00:11:35,269 --> 00:11:37,009 investigar los métodos que tiene eso 244 00:11:37,009 --> 00:11:41,039 dice, a ver, yo quiero 245 00:11:41,039 --> 00:11:43,320 poder comparar un objeto fecha con 246 00:11:43,320 --> 00:11:45,240 otra? Pues lo primero que se pregunta 247 00:11:45,240 --> 00:11:47,299 uno es, ¿qué puedo hacer yo con los objetos fecha? 248 00:11:47,379 --> 00:11:49,299 ¿Qué puedo hacer? Tendré que poder 249 00:11:49,299 --> 00:11:51,080 hacer cosas con los objetos fecha, porque 250 00:11:51,080 --> 00:11:52,740 pertenecen a clases que ya están hechas. 251 00:11:53,299 --> 00:11:54,820 Luego, esta clase tiene un montón de métodos. 252 00:11:55,639 --> 00:11:57,240 Entonces, ¿me permitirá hacer cosas 253 00:11:57,240 --> 00:11:58,240 con las fechas? 254 00:11:59,080 --> 00:12:01,220 Yo, en particular, lo que quiero hacer con las fechas 255 00:12:01,220 --> 00:12:02,340 es compararla con otra. 256 00:12:03,259 --> 00:12:05,259 Bueno, pues vamos a ver. Vamos a ver qué tiene, 257 00:12:05,360 --> 00:12:07,639 qué métodos me ofrece. O me voy a la documentación, 258 00:12:08,259 --> 00:12:09,580 o si tengo un entorno de desarrollo 259 00:12:09,580 --> 00:12:11,600 que me accede a la documentación en línea 260 00:12:11,600 --> 00:12:12,659 como es este, lo hago 261 00:12:12,659 --> 00:12:15,659 y me pongo a mirar. Y en este además, como es con la A, 262 00:12:16,240 --> 00:12:17,539 pues es que es el primero ya que 263 00:12:17,539 --> 00:12:18,940 me ofrece. Me dice, fíjate, 264 00:12:19,700 --> 00:12:21,539 de los métodos que hay en 265 00:12:21,539 --> 00:12:23,419 date, tienes uno 266 00:12:23,419 --> 00:12:25,720 que por el nombre, tiene toda la pinta 267 00:12:25,720 --> 00:12:27,440 que ya te está diciendo si 268 00:12:27,440 --> 00:12:29,659 esa fecha que llama al método está después 269 00:12:29,659 --> 00:12:31,139 que la que tú le pases como parámetro. 270 00:12:32,799 --> 00:12:33,720 Pues ya lo tienes resuelto 271 00:12:33,720 --> 00:12:35,000 y justo es lo que quiero hacer. 272 00:12:35,779 --> 00:12:37,480 Ver si mi fecha que llama al método 273 00:12:37,480 --> 00:12:39,500 está después que la que yo le paso 274 00:12:39,500 --> 00:12:41,620 como parámetro, pues será 275 00:12:41,620 --> 00:12:43,600 esto, será esto lo que yo voy 276 00:12:43,600 --> 00:12:45,519 a usar, ¿vale? 277 00:12:46,740 --> 00:12:47,580 Ese boolean 278 00:12:47,580 --> 00:12:49,620 será true o false, si está después o no está 279 00:12:49,620 --> 00:12:51,419 después, ¿vale? 280 00:12:51,440 --> 00:12:53,299 Luego tengo un compare to, de hecho, claro, 281 00:12:53,399 --> 00:12:55,399 el compare to, porque date 282 00:12:55,399 --> 00:12:57,120 hereda de comparable, 283 00:12:57,799 --> 00:12:59,740 a heredar de comparable le permite comparar fechas, 284 00:13:00,240 --> 00:13:01,759 pero el compare to ya sabemos 285 00:13:01,759 --> 00:13:03,620 que cumple los requisitos 286 00:13:03,620 --> 00:13:04,879 y es que te devuelve un entero, 287 00:13:05,480 --> 00:13:06,980 te devolverá negativo 288 00:13:06,980 --> 00:13:09,100 si la fecha que llama el método 289 00:13:09,100 --> 00:13:10,159 va después que esta 290 00:13:10,159 --> 00:13:13,220 te devolverá cero si es la misma fecha 291 00:13:13,220 --> 00:13:15,000 y te devolverá positivo 292 00:13:15,000 --> 00:13:17,519 si la fecha que llama el método va después que esta 293 00:13:17,519 --> 00:13:19,500 entonces el compareTo es más genérico 294 00:13:19,500 --> 00:13:21,000 te devuelve 295 00:13:21,000 --> 00:13:22,980 menos uno, cero o uno 296 00:13:22,980 --> 00:13:25,519 en función de si la fecha que llama el método 297 00:13:25,519 --> 00:13:26,259 va antes 298 00:13:26,259 --> 00:13:28,440 es la misma después que esta 299 00:13:28,440 --> 00:13:31,220 luego ya viendo esto ya vemos además 300 00:13:31,220 --> 00:13:32,299 que date es comparable 301 00:13:32,299 --> 00:13:34,500 con lo cual si yo tengo una lista de fechas 302 00:13:34,500 --> 00:13:36,740 con el sort las puedo ordenar 303 00:13:36,740 --> 00:13:37,899 pues ya había muchas cosas 304 00:13:37,899 --> 00:13:40,539 y veo en particular que tengo un método 305 00:13:40,539 --> 00:13:41,259 más concreto 306 00:13:41,259 --> 00:13:44,700 que estará interiormente 307 00:13:44,700 --> 00:13:46,200 está abarazado en comparable, claro 308 00:13:46,200 --> 00:13:48,779 que ya me dice directamente en un true o false 309 00:13:48,779 --> 00:13:50,039 ya en un true o false me dice 310 00:13:50,039 --> 00:13:52,700 si la fecha que llama el método va después que esta 311 00:13:52,700 --> 00:13:54,460 o no, pues es justo 312 00:13:54,460 --> 00:13:55,779 justo lo que necesitamos 313 00:13:55,779 --> 00:13:58,200 bueno, pues entonces uno dice, ah vale 314 00:13:58,200 --> 00:14:00,559 pues voy a usar esto como 315 00:14:00,559 --> 00:14:04,700 mi condición, esta va a ser 316 00:14:04,700 --> 00:14:07,259 mi condición 317 00:14:07,259 --> 00:14:12,309 si la fecha es posterior 318 00:14:12,309 --> 00:14:15,649 a la actual 319 00:14:15,649 --> 00:14:17,470 y sigo con el siguiente problema 320 00:14:17,470 --> 00:14:19,970 que es como creo yo hay un objeto fecha 321 00:14:19,970 --> 00:14:20,870 con la fecha actual 322 00:14:20,870 --> 00:14:22,889 entonces aquí será un no delante 323 00:14:22,889 --> 00:14:25,549 porque si no es 324 00:14:25,549 --> 00:14:27,450 posterior a la actual, ese es el caso bueno 325 00:14:27,450 --> 00:14:29,429 entonces imprimo la factura 326 00:14:29,429 --> 00:14:32,230 en el else lanzo la excepción 327 00:14:32,230 --> 00:14:34,210 porque la fecha no es buena, lanzo la excepción 328 00:14:34,210 --> 00:14:35,889 ¿vale? entonces 329 00:14:35,889 --> 00:14:37,070 ¿qué me falta a mí aquí? 330 00:14:38,490 --> 00:14:40,009 me falta simplemente 331 00:14:40,009 --> 00:14:42,289 ver cómo genero yo un objeto fecha 332 00:14:42,289 --> 00:14:43,830 con la fecha actual 333 00:14:43,830 --> 00:14:45,970 vale, pues si uno 334 00:14:45,970 --> 00:14:47,590 busca documentación de date 335 00:14:47,590 --> 00:14:49,710 cuando usamos date, ya 336 00:14:49,710 --> 00:14:51,509 en algún momento dijimos, pero si no es que 337 00:14:51,509 --> 00:14:53,509 uno lo encuentra en cuanto investigue 338 00:14:53,509 --> 00:14:54,789 dos segundos, lo va a encontrar 339 00:14:54,789 --> 00:14:57,730 que si tú instancias 340 00:14:57,730 --> 00:14:58,809 un objeto date 341 00:14:58,809 --> 00:15:00,529 así directamente 342 00:15:00,529 --> 00:15:05,210 instancias tal cual con el constructor sin parámetros 343 00:15:05,210 --> 00:15:07,370 lo instancia sin darle nada adentro 344 00:15:07,370 --> 00:15:08,990 te genera un objeto fecha 345 00:15:08,990 --> 00:15:10,169 con la fecha actual 346 00:15:10,169 --> 00:15:12,990 con la fecha del momento de la instanciación 347 00:15:12,990 --> 00:15:14,929 pues justo, ya lo tenemos 348 00:15:14,929 --> 00:15:15,909 todo lo que necesitamos 349 00:15:15,909 --> 00:15:21,440 ¿vale? ya tenemos todo lo que necesitamos 350 00:15:21,440 --> 00:15:23,580 la fecha de mi factura 351 00:15:23,580 --> 00:15:24,759 esta 352 00:15:24,759 --> 00:15:27,460 esta es la fecha 353 00:15:27,460 --> 00:15:28,159 de mi factura 354 00:15:28,159 --> 00:15:31,220 que la fecha de mi factura no es 355 00:15:31,220 --> 00:15:33,259 posterior a la fecha actual 356 00:15:33,259 --> 00:15:34,179 no es posterior 357 00:15:34,179 --> 00:15:36,500 la mando a la impresora 358 00:15:36,500 --> 00:15:38,639 que si es posterior 359 00:15:38,639 --> 00:15:41,159 no tengo que mandar a la impresora y aviso 360 00:15:41,159 --> 00:15:42,259 la fecha es posterior 361 00:15:42,259 --> 00:15:44,360 y ya el que llama el método 362 00:15:44,360 --> 00:15:45,399 que lo llama aquí arriba 363 00:15:45,399 --> 00:15:47,480 que ya decida que hace 364 00:15:47,480 --> 00:15:50,360 si para el programa, si no lo para 365 00:15:50,360 --> 00:15:52,320 y le dice al usuario todavía no toca 366 00:15:52,320 --> 00:15:54,379 imprimir estas facturas, ya depende 367 00:15:54,379 --> 00:15:56,639 depende de lo que tenga que hacer mi software 368 00:15:56,639 --> 00:15:58,139 ¿vale? bueno 369 00:15:58,139 --> 00:16:00,519 bueno, pues entonces, el método ya estaría 370 00:16:00,519 --> 00:16:02,539 y la excepción lanzada 371 00:16:02,539 --> 00:16:04,559 es esta, fecha posterior, que es esta de aquí 372 00:16:04,559 --> 00:16:07,399 vale, entonces 373 00:16:07,399 --> 00:16:09,539 esto lo había puesto para hacer una prueba 374 00:16:09,539 --> 00:16:12,100 vale, pues a ver, hemos 375 00:16:12,100 --> 00:16:14,100 decidido que esta excepción que hemos hecho 376 00:16:14,100 --> 00:16:15,840 herede de la superclase 377 00:16:15,840 --> 00:16:17,860 exception, que está todavía 378 00:16:17,860 --> 00:16:19,940 por encima de runtime exception, que herede de ella. 379 00:16:20,980 --> 00:16:22,100 Vale, pues, ¿qué diferencia 380 00:16:22,100 --> 00:16:24,059 hay entre que herede de esta y que herede de la otra? 381 00:16:25,100 --> 00:16:25,840 Pues, si una 382 00:16:25,840 --> 00:16:27,799 excepción, si yo lanzo una excepción 383 00:16:27,799 --> 00:16:29,659 que hereda directamente de exception, 384 00:16:30,960 --> 00:16:31,940 esa excepción 385 00:16:31,940 --> 00:16:33,919 es una excepción que ya en 386 00:16:33,919 --> 00:16:35,279 tiempo de compilación 387 00:16:35,279 --> 00:16:37,700 me obligan a tratarla. 388 00:16:38,460 --> 00:16:39,899 Cuando yo lanzo una excepción 389 00:16:39,899 --> 00:16:41,879 que hereda de runtime exception, la lanzo 390 00:16:41,879 --> 00:16:43,600 y ya está. Y luego 391 00:16:43,600 --> 00:16:45,879 llamo al método y no pasa nada. Y en tiempo 392 00:16:45,879 --> 00:16:48,000 de ejecución puede que aparezca 393 00:16:48,000 --> 00:16:48,580 o puede que no. 394 00:16:49,679 --> 00:16:51,779 Pero cuando lanzo una excepción que hereda 395 00:16:51,779 --> 00:16:53,299 de exception y no de runtime, 396 00:16:54,519 --> 00:16:55,919 ya en tiempo de compilación, 397 00:16:56,019 --> 00:16:57,799 ya desde mi código, tengo 398 00:16:57,799 --> 00:16:59,360 que hacer un aviso. 399 00:17:00,759 --> 00:17:02,100 Es decir, son excepciones 400 00:17:02,100 --> 00:17:03,799 verificadas que se llaman. 401 00:17:04,480 --> 00:17:05,539 Excepciones verificadas. 402 00:17:06,059 --> 00:17:08,079 Y es lo que me está diciendo aquí al ponerse el compilador 403 00:17:08,079 --> 00:17:09,839 en rojo. Me está diciendo 404 00:17:09,839 --> 00:17:11,779 el compilador, oye, cuidado, este método 405 00:17:11,779 --> 00:17:12,940 está lanzando una excepción 406 00:17:12,940 --> 00:17:15,000 tienes que avisar 407 00:17:15,000 --> 00:17:17,079 tienes que avisar 408 00:17:17,079 --> 00:17:19,059 y este método tuyo 409 00:17:19,059 --> 00:17:22,299 tiene que recoger en su cabecera 410 00:17:22,299 --> 00:17:23,960 que puede 411 00:17:23,960 --> 00:17:25,059 que lance esa excepción 412 00:17:25,059 --> 00:17:26,839 entonces 413 00:17:26,839 --> 00:17:29,039 si vosotros marcáis aquí 414 00:17:29,039 --> 00:17:31,460 la opción que te da a throws 415 00:17:31,460 --> 00:17:34,119 pues es justo lo que nos hace 416 00:17:34,119 --> 00:17:37,880 si lo hago más pequeño para que se vea 417 00:17:37,880 --> 00:17:38,500 lo hago grande 418 00:17:38,500 --> 00:17:46,660 es decir, desde el momento en que un método 419 00:17:46,660 --> 00:17:49,000 lanza una excepción 420 00:17:49,000 --> 00:17:49,940 que hereda de exception 421 00:17:49,940 --> 00:17:51,740 y no de runtime, sino de exception 422 00:17:51,740 --> 00:17:53,000 que es más poderosa 423 00:17:53,000 --> 00:17:55,900 ese método está obligado 424 00:17:55,900 --> 00:17:58,759 a avisar de que puede que la lance 425 00:17:58,759 --> 00:18:00,579 está obligado a avisar 426 00:18:00,579 --> 00:18:02,240 ¿y cómo avisa? 427 00:18:02,920 --> 00:18:04,039 poniendo aquí el throws 428 00:18:04,039 --> 00:18:06,039 throws y el nombre de la excepción 429 00:18:06,039 --> 00:18:09,599 luego, si esta 430 00:18:09,599 --> 00:18:11,500 heredara de runtime exception 431 00:18:11,500 --> 00:18:13,539 esto no hace falta ponerlos 432 00:18:13,539 --> 00:18:15,839 de hecho antes lo hemos hecho 433 00:18:15,839 --> 00:18:17,059 y no hemos puesto ningún throw 434 00:18:17,059 --> 00:18:19,900 esas son las excepciones 435 00:18:19,900 --> 00:18:21,559 que se llaman no verificadas 436 00:18:21,559 --> 00:18:23,400 por código en tiempo de compilación 437 00:18:23,400 --> 00:18:25,839 yo la lanzo y ya en tiempo 438 00:18:25,839 --> 00:18:28,099 de ejecución si sale que salga 439 00:18:28,099 --> 00:18:29,839 ya está, pero en tiempo de 440 00:18:29,839 --> 00:18:31,819 escritura de código yo no tengo 441 00:18:31,819 --> 00:18:32,720 que hacer nada más 442 00:18:32,720 --> 00:18:35,839 pues en las exception esas 443 00:18:35,839 --> 00:18:37,680 por ser más 444 00:18:37,680 --> 00:18:39,660 peligrosas, tener más 445 00:18:39,660 --> 00:18:41,779 implicaciones, por lo que sea que uno quiera 446 00:18:41,779 --> 00:18:43,579 decidir, eso ya es una cuestión subjetiva 447 00:18:43,579 --> 00:18:45,779 si decidimos 448 00:18:45,779 --> 00:18:46,839 que herede de exception 449 00:18:46,839 --> 00:18:49,980 nuestro método tiene que avisar 450 00:18:49,980 --> 00:18:51,700 se supone que esa es más 451 00:18:51,700 --> 00:18:53,740 crítica, tiene que avisar 452 00:18:53,740 --> 00:18:55,839 y avisa el método poniendo 453 00:18:55,839 --> 00:18:57,259 el throws y el nombre de la excepción 454 00:18:57,259 --> 00:18:59,059 ¿vale? es obligatorio 455 00:18:59,059 --> 00:19:01,700 como no avisen, el compilador nos deja seguir 456 00:19:01,700 --> 00:19:03,680 si yo quito esto 457 00:19:03,680 --> 00:19:12,109 si yo quito esto, como veis 458 00:19:12,109 --> 00:19:14,009 el compilador se va a poner 459 00:19:14,009 --> 00:19:15,869 rojo y me dice, no, lo siento 460 00:19:15,869 --> 00:19:17,750 no puedes lanzar una exception 461 00:19:17,750 --> 00:19:19,910 así por la buena si el método no avisa 462 00:19:19,910 --> 00:19:21,849 si la haces 463 00:19:21,849 --> 00:19:24,009 runtime exception, si la haces runtime exception, sí 464 00:19:24,009 --> 00:19:25,769 pero si la haces 465 00:19:25,769 --> 00:19:27,809 exception, lo siento, pero tienes 466 00:19:27,809 --> 00:19:29,829 que avisar, bueno, pues ya está 467 00:19:29,829 --> 00:19:31,769 nosotros queremos que sea exception, porque queremos 468 00:19:31,769 --> 00:19:33,549 que sea de estas verificadas por código 469 00:19:33,549 --> 00:19:35,670 que ahora vemos lo que implica, pues entonces 470 00:19:35,670 --> 00:19:37,410 tenemos que hacer el throws, vale 471 00:19:37,410 --> 00:19:39,789 vale, pues ya está, el método ya se 472 00:19:39,789 --> 00:19:41,390 queda tranquilo porque ya hemos hecho el throws 473 00:19:41,390 --> 00:19:42,809 pero claro 474 00:19:42,809 --> 00:19:45,529 ¿qué implica hacer el throws? 475 00:19:47,109 --> 00:19:47,509 implica 476 00:19:47,509 --> 00:19:48,809 que ahora 477 00:19:48,809 --> 00:19:51,089 el que usa ese método 478 00:19:51,089 --> 00:19:53,250 o sea, este método ya está hecho 479 00:19:53,250 --> 00:19:55,009 lo hizo un tío por ahí, que no sabemos ni quién es 480 00:19:55,009 --> 00:19:57,769 ahora yo vengo aquí a ejecutarlo 481 00:19:57,769 --> 00:19:59,670 perdón, a usarlo 482 00:19:59,670 --> 00:20:03,440 vengo yo aquí a usarlo 483 00:20:03,440 --> 00:20:05,460 no tengo ni idea de cómo está hecho 484 00:20:05,460 --> 00:20:07,980 ni idea, lo hizo otro, no tengo ni idea de cómo está hecho 485 00:20:07,980 --> 00:20:09,200 solo sé que es un método 486 00:20:09,200 --> 00:20:11,240 que si yo le paso una factura 487 00:20:11,240 --> 00:20:13,079 me la manda por la impresora 488 00:20:13,079 --> 00:20:14,980 entonces como me interesa 489 00:20:14,980 --> 00:20:17,700 pues lo uso, pero ni lo he hecho yo 490 00:20:17,700 --> 00:20:18,359 ni tengo ni idea 491 00:20:18,359 --> 00:20:21,960 vale, pues yo lo uso, como me han dicho que lo tengo que usar 492 00:20:21,960 --> 00:20:23,480 que es pasarle un objeto factura 493 00:20:23,480 --> 00:20:26,160 luego lo estoy usando bien porque le estoy pasando un objeto factura 494 00:20:26,160 --> 00:20:30,140 y se me pone 495 00:20:30,140 --> 00:20:31,700 el compilador me sigue avisando 496 00:20:31,700 --> 00:20:33,880 claro, ¿de qué me está avisando el compilador? 497 00:20:35,880 --> 00:20:37,799 pues el compilador me está avisando 498 00:20:37,799 --> 00:20:41,779 de que, oye, cuidado 499 00:20:41,779 --> 00:20:47,029 me está diciendo, cuidado 500 00:20:47,029 --> 00:20:48,990 que este método que estás llamando 501 00:20:48,990 --> 00:20:52,299 perdonadme 502 00:20:52,299 --> 00:21:03,650 sí, sí, soy yo 503 00:21:03,650 --> 00:21:09,549 seguimos 504 00:21:09,549 --> 00:21:12,950 vale, pues entonces 505 00:21:12,950 --> 00:21:15,289 la ventaja que tienen 506 00:21:15,289 --> 00:21:16,150 estas excepciones 507 00:21:16,150 --> 00:21:17,970 es que 508 00:21:17,970 --> 00:21:21,049 el que está usando el método ya le están avisando 509 00:21:21,049 --> 00:21:23,109 le están dando una información que 510 00:21:23,109 --> 00:21:25,150 si lo hubiéramos hecho en la de Runtime 511 00:21:25,150 --> 00:21:26,170 no tendría ni idea 512 00:21:26,170 --> 00:21:28,849 el que usa este método, lo usa 513 00:21:28,849 --> 00:21:30,849 y se encuentra que la excepción 514 00:21:30,849 --> 00:21:33,049 le sale en tiempo de ejecución 515 00:21:33,049 --> 00:21:34,869 y ahí ya dice, ah, que me puede 516 00:21:34,869 --> 00:21:36,869 salir esta excepción, en tiempo de ejecución se la 517 00:21:36,869 --> 00:21:38,609 encuentra, pero antes 518 00:21:38,609 --> 00:21:40,730 el desarrollador que la está usando 519 00:21:40,730 --> 00:21:42,849 no tiene ni idea, sin embargo 520 00:21:42,849 --> 00:21:44,269 si le hacemos heredera de excepción 521 00:21:44,269 --> 00:21:46,769 el que está usando ese método 522 00:21:46,769 --> 00:21:48,849 ya recibe 523 00:21:48,849 --> 00:21:50,589 el aviso y le dice, cuidado 524 00:21:50,589 --> 00:21:52,670 que este método te está lanzando una excepción 525 00:21:52,670 --> 00:21:54,569 entonces tienes que 526 00:21:54,569 --> 00:21:56,710 o capturarla o si no 527 00:21:56,710 --> 00:21:58,769 la capturas tienes que a su vez 528 00:21:58,769 --> 00:22:00,750 propagarla tú hacia arriba con otro throws 529 00:22:00,750 --> 00:22:01,910 te está obligando 530 00:22:01,910 --> 00:22:03,930 y mientras no hagas una cosa u otra 531 00:22:03,930 --> 00:22:06,150 el error de combinación no se quita 532 00:22:06,150 --> 00:22:08,549 luego esa es la diferencia 533 00:22:08,549 --> 00:22:10,529 entre lanzar 534 00:22:10,529 --> 00:22:12,470 una excepción 535 00:22:12,470 --> 00:22:15,509 con 536 00:22:15,509 --> 00:22:20,359 lanzar una excepción 537 00:22:20,359 --> 00:22:23,220 que herede de runTimeException o que herede de exception 538 00:22:23,220 --> 00:22:24,819 si esta hereda 539 00:22:24,819 --> 00:22:26,839 de runTimeException, ya está 540 00:22:26,839 --> 00:22:28,779 tranquilamente el método 541 00:22:28,779 --> 00:22:30,519 lo terminamos, este throws 542 00:22:30,519 --> 00:22:32,000 no hay que ponerlo 543 00:22:32,000 --> 00:22:34,779 y luego cuando usamos ese método 544 00:22:34,779 --> 00:22:36,779 de hecho 545 00:22:36,779 --> 00:22:37,819 si lo cambiamos aquí 546 00:22:37,819 --> 00:22:40,400 si yo aquí rápidamente a esto 547 00:22:40,400 --> 00:22:42,619 la voy a cambiar, la voy a cambiar a runTimeException 548 00:22:42,619 --> 00:22:46,720 la cambio a runTimeException 549 00:22:46,720 --> 00:22:47,839 pues ya está 550 00:22:47,839 --> 00:22:50,660 este método me ha dejado lanzarla 551 00:22:50,660 --> 00:22:52,680 y aquí ni 552 00:22:52,680 --> 00:22:53,640 throws ni nada 553 00:22:53,640 --> 00:22:55,740 yo quito el throws 554 00:22:55,740 --> 00:22:58,400 y no pasa absolutamente nada 555 00:22:58,400 --> 00:23:00,480 no pasa nada 556 00:23:00,480 --> 00:23:01,720 el método ya está terminado 557 00:23:01,720 --> 00:23:03,900 y yo uso este método 558 00:23:03,900 --> 00:23:05,940 y ya está, y lo uso tranquilamente. 559 00:23:06,460 --> 00:23:07,539 ¿Qué puede ocurrir? 560 00:23:07,839 --> 00:23:10,339 Que luego en tiempo de ejecución me salga la excepción. 561 00:23:10,480 --> 00:23:11,420 En tiempo de ejecución me sale. 562 00:23:12,779 --> 00:23:14,359 Pero yo en tiempo de compilación 563 00:23:14,359 --> 00:23:16,859 no sé que me puede salir o no. 564 00:23:17,119 --> 00:23:18,400 O sea, si conozco este código, 565 00:23:19,039 --> 00:23:20,539 sí lo sé que me puede salir. 566 00:23:20,680 --> 00:23:21,960 Si no lo conozco, no tengo ni idea 567 00:23:21,960 --> 00:23:22,880 de que me puede salir o no. 568 00:23:22,960 --> 00:23:24,220 Me va a salir en tiempo de ejecución. 569 00:23:25,160 --> 00:23:28,460 ¿Qué quiero capturar por si acaso hay excepciones 570 00:23:28,460 --> 00:23:29,240 que no conozco? 571 00:23:29,480 --> 00:23:31,720 Puedo hacer un try-catch con excepción. 572 00:23:31,720 --> 00:23:34,119 ¿vale? es lo más que puedo hacer 573 00:23:34,119 --> 00:23:35,839 pero me falta 574 00:23:35,839 --> 00:23:36,839 información, entonces 575 00:23:36,839 --> 00:23:39,859 algunas excepciones son así, por ejemplo 576 00:23:39,859 --> 00:23:42,019 null pointer exception te hereda de run time 577 00:23:42,019 --> 00:23:44,000 exception, porque es que es un 578 00:23:44,000 --> 00:23:46,180 rollo que tuviéramos que capturar 579 00:23:46,180 --> 00:23:48,059 todos los null pointer exception 580 00:23:48,059 --> 00:23:50,099 es un rollo, entonces algunas se heredan 581 00:23:50,099 --> 00:23:51,960 de run time exception porque 582 00:23:51,960 --> 00:23:53,880 se asume, bueno, no te voy a estar 583 00:23:53,880 --> 00:23:55,400 obligando a capturarlas todas 584 00:23:55,400 --> 00:23:57,579 que te salga en tiempo de ejecución y ya está 585 00:23:57,579 --> 00:23:59,660 y ya tú 586 00:23:59,660 --> 00:24:01,019 te vas a arreglar lo que sea 587 00:24:01,019 --> 00:24:03,559 ¿vale? pero si nosotros 588 00:24:03,559 --> 00:24:05,099 queremos nuestro software 589 00:24:05,099 --> 00:24:06,779 al que va a usar el método 590 00:24:06,779 --> 00:24:09,559 ya de partida, el que lo va a usar 591 00:24:09,559 --> 00:24:11,380 para hacer su propio código, decirle 592 00:24:11,380 --> 00:24:13,039 cuidado que te va a lanzar una excepción 593 00:24:13,039 --> 00:24:13,920 si queremos eso 594 00:24:13,920 --> 00:24:17,539 pues entonces la hacemos heredera de 595 00:24:17,539 --> 00:24:19,420 exception sin más 596 00:24:19,420 --> 00:24:21,640 y al hacer 597 00:24:21,640 --> 00:24:23,440 la heredera de exception tiene todas estas 598 00:24:23,440 --> 00:24:24,059 implicaciones 599 00:24:24,059 --> 00:24:27,299 el método ya se queja y me dice 600 00:24:27,299 --> 00:24:29,460 oye, tienes que poner 601 00:24:29,460 --> 00:24:30,599 el throws, vale 602 00:24:30,599 --> 00:24:32,059 ponemos el throws 603 00:24:32,059 --> 00:24:34,819 el método se queda tranquilo 604 00:24:34,819 --> 00:24:39,740 ya está, se queda tranquilo el método 605 00:24:39,740 --> 00:24:41,960 pero ahora, el que usa 606 00:24:41,960 --> 00:24:43,720 nuestro software 607 00:24:43,720 --> 00:24:45,619 el que lo usa, le dice, oye 608 00:24:45,619 --> 00:24:47,799 cuidado que estás usando 609 00:24:47,799 --> 00:24:49,880 un método que te puede 610 00:24:49,880 --> 00:24:50,900 lanzar esta excepción 611 00:24:50,900 --> 00:24:53,240 fecha posterior a la actual, cuidado 612 00:24:53,240 --> 00:24:55,380 o captúrala 613 00:24:55,380 --> 00:24:57,599 o propágala, que se llama 614 00:24:57,599 --> 00:24:59,339 que son las dos opciones que te da aquí 615 00:24:59,339 --> 00:25:01,000 la de arriba, throws 616 00:25:01,000 --> 00:25:02,279 es propagar 617 00:25:02,279 --> 00:25:04,740 y la de abajo es capturar 618 00:25:04,740 --> 00:25:07,240 que la capturamos con el try-catch 619 00:25:07,240 --> 00:25:09,119 como he hecho otras veces, estupendo, capturar 620 00:25:09,119 --> 00:25:10,059 ya sabemos lo que significa 621 00:25:10,059 --> 00:25:13,400 que si sale la excepción, se va el catch, el programa no se para 622 00:25:13,400 --> 00:25:15,319 que no quiero capturarla 623 00:25:15,319 --> 00:25:16,740 porque no quiero try-catch, porque 624 00:25:16,740 --> 00:25:19,079 si sale esta excepción, quiero que la máquina virtual 625 00:25:19,079 --> 00:25:21,000 pare el programa, que no quiero capturarla 626 00:25:21,000 --> 00:25:22,440 no quiero capturarla 627 00:25:22,440 --> 00:25:24,619 pues entonces hay que hacer 628 00:25:24,619 --> 00:25:26,940 lo que viene arriba 629 00:25:26,940 --> 00:25:29,099 que es propagar, ¿y qué es propagar? 630 00:25:29,099 --> 00:25:31,680 pues a su ir lanzando el throws 631 00:25:31,680 --> 00:25:33,079 más arriba y más arriba y más arriba 632 00:25:33,079 --> 00:25:35,619 es decir, el método en el que estoy 633 00:25:35,619 --> 00:25:37,339 que aquí ya es el main 634 00:25:37,339 --> 00:25:39,819 ya es el main directamente, pues en el que estoy 635 00:25:39,819 --> 00:25:41,200 ponerle a su vez el throws 636 00:25:41,200 --> 00:25:44,019 si dais aquí a esa opción 637 00:25:44,019 --> 00:25:45,619 ya está 638 00:25:45,619 --> 00:25:46,900 aquí está el throws 639 00:25:46,900 --> 00:25:48,779 y ya está, ya se queda tranquilo 640 00:25:48,779 --> 00:25:53,039 entonces repito, cuando un método 641 00:25:53,039 --> 00:25:54,960 llama, perdón, puede lanzar 642 00:25:54,960 --> 00:25:55,660 una excepción 643 00:25:55,660 --> 00:25:59,079 de las verificadas que se llaman, que son las que llaman 644 00:25:59,079 --> 00:26:01,180 de exception, no podemos 645 00:26:01,180 --> 00:26:03,119 llamarlo sin más. Tenemos 646 00:26:03,119 --> 00:26:05,039 que, además, o capturar 647 00:26:05,039 --> 00:26:07,099 o propagar hacia arriba. 648 00:26:10,460 --> 00:26:10,859 ¿Vale? 649 00:26:11,019 --> 00:26:13,059 Y si no capturamos, el método 650 00:26:13,059 --> 00:26:14,599 en el que estemos, hay que ponerle el throws. 651 00:26:14,859 --> 00:26:16,700 ¿Qué es el main? Pues el main. ¿Qué es otro? 652 00:26:16,779 --> 00:26:18,660 Porque yo puedo haber llamado a los altos desde otro método. 653 00:26:19,119 --> 00:26:20,539 Pues otro método tendrá el throws. 654 00:26:21,420 --> 00:26:23,180 Y ya cuando ya he puesto todos los throws, 655 00:26:23,259 --> 00:26:24,160 ya puedo ejecutar esto. 656 00:26:25,319 --> 00:26:25,960 Dime, ¿qué te...? 657 00:26:25,960 --> 00:26:34,089 Claro, que o capturabas 658 00:26:34,089 --> 00:26:35,970 o propagaba, si tenías que poner el throws arriba 659 00:26:35,970 --> 00:26:37,829 claro, pues era exactamente por esto, porque 660 00:26:37,829 --> 00:26:39,170 la IO exception 661 00:26:39,170 --> 00:26:41,549 hereda de exception directamente 662 00:26:41,549 --> 00:26:44,029 entonces una IO exception, cuando lees 663 00:26:44,029 --> 00:26:45,710 del teclado y te sale en IO exception 664 00:26:45,710 --> 00:26:48,150 o la metes en un try catch o pones el throws 665 00:26:48,150 --> 00:26:49,990 en el main, porque la 666 00:26:49,990 --> 00:26:51,190 IO exception es de esas 667 00:26:51,190 --> 00:26:53,910 la null pointer exception 668 00:26:53,910 --> 00:26:55,829 no, nos ha salido muchos 669 00:26:55,829 --> 00:26:58,210 null pointer exception y no hemos tenido que poner throws en el main 670 00:26:58,210 --> 00:27:00,150 ni nada, pero la IO exception 671 00:27:00,150 --> 00:27:00,529 sí 672 00:27:00,529 --> 00:27:03,769 bueno, pues ahora si probamos 673 00:27:03,769 --> 00:27:05,990 esto, yo para hacer el main 674 00:27:05,990 --> 00:27:07,910 bueno, he creado 675 00:27:07,910 --> 00:27:08,549 una fecha 676 00:27:08,549 --> 00:27:12,069 cualquiera, en su momento 677 00:27:12,069 --> 00:27:13,970 cuando hicimos fechas, pues dijimos que esta era una forma 678 00:27:13,970 --> 00:27:15,950 fácil, hacíamos un objeto 679 00:27:15,950 --> 00:27:16,450 format 680 00:27:16,450 --> 00:27:19,470 con el formato 681 00:27:19,470 --> 00:27:21,829 con el que queríamos meter la fecha, con el formato 682 00:27:21,829 --> 00:27:23,769 y ahora ya creamos 683 00:27:23,769 --> 00:27:24,730 el objeto fecha 684 00:27:24,730 --> 00:27:27,809 con el método parse 685 00:27:27,809 --> 00:27:29,750 de ese objeto formato, pues yo he creado aquí 686 00:27:29,750 --> 00:27:31,789 una fecha de dite de abril, he creado 687 00:27:31,789 --> 00:27:33,849 esta fecha. A su vez 688 00:27:33,849 --> 00:27:35,930 el método parse, a su vez el método 689 00:27:35,930 --> 00:27:37,769 parse, te puede 690 00:27:37,769 --> 00:27:39,670 lanzar la excepción parseException 691 00:27:39,670 --> 00:27:41,849 que hereda la excepción. 692 00:27:42,450 --> 00:27:44,190 Con lo cual, parseException 693 00:27:44,190 --> 00:27:45,869 me ha obligado o a capturarla 694 00:27:45,869 --> 00:27:47,990 o a propagarla. Es decir, 695 00:27:48,089 --> 00:27:49,750 cuando yo he escrito esto así sin más 696 00:27:49,750 --> 00:27:51,849 para intentar hacer la 697 00:27:51,849 --> 00:27:55,099 fecha, cuando he escrito esto 698 00:27:55,099 --> 00:27:57,220 así sin más, él me ha dicho 699 00:27:57,220 --> 00:27:59,200 ¡Ojo! El método al que 700 00:27:59,200 --> 00:28:01,200 estás llamando tiene un throw dentro 701 00:28:01,200 --> 00:28:03,440 de tipo parseException 702 00:28:03,440 --> 00:28:05,559 y es de tipo exception 703 00:28:05,559 --> 00:28:07,880 no runtimeException, con lo cual o la capturas 704 00:28:07,880 --> 00:28:08,759 o la propagas 705 00:28:08,759 --> 00:28:11,440 vamos a hacer el vago, que es propagarla 706 00:28:11,440 --> 00:28:12,900 para que el método sea más corto 707 00:28:12,900 --> 00:28:15,420 vamos a hacer el vago, pues yo pongo aquí 708 00:28:15,420 --> 00:28:17,220 throws y ala, aquí me apareció 709 00:28:17,220 --> 00:28:18,539 ¿veis? mi main ahora 710 00:28:18,539 --> 00:28:21,819 al throws pueden seguirle 200.000 excepciones 711 00:28:21,819 --> 00:28:23,799 las que uno quiera, a este le sigue 712 00:28:23,799 --> 00:28:26,339 esta mía, el parseException 713 00:28:26,339 --> 00:28:27,759 un mismo método 714 00:28:27,759 --> 00:28:29,200 puede hacer throws de un montón 715 00:28:29,200 --> 00:28:31,900 bueno, pues entonces 716 00:28:31,900 --> 00:28:34,240 ya tengo mi objeto fecha, este de aquí 717 00:28:34,240 --> 00:28:35,559 con 17 de abril 718 00:28:35,559 --> 00:28:37,000 y ahora llamo 719 00:28:37,000 --> 00:28:40,000 a mostrar datos, pasándole una factura 720 00:28:40,000 --> 00:28:41,180 del 17 de abril 721 00:28:41,180 --> 00:28:44,099 le vamos a pasar primero una 722 00:28:44,099 --> 00:28:46,299 que no es posterior a la actual, para ver si lo hace bien 723 00:28:46,299 --> 00:28:48,339 el 2 de abril no es posterior a la actual 724 00:28:48,339 --> 00:28:52,259 ejecutamos mostrar datos con fecha 725 00:28:52,259 --> 00:28:53,099 del 2 de abril 726 00:28:53,099 --> 00:28:55,960 y lo hace bien, me saca la factura 727 00:28:55,960 --> 00:28:57,740 imprimida 728 00:28:57,740 --> 00:29:00,299 Vamos a pasarle ahora una fecha posterior 729 00:29:00,299 --> 00:29:01,240 Al 17 de abril 730 00:29:01,240 --> 00:29:05,289 Pues efectivamente 731 00:29:05,289 --> 00:29:07,549 Como no he capturado la excepción 732 00:29:07,549 --> 00:29:10,130 La máquina virtual 733 00:29:10,130 --> 00:29:12,289 Ha hecho el print de estas 3 el solito 734 00:29:12,289 --> 00:29:14,049 Con el mensajito que yo le puse 735 00:29:14,049 --> 00:29:15,710 No es válida porque he puesto ya la actual 736 00:29:15,710 --> 00:29:17,309 Y ha parado el programa 737 00:29:17,309 --> 00:29:19,309 Y ha parado y ya está 738 00:29:19,309 --> 00:29:23,539 Yo podía haber optado por capturarla 739 00:29:23,539 --> 00:29:25,799 En lugar de poner el throws este de aquí 740 00:29:25,799 --> 00:29:29,259 Esto podía haber optado 741 00:29:29,259 --> 00:29:31,359 Por 742 00:29:31,359 --> 00:29:39,180 podía haber optado por 743 00:29:39,180 --> 00:29:40,500 capturarla 744 00:29:40,500 --> 00:29:42,599 haber hecho aquí un try catch 745 00:29:42,599 --> 00:29:45,690 y ahora 746 00:29:45,690 --> 00:29:48,549 por ejemplo, y aquí 747 00:29:48,549 --> 00:29:51,069 venga, en el caso de que tú intentas 748 00:29:51,069 --> 00:29:53,109 mostrar datos, que te sale 749 00:29:53,109 --> 00:29:54,809 la excepción fecha posterior 750 00:29:54,809 --> 00:29:57,049 actual, pues lo que tú quieras 751 00:29:57,049 --> 00:29:58,849 print estas tres o lo que te dé la gana 752 00:29:58,849 --> 00:30:04,140 puso mal la fecha 753 00:30:04,140 --> 00:30:05,140 o sea, las fechas 754 00:30:05,140 --> 00:30:10,700 posteriores no 755 00:30:10,700 --> 00:30:11,980 se imprimen 756 00:30:11,980 --> 00:30:14,740 lo que uno decide hacer en el catch 757 00:30:14,740 --> 00:30:17,059 y el programita seguiría 758 00:30:17,059 --> 00:30:19,339 no se pararía, en este caso no se pararía 759 00:30:19,339 --> 00:30:21,640 porque he hecho un try catch 760 00:30:21,640 --> 00:30:23,279 en el caso anterior se paraba 761 00:30:23,279 --> 00:30:25,140 aunque yo tuviera un adiós, se paraba 762 00:30:25,140 --> 00:30:27,180 entonces en este caso 763 00:30:27,180 --> 00:30:28,460 con el try catch 764 00:30:28,460 --> 00:30:31,480 va a saltar la excepción, va a hacer esto 765 00:30:31,480 --> 00:30:32,640 y va a seguir 766 00:30:32,640 --> 00:30:36,230 que es justo lo que ha hecho 767 00:30:36,230 --> 00:30:38,990 me ha dicho, lo siento, las fechas postidas 768 00:30:38,990 --> 00:30:40,750 no se imprimen, adiós 769 00:30:40,750 --> 00:30:43,150 pues mucho mejor así, capturado 770 00:30:43,150 --> 00:30:45,569 porque ya el usuario que está usando el programa 771 00:30:45,569 --> 00:30:47,329 pues le sale la información 772 00:30:47,329 --> 00:30:49,650 que él entiende, no lo rojo que él no entiende 773 00:30:49,650 --> 00:30:50,890 y el programa sigue 774 00:30:50,890 --> 00:30:54,309 ¿vale? 775 00:30:55,210 --> 00:30:57,150 pero repito, si estamos 776 00:30:57,150 --> 00:31:00,009 si todavía no hemos entregado el programa al usuario 777 00:31:00,009 --> 00:31:01,990 y estamos nosotros 778 00:31:01,990 --> 00:31:07,839 todavía depurándolo 779 00:31:07,839 --> 00:31:08,799 y trabajando con él 780 00:31:08,799 --> 00:31:11,019 pues esto lo dejaremos 781 00:31:11,019 --> 00:31:13,740 dejaremos el print extract trace 782 00:31:13,740 --> 00:31:15,759 porque el print extract trace 783 00:31:15,759 --> 00:31:17,440 nos saca toda la información 784 00:31:17,440 --> 00:31:18,980 de lo que ha pasado 785 00:31:18,980 --> 00:31:21,039 el print extract 3 nos saca todo 786 00:31:21,039 --> 00:31:22,240 si yo ejecuto esto 787 00:31:22,240 --> 00:31:25,059 pues efectivamente me saca 788 00:31:25,059 --> 00:31:27,140 el print extract 3 ese, que es todo esto 789 00:31:27,140 --> 00:31:29,119 luego además 790 00:31:29,119 --> 00:31:30,940 me ha sacado el system.out.println 791 00:31:30,940 --> 00:31:31,980 y luego el programa seguido 792 00:31:31,980 --> 00:31:34,180 vale 793 00:31:34,180 --> 00:31:42,559 bueno, pues más o menos esto es todo lo que nos interesa 794 00:31:42,559 --> 00:31:43,480 saber de excepciones 795 00:31:43,480 --> 00:31:45,500 y las excepciones obviamente se usan 796 00:31:45,500 --> 00:31:48,579 las aplicaciones tienen sus propias excepciones creadas 797 00:31:48,579 --> 00:31:50,099 para que 798 00:31:50,099 --> 00:31:52,240 los diferentes métodos avisen con excepciones 799 00:31:52,240 --> 00:31:53,920 de lo que ha pasado y el que usa 800 00:31:53,920 --> 00:31:56,079 esos métodos, pues decida 801 00:31:56,079 --> 00:31:58,000 qué hace, si los captura, si los 802 00:31:58,000 --> 00:31:59,980 propaga, es la forma de comunicarse, es 803 00:31:59,980 --> 00:32:01,480 una de las maneras de comunicarse entre sí 804 00:32:01,480 --> 00:32:04,119 los métodos, no sólo a través de los parámetros 805 00:32:04,119 --> 00:32:05,859 que se pasan en los métodos, 806 00:32:05,960 --> 00:32:08,059 los retornos que se devuelven, sino a través 807 00:32:08,059 --> 00:32:10,119 de excepciones que se van lanzando y que van avisando. 808 00:32:10,859 --> 00:32:11,519 ¿Vale? Eso por un lado. 809 00:32:12,460 --> 00:32:14,039 Y luego por otro lado, también 810 00:32:14,039 --> 00:32:15,920 tenemos que interpretar lo otro importante, las 811 00:32:15,920 --> 00:32:17,980 implicaciones de hacer un try-catch y no hacerlo. 812 00:32:18,680 --> 00:32:20,039 Claro. Entonces, los 813 00:32:20,039 --> 00:32:21,640 try-catch hacen los programas 814 00:32:21,640 --> 00:32:23,880 obviamente más robustos porque me permiten 815 00:32:23,880 --> 00:32:26,400 a mí que el programa no se pare, avisarle al usuario 816 00:32:26,400 --> 00:32:27,900 pero es 817 00:32:27,900 --> 00:32:29,980 el código que da más engorroso 818 00:32:29,980 --> 00:32:31,779 porque hay que irlo metiendo todo en try-catch 819 00:32:31,779 --> 00:32:32,359 que es un rollo 820 00:32:32,359 --> 00:32:36,079 y luego además cuidado con los try-catch 821 00:32:36,079 --> 00:32:38,140 porque abren un bloque de código 822 00:32:38,140 --> 00:32:40,039 cuidado, abren un bloque 823 00:32:40,039 --> 00:32:40,599 de código 824 00:32:40,599 --> 00:32:43,579 y todo lo que se declare aquí dentro 825 00:32:43,579 --> 00:32:46,039 solo es visible 826 00:32:46,039 --> 00:32:46,799 ahí dentro 827 00:32:46,799 --> 00:32:49,759 porque esto es un bloque de código 828 00:32:49,759 --> 00:32:51,720 entre llaves, si yo declaro aquí 829 00:32:51,720 --> 00:32:52,599 una variable n 830 00:32:52,599 --> 00:32:55,700 esta variable n 831 00:32:55,700 --> 00:32:59,039 solo es visible 832 00:32:59,039 --> 00:33:00,960 aquí dentro del try catch, si yo intento 833 00:33:00,960 --> 00:33:01,740 acceder aquí 834 00:33:01,740 --> 00:33:04,740 lógicamente no voy a poder, me va a decir 835 00:33:04,740 --> 00:33:06,900 oye n no existe, vale, o sea cuidado 836 00:33:06,900 --> 00:33:08,940 cuando hagáis try catch que todo lo que 837 00:33:08,940 --> 00:33:11,019 esté dentro lo habéis hecho 838 00:33:11,019 --> 00:33:12,660 automáticamente local 839 00:33:12,660 --> 00:33:14,960 a esas llaves, fuera no está 840 00:33:14,960 --> 00:33:16,839 que yo quiero que la n 841 00:33:16,839 --> 00:33:18,920 sea visible fuera, pues tendríamos 842 00:33:18,920 --> 00:33:20,819 que declararla aquí, aunque luego yo le diera valor 843 00:33:20,819 --> 00:33:21,420 aquí dentro 844 00:33:21,420 --> 00:33:24,460 aunque yo le diría valor aquí dentro, tendríamos que declararla ahí 845 00:33:24,460 --> 00:33:26,279 vale, entonces ya sí 846 00:33:26,279 --> 00:33:29,019 entonces cuidado con 847 00:33:29,019 --> 00:33:30,839 cuando hacéis un try-catch 848 00:33:30,839 --> 00:33:32,640 que las variables que estén declaradas dentro automáticamente 849 00:33:32,640 --> 00:33:33,819 se han quedado ahí encerradas 850 00:33:33,819 --> 00:33:38,079 vale, vale 851 00:33:38,079 --> 00:33:39,339 bueno, pues entonces 852 00:33:39,339 --> 00:33:40,779 del 853 00:33:40,779 --> 00:33:46,029 aula virtual, a ver 854 00:33:46,029 --> 00:33:47,190 vamos a 855 00:33:47,190 --> 00:33:50,349 hacer visible algunos ejercicios 856 00:33:51,069 --> 00:33:53,730 para que hagáis ya aquí al viernes 857 00:33:53,730 --> 00:33:55,349 Y luego ya el viernes hacemos más ejercicios 858 00:33:55,349 --> 00:33:57,250 De todo, más cosas y más rollos 859 00:33:57,250 --> 00:33:59,789 A ver, vamos a parar esto