¿Qué es nulo en Java?

Resuelto unj2 asked hace 14 años • 14 respuestas

Qué es null?

¿ Es nulluna instancia de algo?

¿A qué conjunto nullpertenece?

¿Cómo se representa en la memoria?

unj2 avatar Apr 25 '10 12:04 unj2
Aceptado

¿Es nulo una instancia de algo?

No, no existe ningún tipo que nullsea instanceof.

15.20.2 Operador de comparación de tiposinstanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

En tiempo de ejecución, el resultado del instanceofoperador es truesi el valor de RelationalExpression no lo es nully la referencia podría convertirse en ReferenceType sin generar un archivo ClassCastException. De lo contrario el resultado es false.

Esto significa que para cualquier tipo Ey R, para cualquier E o, donde o == null, o instanceof Rsiempre es false.


¿A qué conjunto pertenece 'nulo'?

JLS 4.1 Los tipos de tipos y valores

También hay un tipo nulo especial , el tipo de expresión null, que no tiene nombre. Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable de tipo nulo o convertirla al tipo nulo . La nullreferencia es el único valor posible de una expresión de tipo nulo . La nullreferencia siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que nulles simplemente un literal especial que puede ser de cualquier tipo de referencia.


¿Qué es nulo?

Como dice la cita anterior de JLS, en la práctica simplemente puedes pretender que es "simplemente un literal especial que puede ser de cualquier tipo de referencia".

En Java null == null(este no es siempre el caso en otros lenguajes). Tenga en cuenta también que por contrato, también tiene esta propiedad especial (de java.lang.Object):

public boolean equals(Object obj)

Para cualquier nullvalor no referencial x, x.equals(null)debería return false.

También es el valor predeterminado (para las variables que los tienen) para todos los tipos de referencia:

JLS 4.12.5 Valores iniciales de variables

  • Cada variable de clase, variable de instancia o componente de matriz se inicializa con un valor predeterminado cuando se crea:
    • Para todos los tipos de referencia, el valor predeterminado es null.

La forma en que se usa varía. Puede usarlo para habilitar lo que se llama inicialización diferida de campos, donde un campo tendría su valor inicial de nullhasta que realmente se use, donde se reemplaza por el valor "real" (que puede ser costoso de calcular).

También hay otros usos. Tomemos un ejemplo real de java.lang.System:

public static Console console()

Devuelve : La consola del sistema, si la hay, en caso contrario null.

Este es un patrón de uso muy común: nullse usa para denotar la inexistencia de un objeto.

Aquí hay otro ejemplo de uso, esta vez de java.io.BufferedReader:

public String readLine() throws IOException

Devuelve : A Stringque contiene el contenido de la línea, sin incluir ningún carácter de terminación de línea, o nullsi se ha llegado al final de la secuencia.

Entonces aquí, readLine()regresaría instanceof Stringpara cada línea, hasta que finalmente devuelva a nullpara indicar el final. Esto le permite procesar cada línea de la siguiente manera:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

Se puede diseñar la API para que la condición de terminación no dependa del readLine()return null, pero se puede ver que este diseño tiene la ventaja de hacer las cosas concisas. Tenga en cuenta que no hay ningún problema con las líneas vacías, porque una línea vacía "" != null.

Tomemos otro ejemplo, esta vez de java.util.Map<K,V>:

V get(Object key)

Devuelve el valor al que está asignada la clave especificada, o nullsi esta asignación no contiene ninguna asignación para la clave.

Si este mapa permite nullvalores, entonces un valor de retorno de nullno necesariamente indica que el mapa no contiene ningún mapeo para la clave; También es posible que el mapa asigne explícitamente la clave a null. La containsKeyoperación puede utilizarse para distinguir estos dos casos.

Aquí empezamos a ver cómo el uso nullpuede complicar las cosas. La primera declaración dice que si la clave no está asignada, nullse devuelve. La segunda declaración dice que incluso si la clave está asignada, tambiénnull se puede devolver.

