Xestión de erros e excepcións enfocada o uso de ficheiros

De MediaWiki
Ir a la navegación Ir a la búsqueda

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: <syntaxhighlight lang="java" line enclose="div" highlight="" >

public int methodThatCanThrow(params) throws IOException{
//Código que trata ficheiros pero non atrapa IOException
}

<syntaxhighlight>

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.

<syntaxhighlight lang="java" line enclose="div" highlight="" > import java.io.*;

public class SimpleExceptionHandling {

public static void main(String[] args) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream("C:\\UnFicheiroTemporal");

} catch (FileNotFoundException e) { System.out.println("Aconteceu a excepción :: " + e.getMessage()); System.out.println("Necesitamos pechar FileStream!"); } finally { System.out.println("Afortunadamente pecharase neste bloque"); try { if (fileInputStream != null) { fileInputStream.close(); } } catch (IOException e) { } } }

}

<syntaxhighlight>

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: <syntaxhighlight lang="java" line enclose="div" highlight="" >

private static void printFile() throws IOException {
   try(FileInputStream input = new FileInputStream("ficheiro.txt")) {
       int data = input.read();
       while(data != -1){
           System.out.print((char) data);
           data = input.read();
       }
   }
}

<syntaxhighlight>

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