name: portada class: portada-slide, center, middle # Excepcions .footnote[Joan Puigcerver Ibáñez] --- layout: true class: regular-slide .right[.logo[]] --- # Excepcions intro - Que passa si al següent programa l'usuari introdueix "hola" a la consola? ``` Scanner scanner = new Scanner(System.in); int value = scanner.nextInt(); System.out.println(value); ``` --- # Excepcions intro - El codi _scanner.nextInt();_ llança una excepció quan no pot llegir un enter - InputMismatchException - RuntimeException ``` Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) (...) ``` --- # Controlar exepció - try catch - Podem controlar les excepcions amb un try-catch ``` Scanner scanner = new Scanner(System.in); try { int value = scanner.nextInt(); System.out.println(value); } catch(InputMismatchException inputMismatchException){ System.out.println("Not an Integer"); } ``` --- # Tipus d'excepcions - Runtime - Checked exception - Error --- # Tipus d'excepcions ### Runtime - Internes a l'aplicació - Dificil de recuperar-se de l'error. - Acosumen a ser causats per errors de programació o lògica. - __Controlar l'excepeció és opcional__ - Exemple - Convertir un string a int - Accés a una posició inexitent d'un array --- # Tipus d'excepcions ### Checked exception - Internes a l'aplicació - Es pot anticipar o recuperar-se de l'error. - __Controlar l'excepeció és obligatori__ - Exemple: - Obrir un fitxer inexistent --- # Tipus d'excepcions ### Error - Condicions excpecionals externes a l'aplicació. - __No es pot controlar__ - Exemple: - Error de hardware --- # Checked Excepcion - El següent mètode crea un fitxer: ``` Files.createFile(Paths.get("/home/user/file.txt")); ``` - Si el copiem en una classe java ens dona un error de compilació. - Aquest mètode indica que pot llençar una exepció. --- # Checked Exepction - Tenim dues opcions 1. Control·lar l'excepció (try catch) 2. Propagar-la --- # Control·lar excepció ``` try { Files.createFile(Paths.get("/home/user/file.txt")); } catch (IOException e) { // imrimeix informació de l'error e.printStackTrace(); } ``` --- # Propagar l'excepció - Indicar que la funció actual pot llençar (throw) una excepció - Paraula clau throws i nom de l'excepció. ``` public static void someFunction() throws IOException { Files.createFile(Paths.get("/home/user/file.txt")); } ``` --- # Propagar l'excepció - Al propagar-la, les crides a la funció hauran de controlar-la o propagar-la. - El main pot llençar excepcions. ``` public static void propagatedCheckedException() throws IOException { Files.createFile(Paths.get("/home/user/file.txt")); } public static void main(String[] args) throws IOException { propagatedCheckedException(); } ``` --- # Exericicis - [Exercici WaitForInt](exercicis/01_exercicis_paths.html#waitforint)