validar vacio solucion que objeto grave java null terminology

java - vacio - nullpointerexception que es



¿Qué es nulo en Java? (14)

¿Qué es null ?

¿Es null una instancia de algo?

¿A qué conjunto pertenece el null ?

¿Cómo se representa en la memoria?


¿Es nulo una instancia de algo?

No, no hay ningún tipo que null sea ​​una instanceof .

15.20.2 Operador de comparación de tipos

RelationalExpression: RelationalExpression instanceof ReferenceType

En el tiempo de ejecución, el resultado del operador instanceof es true si el valor de RelationalExpression no es null y la referencia podría convertirse en el ReferenceType sin generar una ClassCastException . De lo contrario el resultado es false .

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

¿A qué conjunto pertenece ''null''?

JLS 4.1 Los tipos de tipos y valores

También hay un tipo nulo especial, el tipo de la expresión null , que no tiene nombre. Debido a que el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertir al tipo nulo . La referencia null es el único valor posible de una expresión de tipo nulo . La referencia null siempre se puede convertir a cualquier tipo de referencia. En la práctica, el programador puede ignorar el tipo nulo y simplemente pretender que null es 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 puede pretender que es "simplemente un literal especial que puede ser de cualquier tipo de referencia".

En Java, null == null (esto no es siempre el caso en otros idiomas). 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 valor de referencia que no sea null x , x.equals(null) debe return false .