Por el contrario, java.util.Hashtablesimplifica las cosas al no permitir nullclaves ni valores; V get(Object key)Si devuelve , nullsignifica inequívocamente que la clave no está asignada.

Puede leer el resto de las API y encontrar dónde y cómo nullse utilizan. Tenga en cuenta que no siempre son los ejemplos de mejores prácticas .

En términos generales, nullse utilizan como valor especial para significar:

  • Estado no inicializado
  • Condición de terminación
  • Objeto inexistente
  • Un valor desconocido

¿Cómo se representa en la memoria?

¿En Java? Nada de tu incumbencia. Y es mejor mantenerlo así.


¿ Es nullalgo bueno?

Esto ahora es casi subjetivo. Algunas personas dicen que eso nullcausa muchos errores de programador que podrían haberse evitado. Algunos dicen que en un lenguaje que funciona NullPointerExceptioncomo Java, es bueno usarlo porque fallará rápidamente en los errores del programador. Algunas personas lo evitan nullutilizando el patrón de objeto nulo , etc.

Este es un tema enorme en sí mismo, por lo que es mejor discutirlo como respuesta a otra pregunta.

Terminaré esto con una cita de su inventor null, CAR Hoare (de fama rápida):

Yo lo llamo mi error de mil millones de dólares. Fue la invención de la nullreferencia en 1965. En ese momento, estaba diseñando el primer sistema de tipos completo para referencias en un lenguaje orientado a objetos (ALGOL W). Mi objetivo era garantizar que todo uso de referencias fuera absolutamente seguro, y que el compilador realizara la verificación automáticamente. Pero no pude resistir la tentación de incluir una nullreferencia, simplemente porque era muy fácil de implementar. Esto ha dado lugar a innumerables errores, vulnerabilidades y caídas del sistema, que probablemente han causado mil millones de dólares en dolores y daños en los últimos cuarenta años.

El vídeo de esta presentación va más allá; Es un reloj recomendado.

polygenelubricants avatar Apr 25 '2010 06:04 polygenelubricants

¿Es nulo una instancia de algo?

No. Por eso null instanceof Xregresará falsepara todas las clases X. (No se deje engañar por el hecho de que puede asignar nulluna variable cuyo tipo sea un tipo de objeto. Estrictamente hablando, la asignación implica una conversión de tipo implícita; consulte a continuación).

¿A qué conjunto pertenece 'nulo'?

Es el único miembro del tipo nulo, donde el tipo nulo se define de la siguiente manera:

"También hay un tipo nulo especial, el tipo de la expresión nulo, que no tiene nombre. Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertirla al tipo nulo. El tipo nulo La referencia es el único valor posible de una expresión de tipo nulo. La referencia nula siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que nulo es simplemente un literal especial que puede ser de cualquier tipo. tipo de referencia." JLS 4.1

¿Qué es nulo?

Véase más arriba. En algunos contextos, nullse utiliza para indicar "ningún objeto", "desconocido" o "no disponible", pero estos significados son específicos de la aplicación.

¿Cómo se representa en la memoria?

Esto es específico de la implementación y no podrá ver la representación nullen un programa Java puro. (Pero nullse representa como una dirección/puntero de máquina cero en la mayoría, si no en todas, las implementaciones de Java).

Stephen C avatar Apr 25 '2010 06:04 Stephen C

No, no es la instancia de nada, la instancia de siempre será falsa.

Tom avatar Apr 25 '2010 06:04 Tom

Nulo en Java (tm)

En C y C++, "NULL" es una constante definida en un archivo de encabezado, con un valor como:

    0

o:

    0L

o:

    ((void*)0)

dependiendo de las opciones del compilador y del modelo de memoria. NULL no es, estrictamente hablando, parte del propio C/C++.

En Java(tm), "nulo" no es una palabra clave, sino un literal especial de tipo nulo. Se puede convertir a cualquier tipo de referencia, pero no a ningún tipo primitivo como int o boolean. El literal nulo no necesariamente tiene valor cero. Y es imposible convertir al tipo nulo o declarar una variable de este tipo.

p27 avatar May 06 '2011 07:05 p27