Soy un novato de Java y me preguntaba, si tengo el siguiente código Java típicaEn Java, ¿se garantiza que se llamará el bloque "finalmente" (en el método principal)?
public class MyApp {
public static void main(String[] args) {
try {
// do stuff
} catch {
// handle errors
} finally {
// clean up connections etc.
}
}
}
no la JVM garantía de que el bloque finally siempre se ejecute? Para entender de dónde vengo, estoy acostumbrado a los programas C/C++ que podrían colapsar si desreferencia un puntero NULL y no puede tener ningún código para ejecutar después de eso.
Pero como entiendo Java y el negocio de la memoria entera GC/logrado, en general, no hay tal cosa como una desreferencia de puntero nulo, todo es un expection capturable, por lo que no hay realmente una manera para que mi programa se bloquee que podría hacer se salta el final, o está allí? Por ejemplo, en Python, generalmente hago
try:
# do stuff
except AnExceptionIKnewMightHappen:
# react in an appropriate way
except:
# log that weird error I had not known could happen
y nunca he tenido ninguna aplicación muerta sin pasar por mi código.
Por supuesto, si el sistema operativo por alguna razón mata el proceso (o si algo mata a todo el sistema, como desconectar el enchufe) no hay mucho que Java pueda hacer. Además, desde PHP conozco los errores no detectables contra los que no puedes protegerte, incluso si el intérprete todavía estaba allí después de que sucedió (al menos es capaz de emitir un mensaje adecuado).
Editar: Sólo por la claridad (no fue realmente mal entendido por cualquier persona), permítanme añadir que yo estaba buscando cosas dentro de mi código que podrían conducir a la que está siendo desviado por último. Así que apuntar a System.exit fue un recordatorio útil, aunque no puedo ver por qué me gustaría hacer algo así.
La salida de JVM es una forma bastante obvia y lo consideraría una causa externa. La nota que indica que también debes recordar la posibilidad de que los hilos salgan mientras la JVM y la aplicación siguen funcionando fue muy útil, porque aunque ahora también me parece obvio, no había pensado en ello.
Gee, eso fue respuestas rápidas. Obviamente una pregunta muy novato. ¡Gracias de cualquier manera! –
La respuesta es no, consulte los detalles aquí: http://tshikatshikaaa.blogspot.nl/2012/07/about-using-systemexit-in-try-catch.html – JVerstry