También es el valor predeterminado (para las variables que las 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 .

Cómo se utiliza esto varía. Puede usarlo para habilitar lo que se denomina inicialización perezosa de campos, donde un campo tendría su valor inicial de null hasta que realmente se use, donde se reemplaza por el valor "real" (que puede ser costoso calcularlo).

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

public static Console console()

Devoluciones : La consola del sistema, en su caso, de lo contrario null .

Este es un patrón de uso muy común: null se utiliza para denotar la no existencia de un objeto.

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

public String readLine() throws IOException

Devoluciones : una String contiene el contenido de la línea, sin incluir los caracteres de terminación de línea, o null si se ha llegado al final de la secuencia.

Así que aquí, readLine() devolvería instanceof String para cada línea, hasta que finalmente devuelva un null para indicar el final. Esto le permite procesar cada línea de la siguiente manera:

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

Uno puede diseñar la API de modo que la condición de terminación no dependa de que readLine() devuelva null , pero se puede ver que este diseño tiene la ventaja de hacer que las cosas sean concisas. Tenga en cuenta que no hay 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 se asigna la clave especificada, o null si este mapa no contiene ninguna asignación para la clave.

Si este mapa permite valores null , entonces un valor de retorno null no necesariamente indica que el mapa no contiene ningún mapa para la clave; También es posible que el mapa asigne explícitamente la clave a null . Se puede utilizar la operacióneptKey para distinguir estos dos casos.

Aquí empezamos a ver cómo usar null puede complicar las cosas. La primera declaración dice que si la clave no está asignada, se devuelve null . La segunda declaración dice que incluso si la clave está asignada, también puede devolverse null .

En contraste, java.util.Hashtable simplifica las cosas al no permitir claves y valores null ; su V get(Object key) , si devuelve un null , significa inequívocamente que la clave no está asignada.

Puede leer el resto de las API y encontrar dónde y cómo se utiliza el null . Tenga en cuenta que no siempre son los mejores ejemplos de práctica .

En términos generales, los valores null se utilizan como un valor especial para indicar:

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

¿Cómo se representa en la memoria?

En java? Nada de tu incumbencia. Y es mejor que se mantenga de esa manera.

¿Es null algo bueno?

Esto es ahora subjetivo límite. Algunas personas dicen que null causa muchos errores de programación que podrían haberse evitado. Algunos dicen que en un lenguaje que atrapa NullPointerException como Java, es bueno usarlo porque fallará rápidamente en los errores de programador. Algunas personas evitan el null utilizando un patrón de objeto nulo , etc.

Este es un gran tema por sí solo, por lo que es mejor discutirlo como respuesta a otra pregunta.

Terminaré esto con una cita del inventor de null , CAR Hoare (de fama de quicksort):

Yo lo llamo mi error de mil millones de dólares. Fue la invención de la referencia null 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, con la verificación realizada automáticamente por el compilador. Pero no pude resistir la tentación de poner una referencia null , simplemente porque era muy fácil de implementar. Esto ha llevado a innumerables errores, vulnerabilidades y fallas en el sistema, que probablemente hayan causado un dolor y un daño de mil millones de dólares en los últimos cuarenta años.

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


¿Es nulo una instancia de algo?

No. Es por eso que null instanceof X devolverá false para todas las clases X (No se deje engañar por el hecho de que puede asignar un null a una variable cuyo tipo es 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 ''null''?

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 null, que no tiene nombre. Dado que el tipo nulo no tiene nombre, es imposible declarar una variable del tipo nulo o convertir al tipo nulo. El 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, null se usa para denotar "ningún objeto" o "desconocido" o "no disponible", pero estos significados son específicos de la aplicación.

¿Cómo se representa en la memoria?

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


En mi opinión, una forma interesante de ver nulos en java es verlo como algo que NO denota una ausencia de información, sino simplemente como un valor literal que se puede asignar a una referencia de cualquier tipo. Si lo piensa si denota la ausencia de información, entonces a1 == a2 para ser verdad no tiene sentido (en caso de que a ambos se les haya asignado un valor de nulo) ya que realmente podrían estar apuntando a CUALQUIER objeto (simplemente no sé a qué objetos deberían estar apuntando) ... Por cierto null == null devuelve true en java. Si java, por ejemplo, sería como SQL: 1999, entonces null == null devolvería un valor desconocido (un valor booleano en SQL: 1999 puede tomar tres valores: verdadero, falso y desconocido, pero en la práctica desconocido se implementa como nulo en sistemas reales) ... http://en.wikipedia.org/wiki/SQL


Hay dos categorías principales de tipos en Java: primitivo y de referencia . Variables declaradas de un tipo primitivo almacenan valores; Las variables declaradas de un tipo de referencia almacenan referencias.

String x = null;

En este caso, la declaración de inicialización declara una variable "x". "X" almacena referencia de cadena. Es nulo aquí. En primer lugar, null no es una instancia de objeto válida, por lo que no hay memoria asignada para ello. Es simplemente un valor que indica que la referencia del objeto no se está refiriendo actualmente a un objeto.


La palabra clave nula es un literal que representa una referencia nula, una que no hace referencia a ningún objeto . nulo es el valor predeterminado de las variables de tipo de referencia.

También tal vez echar un vistazo a

nulo: Java Glosario


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


Null no es una instancia de ninguna clase.

Sin embargo, puede asignar nulo a variables de cualquier tipo (objeto o matriz):

// this is false boolean nope = (null instanceof String); // but you can still use it as a String String x = null; "abc".startsWith(null);


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 de compilador y modelo de memoria. NULL no es, estrictamente hablando, parte de C / C ++ en sí.

En Java (tm), "null" no es una palabra clave, sino un literal especial del 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.


Respuesta corta y precisa que responde a todas sus preguntas formalmente desde JLS:

3.10.7. El nulo literal

El tipo nulo tiene un valor, la referencia nula, representada por el nulo literal nulo, que se forma a partir de caracteres ASCII.

Un literal nulo es siempre del tipo nulo.

Sólo se asigna una referencia de tipo que se asigna a nulo. No asignas ningún valor (objeto) a la referencia. Dicha asignación es específica para JVM, cuánta referencia tomará y en qué área de memoria se asignará.


null en Java es similar a nullptr en C ++.

Programa en C ++:

class Point { private: int x; int y; public: Point(int ix, int iy) { x = ix; y = iy; } void print() { std::cout << ''('' << x << '','' << y << '')''; } }; int main() { Point* p = new Point(3,5); if (p != nullptr) { p->print(); p = nullptr; } else { std::cout << "p is null" << std::endl; } return 0; }

Mismo programa en Java:

public class Point { private int x; private int y; public Point(int ix, int iy) { x = ix; y = iy; } public void print() { System.out.print("(" + x + "," + y + ")"); } } class Program { public static void main(String[] args) { Point p = new Point(3,5); if (p != null) { p.print(); p = null; } else { System.out.println("p is null"); } } }

Ahora, ¿entiendes de los códigos anteriores qué es nulo en Java? Si no, entonces te recomiendo que aprendas punteros en C / C ++ y entonces lo entenderás.

Tenga en cuenta que en C, a diferencia de C ++, nullptr no está definido, pero en su lugar se usa NULL, que también se puede usar en C ++, pero en C ++ nullptr es más preferible que NULL, porque NULL en C siempre está relacionado con los punteros y eso es es así, en C ++, el sufijo "ptr" se agregó al final de la palabra, y también todas las letras ahora están en minúsculas, pero esto es menos importante.

En Java, cada variable de clase de tipo no primitiva es siempre referencia al objeto de ese tipo o heredada y nula es referencia de objeto de clase nula, pero no puntero nulo, porque en Java no existe tal cosa "puntero", sino referencias a clase los objetos se utilizan en su lugar, y null en Java está relacionado con las referencias de objetos de clase, por lo que también puede llamarlo "nullref" o "nullrefobj", pero esto es largo, así que simplemente llámelo "null".

En C ++ puede usar punteros y el valor nullptr para miembros / variables opcionales , es decir, miembro / variable que no tiene ningún valor y si no tiene ningún valor, entonces es igual a nullptr, por lo que puede utilizarse null en Java, por ejemplo.


null es un valor especial que no es una instancia de ninguna clase. Esto se ilustra con el siguiente programa:

public class X { void f(Object o) { System.out.println(o instanceof String); // Output is "false" } public static void main(String[] args) { new X().f(null); } }


null es un valor especial, no es instancia de nada. Por la razón obvia no puede ser instanceof nada.


¿Qué es nulo?

No es nada.

¿Es nulo una instancia de algo?

No como no es nada. No puede ser instancia de nada.

¿A qué conjunto pertenece el nulo?

No hay ningún conjunto

¿Cómo se representa en la memoria?

Si alguna referencia lo apunta como:

Object o=new Object();

En la memoria del montón un espacio asignado al nuevo objeto creado. Y o apuntará a ese espacio asignado en la memoria.

Ahora o=null;

Esto significa que ahora o no apuntará a ese espacio de memoria del objeto.


Representación bytecode

El null de Java tiene soporte directo de JVM: se usan tres instrucciones para implementarlo:

  • aconst_null : por ejemplo, para establecer una variable en null como en Object o = null;
  • ifnull y ifnonnull : por ejemplo, para comparar un objeto con null como en if (o == null)

El Capítulo 6 "Conjunto de instrucciones de la máquina virtual de Java" luego menciona los efectos de null en otras instrucciones: lanza una NullPointerException para muchas de ellas.

2.4. "Tipos y valores de referencia" también menciona null en términos genéricos:

Un valor de referencia también puede ser la referencia nula especial, una referencia a ningún objeto, que se indicará aquí con nulo. La referencia nula inicialmente no tiene un tipo de tiempo de ejecución, pero se puede convertir a cualquier tipo. El valor predeterminado de un tipo de referencia es nulo.