try excepciones example custom catch java file-io stream try-catch finally

excepciones - try catch finally java example



java try finally block para cerrar la transmisiĆ³n (7)

Parece un poco torpe.

Es. Al menos la prueba de java7 con recursos corrige eso.

Pre java7 puedes hacer una función closeStream que se lo traga:

public void closeStream(Closeable s){ try{ if(s!=null)s.close(); }catch(IOException e){ //Log or rethrow as unchecked (like RuntimException) ;) } }

O pon el intento ... finalmente dentro del try catch:

try{ BufferedReader r = new BufferedReader(new InputStreamReader(address.openStream())); try{ String inLine; while ((inLine = r.readLine()) != null) { System.out.println(inLine); } }finally{ r.close(); } }catch(IOException e){ e.printStackTrace(); }

Es más detallado y una excepción en el final lo ocultará en el intento, pero semánticamente está más cerca del try-with-resources introducido en Java 7.

Quiero cerrar mi secuencia en el bloque finally, pero arroja una IOException así que parece que tengo que anidar otro bloque de try en mi bloque finally para cerrar la secuencia. ¿Es esa la forma correcta de hacerlo? Parece un poco torpe.

Aquí está el código:

public void read() { try { r = new BufferedReader(new InputStreamReader(address.openStream())); String inLine; while ((inLine = r.readLine()) != null) { System.out.println(inLine); } } catch (IOException readException) { readException.printStackTrace(); } finally { try { if (r!=null) r.close(); } catch (Exception e){ e.printStackTrace(); } } }


Además, si está utilizando Java 7, puede usar una try-with-resources :

try(BufferedReader r = new BufferedReader(new InputStreamReader(address.openStream()))) { String inLine; while ((inLine = r.readLine()) != null) { System.out.println(inLine); } } catch(IOException readException) { readException.printStackTrace(); }


Al igual que la respuesta que menciona la biblioteca Commons IO, Google Guava Libraries tiene un método de ayuda similar para las cosas que son java.io.Closeable. La clase es com.google.common.io.Closeables . La función que está buscando se llama de forma similar como Commons IO: closeQuietly ().

O bien, puede hacer su propio para cerrar un grupo como este: Closeables.close (closeable1, closeable2, closeable3, ...):

import java.io.Closeable; import java.util.HashMap; import java.util.Map; public class Closeables { public Map<Closeable, Exception> close(Closeable... closeables) { HashMap<Closeable, Exception> exceptions = null; for (Closeable closeable : closeables) { try { if(closeable != null) closeable.close(); } catch (Exception e) { if (exceptions == null) { exceptions = new HashMap<Closeable, Exception>(); } exceptions.put(closeable, e); } } return exceptions; } }

Y eso incluso devuelve un mapa de las excepciones que fueron lanzadas o nulas si no lo fueron.


En Java 7 puedes hacer esto ...

try (BufferedReader r = new BufferedReader(...)){ String inLine; while ((inLine = r.readLine()) != null) { System.out.println(inLine); } } catch(IOException e) { //handle exception }

  • Declarar una variable en el bloque try requiere que implemente AutoCloseable .
  • Declarar una variable en el bloque try también limita su alcance al bloque try.
  • Cualquier variable declarada en el bloque try tendrá automáticamente close() invocado cuando exista el bloque try.

Se llama declaración Try with resources .


Sí, es torpe, feo y confuso. Una posible solución es usar Commons IO que ofrece un método closeQuietly .

Hay una serie de preguntas en la columna "Relacionadas" a la derecha de esta página que en realidad son duplicados, le aconsejo que busque otras maneras de tratar este tema.


Su enfoque dentro de finalmente es correcto. Si el código que usted llama en un bloque finally puede arrojar una excepción, asegúrese de manejarlo o registrarlo. Nunca dejes que salga burbujeante del bloque final.

Dentro del bloque catch estás tragando la excepción, lo cual no es correcto.

Gracias...


public void enumerateBar() throws SQLException { Statement statement = null; ResultSet resultSet = null; Connection connection = getConnection(); try { statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT * FROM Bar"); // Use resultSet } finally { try { if (resultSet != null) resultSet.close(); } finally { try { if (statement != null) statement.close(); } finally { connection.close(); } } } } private Connection getConnection() { return null; }

source . Esta muestra fue útil para mí.