Tengo una variable que no debe cambiar su valor después de que se ha inicializado, por lo que quiero definirlo como una variable final.java: cómo declarar final una variable que se inicializa dentro de un bloque try - catch?
el problema es que la variable tiene que ser inicializado dentro de un bloque try, por lo que obtener los siguientes problemas:
tengo el siguiente código:
Connection conn = null;
try {
conn = getConn(prefix);
[...do some stuff with conn...]
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
} finally {
closeConnection(conn);
}
Si declaro la variabale como definitiva , sin inicializarlo a nulo, obtengo un 'Conn de la variable local puede no haberse inicializado' en el bloque finally. Por otro lado, si declaro que es definitivo y lo inicializo en nulo, aparece el error 'La connotación de la variable local final no se puede asignar' en el bloque try.
EDIT: después de recibir respuesta LXX, me encontré con esta versión
try {
final Connection conn = conn = getConn(prefix);
try {
return selectAll(conn, sql, params);
} catch (Exception e) {
throw new DbHelperException("error executing query", e);
} finally {
closeConnection(conn);
}
} catch (Exception e) {
throw new DbHelperException("error opening connection", e);
}
Así que esta debe ser la manera de hacerlo?
-
lección aprendida:
Creo que la respuesta correcta a la pregunta es la que LXX dio, pero en este caso supongo que los contras de la declaración de las outweights finales variables Es beneficios ...
-
EDIT: encontrado dos preguntas sobre desbordamiento de pila sobre el momento de uso final
When should one use final for method parameters and local variables?
Using "final" modifier whenever applicable in java
¿Qué tal anexar 'final Connection finalConn = conn;' a su código? – biziclop
¿Por qué necesita ambos 'try's? ¿Por qué no tener solo un solo try-catch en el que obtienes la conexión y la utilizas para seleccionar todo? – yshavit
Me pregunto por qué crees que es tan importante declarar esto como definitivo. A mí me parece un poco tonto y naggy. Si yo fuera un usuario, y llamé a su método para obtener una conexión, no veo ningún motivo por el que desee suprimir eso al cambiarlo. Y si lo hiciera, argumentaría que las consecuencias deberían estar en el usuario. – duffymo