No, es una mala práctica. OMI, incluso debería considerar hacer la variable final
.
El manejo de recursos se debe manejar de la manera estándar acquire(); try { use(); } finally { release(); }
. En este caso:
final Reader rawIn = new FileReader("myfile.txt"); // Character encoding??
try {
BufferedReader in = new BufferedReader(rawIn);
// code
} finally {
rawIn.close();
}
En realidad, este código selecciona la codificación de caracteres que está configurada por defecto. Sugiero ser explícito con un conjunto de caracteres codificados o con Parameterise from Above.
final InputStream rawIn = new FileInputStream("myfile.txt");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(rawIn, "UTF-8")
);
// code
} finally {
rawIn.close();
}
No debe crear los flujos de envoltura/lectores de fuera del bloque try (y antes de la asignación de recursos), ya que podría lanzar. Del mismo modo, su cierre podría arrojar (esto fue en realidad un error en BufferedOutputStream
que podría lanzar en flush
). Algunas secuencias de entrada pueden tener otros recursos, por lo que necesita dos try { ... finally { x.close(); }
s.
Para la salida, generalmente debe flush
en el curso normal de los eventos. Pero generalmente no en casos excepcionales. De hecho close
generalmente hace un flush
, por lo tanto, no debe cerrarlos en el caso excepcional. Si decoradores ambos flush
y tienen recursos, entonces tendrá que sonreír y mostrarlo.
Hay ocasiones muy infrecuentes en que anular es una buena idea. Por ejemplo, si una variable es la única referencia a un objeto grande y va a crear un nuevo objeto grande para asignarle, puede ser mejor borrar la referencia para permitir que se recupere la antigua antes de asignar la nueva.
@Hei: Bienvenido a SO. Solo para el futuro (y si edita esta pregunta), puede sangrar líneas de código con cuatro espacios y se mostrarán en bloques de códigos especiales, lo que hace que sean más fáciles de leer. – Pops
Gracias por el comentario lo investigaré para futuras preguntas. – Hei