Xestión de erros e excepcións enfocada o uso de ficheiros
Sumario
Xestión de erros e excepcións
Non debe ser o tratamento de excepcións o tema central das explicacións para a xestión de ficheiros. Con todo, xa que o seu tratamento será preciso, faremos unha breve exposición simplificada das diversas posilibadaes para capturas os erros.
try-catch
O código que manipule ficheiros poderá ter a seguinte estrutura
1 try{
2 //Código que abre e trata o ficheiro
3 } catch (IOException ex){
4 //Código que trata o erro
5 }
https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
throws
Se no canto de tratar o erro nos queremos indicar que o noso método pode lanzar excepcións:
1 public int methodThatCanThrow(params) throws IOException{
2 //Código que trata ficheiros pero non atrapa IOException
3 }
finally
O bloque finally contén código importante que será executado indistintamente de que salte unha excepción ou non. No caso de ficheiros, será habitual incluir neste bloque o peche do stream, para asegurar que todas os ficheiros abertos son pechados apropiadamente; e así, os datos dos ficheiros non se poderán corromper.
1 import java.io.*;
2 public class SimpleExceptionHandling {
3 public static void main(String[] args) {
4 FileInputStream fileInputStream = null;
5 try {
6 fileInputStream = new FileInputStream("C:\\UnFicheiroTemporal");
7
8 } catch (FileNotFoundException e) {
9 System.out.println("Aconteceu a excepción :: " + e.getMessage());
10 System.out.println("Necesitamos pechar FileStream!");
11 } finally {
12 System.out.println("Afortunadamente pecharase neste bloque");
13 try {
14 if (fileInputStream != null) {
15 fileInputStream.close();
16 }
17 } catch (IOException e) {
18 }
19 }
20 }
21 }
Saída:
Aconteceu a expeción :: C:\UnFicheiroTemporal (The system cannot find the file specified) Necesitamos pechar FileStream! Afortunadamente pecharase neste bloque
E importante remarcar que o finally tamén se executaría no caso de non terse producida a excepción.
https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html https://www.geeksforgeeks.org/why-you-need-to-close-the-java-streams-in-finally-block/
try-with-resources
Mecanismo que automáticamente pecha recursos (pode ser máis de un) cando se acabou o seu traballo con eles.
Por exemplo:
1 private static void printFile() throws IOException {
2
3 try(FileInputStream input = new FileInputStream("ficheiro.txt")) {
4
5 int data = input.read();
6 while(data != -1){
7 System.out.print((char) data);
8 data = input.read();
9 }
10 }
11 }
Neste exemplo ábrese un FileInputStream dentro dun bloque a try-with-resources block, lee datos do FileInputStream, e pechao automaticamente cando a execución sae do bloque. Isto último e posible porque FileInputStream implementa a interface java.lang.AutoCloseable.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html http://tutorials.jenkov.com/java-exception-handling/try-with-resources.html
Exercicios
Exercicio para adaptar código para a xestión correcta de recursos e excepcións.
- Un apartado →https://jesusfernandeztoledo.com/ejercicios-resueltos-ficheros-en-java/
- Otro apartado de adaptar un código que quieras a try -with-resources
- Y último: pag 27 sin excepciones y que se pongan. Sol→ https://www.unirioja.es/cu/jearansa/0910/archivos/EIPR_Tema05.pdf