2011-03-29 13 views
10

¿Cuál es la mejor práctica para inicializar una variable del método String (local) para evitar el error "Variable podría no haberse inicializado" en Java?¿Deben inicializarse las variables del método Java String (local) a null o ""?

Cadena s = null; o Cadena s = "";

¿Hace la diferencia? Si es así, ¿cuál es mejor y por qué?

He leído respuestas contradictorias en la web.

Gracias!

+0

Gracias por todas sus respuestas. Aquí hay más información ... Diseñé un método de servicio web que devuelve un String. Según ciertas condiciones, a esa cadena se le asigna un valor, pero no siempre. ¿Debo devolver nulo o "" cuando eso suceda? – Canam

Respuesta

14

Sí, hace la diferencia. Una es una referencia a una cadena vacía, una es una referencia nula. Ellos no son lo mismo.

Cual es mejor? Depende de si desea un valor nulo o una referencia a una cadena vacía ... se comportan de manera diferente, así que elija la que se comporte de la manera que desee.

Rara vez necesito asignarle un valor "ficticio" a una variable, generalmente solo inicializando la variable en el momento de la declaración con el verdadero valor que quiero está bien. Si nos puede dar más contexto, podemos ayudarlo a estructurar mejor su código para que esto no sea un problema para usted.

+0

¿Sería capaz de proporcionar una situación en la que cada uno de ellos sería ventajoso? Obtuve de las otras respuestas inicializando con '" "' ayuda a evitar NPE, pero también puede provocar errores no detectados. – Abdul

1

Todo depende de lo que quiera que haga su programa. A veces puede ser útil para ver si una cadena ya se ha establecido o no en la que null sería lo mejor. Otras veces quiere evitar NullPointers lo que hace que "" sea mejor.

0

Realmente depende de lo que esté haciendo en su programa.

"" (cadena vacía) está conectado solo con String y es más seguro que nulo. Cuando llama a métodos de clase String por ejemplo: replaceAll(), indexOf() el programa funcionará correctamente pero cuando tiene nulo, tiene NullPointerException todo el tiempo cuando está llamando al método.

Considere si el valor de cadena vacía en su aplicación no es algo malo para usted, entonces elija str = "".

Observe que muy a menudo es mejor cuando se lanza NullPointerException porque conocemos un estado no válido en nuestra aplicación, por lo tanto, cuando desee saber sobre este conjunto, String null por defecto.

+1

La inicialización de la cadena a "" podría ser una receta para hacer que los errores sean más difíciles de encontrar más adelante. Todo depende del contexto subyacente. –

+0

No creo que sea una regla. Realmente depende de la situación y el aviso de que tenemos StringUtils.isEmpty que devuelve verdadero para "" y nula – smas

0

Prefiero inicializar una Cadena en Java como "", simplemente porque trato de evitar los punteros nulos. Los punteros nulos agregan una gran cantidad de sobrecarga que se puede eliminar asignando "" en lugar de nulo.

+3

La inicialización de cadena a "" podría ser una receta para hacer que los errores sean más difíciles de encontrar más adelante. Todo depende del contexto subyacente. –

+2

Si obtiene un NPE porque eligió nulo como el valor predeterminado de un String, significa que olvidó manejar el caso predeterminado en su código o que lo manejó incorrectamente. Si lo configura en una cadena vacía, simplemente ocultará el error o lo hará aparecer más tarde, donde será más difícil de diagnosticar, IMO. –

2

La mejor práctica es hacer tantos campos como sea posible o usar valores predeterminados para evitar que los clientes creen instancias de objetos defectuosos o incompletos. Si tiene sentido que el campo sea una cadena vacía por defecto (es decir, no correrá el riesgo de errores lógicos), hágalo de esa manera. De lo contrario, al menos nulo lanzará una excepción cuando un cliente invoca un método en un objeto que no se ha instanciado correctamente.

Por lo tanto, trate de forzar al código del cliente a crear objetos completos durante la construcción. Si no sabe cuál es la cadena en el momento de la construcción, pídales que la pasen como parámetro. Si la cadena solo se utiliza para la lógica interna, puede ser mejor como una variable o parámetro local, y en ese caso generalmente prefiero nulo a "" porque == null es más explícito que isEmpty().

0

La mayoría de las veces yo diría: no inicialice su variable local al declararla, si sería un valor ficticio como "" o null. Ingrese el valor real, o espere hasta que pueda ponerlo.

El compilador se asegurará de que haya al menos una asignación antes de cualquier uso posible de la variable. Solo en los raros casos en que el compilador no es lo suficientemente inteligente como para resolverlo (ya que necesita información que no está localmente disponible), yo usaría alguna inicialización, y generalmente null es mejor ya que se muestra con una NullPointerException cuando estaba equivocado . (Podría agregar un assert s != null después del punto en el que creo que se debe realizar la inicialización para aplicar esto.)

Cuestiones relacionadas