2010-10-08 20 views
18

Estaba estudiando mi Java para prepararme para un examen y encontré una especie de problema con los valores int/Integer no inicializados.Uninitialized int vs Integer

class A 
    { 
     int x; 
     Integer y; 
     static int z; 
     static Integer z2; 
     public A(){} 
    } 

Digamos que inicializo un objeto de la Clase A. A a = new A();

He intentado esto en un compilador y de recibir los resultados

a.x == 0; true 
a.x == null; Static Error: Bad type in comparison expression 
a.y == 0; java.lang.NullPointerException 
a.y == null; true 
a.z == 0; true 
a.z == null; Static Error: Bad type in comparison expression 
a.z2 == 0; NullPointerException 
a.z2 == null; true 

Por otra parte, he intentado algunas comparaciones más sin inicializar int/número entero en un panel de interacciones para ver si iba a obtener resultados diferentes si mi x, y no eran variables de instancia de clase como están arriba.

int x; 
Integer y; 
x == 0; true 
x == null; Static Error: Bad type in comparison expression 
y == 0; java.lang.NullPointerException 
y == null; true 

Sin embargo, mis reclamos profesor en una conferencia que los valores deben ser como sigue:

x == 0; Uninitialized 
x == null; Undefined 
y == 0; java.lang.NullPointerException 
y == null; Uninitialized 

Ahora bien, no quiero poner en duda el que escribe el examen, pero que X == 0 yy == valor de verdad nulo es correcto? Una explicación de por qué sería muy apreciada, gracias.

+15

Si se pregunta quién es más creíble al saber qué hará el compilador: el compilador o su profesor ... la respuesta es el compilador. –

Respuesta

17
  • a.x == 0 - Verdadero porque hacha tiene un valor predeterminado de 0.
  • a.x == null - Como se señaló, este es un error en tiempo de compilación. Esto se sigue de §15.21.3: "Se produce un error en tiempo de compilación si es imposible convertir el tipo de cualquiera de los operandos al tipo de otro mediante una conversión de conversión (§5.5)". El tipo nulo no es convertible a un número.
  • a.y == 0 - Este trata de desempacar a.y, que es nula, por lo que lanza una NullPointerException. A diferencia de lo anterior (que tiene un nulo literal), el compilador no intenta descubrir en tiempo de compilación que a.y será nulo.
  • a.y == null - De nuevo, cierto porque a.y se inicializa en NULL
  • a.z == 0 - Igual que a.x (excepto estática)
  • a.z == null - Igual que a.x (excepto estática)
  • a.z2 == 0 - Igual que a.y (excepto estática)
  • a.z2 == null - Igual que a.y (excepto estática)

El problema con el panel de interacciones es que depende del IDE cómo implementarlo. Si xey son variables locales (no inicializadas), las cuatro comparaciones anteriores no podrán compilarse.

17

valores Java de tipos simples como int/largo no puede ser nulo para que se inicializan por 0.

+2

¿Por qué se bajó este voto? ¡Es lo correcto! –

+0

@Mark Peters: Gracias. –

+1

Corrección ... las variables primitivas de 'instancia' se inicializan ... las variables primitivas locales no son - deben inicializarse. –

1

EDIT: variables locales sin inicializar no se pueden utilizar.

Además de los locales:

no inicializado int es igual a 0.

no inicializado entero igual a cero.

Entero es un objeto. Objetos unitarios es nulo.

int es un tipo primitivo. Las especificaciones del lenguaje definen su valor no inicializado es 0.

+0

"Objetos unitarios es nulo", no lo creo. –

+1

"Unitario int. Es 0. Entero unitario es igual a nulo." No es cierto, solo cuando son variables de instancia, no variables locales. –

+0

@Stas. Dame un ejemplo de un objeto unificado que no sea nulo. – pablosaraiva

2
int x; 
Integer y; 
x == 0; true. because x is initialized to 0 by JVM 
x == null; Static Error: Bad type in comparison expression 
y == 0; java.lang.NullPointerException 
y == null; true, because y is uninitialized 
0

Todos los objetos/variables en una clase se inicializan a los valores por defecto cuando se crea una instancia de un objeto.

esa es la razón, las variables dentro de la clase tienen los siguientes valores:

... y el resto continúa de manera similar. Espero que mi respuesta sea útil!

10

En Java, las variables de clase (estáticas), las variables de instancia (las de su ejemplo) y los componentes de matriz tienen valores predeterminados. Las variables locales, por otro lado, deben recibir valores explícitos y no obtener valores predeterminados.

Para obtener más información, consulte §4.12.5.

+1

Esto es de un JLS obsoleto, podría citar la versión 3 (ver la respuesta de JeffW) –

+0

@Mark: Gracias. Actualizado. – Nabb

1

Este me ha molestado antes, ya que las descripciones y el comportamiento parecen un poco inconsistentes. Si nos fijamos en el language specification en section 4.12.5, hay una sección que describe esto y hace jive con lo que observó el compilador.

La razón por la que creo que esto es confuso a veces es que otras publicaciones que he leído de Sun ("Core Java 2", por ejemplo) describen el comportamiento que su profesor indicó.Y en otra variación, uso NetBeans que permite el uso de primitivas no inicializadas pero señala el uso de objetos no inicializados; No estoy seguro de si eso es un compilador o una elección IDE.

[EDIT: después de revisar uno de los puestos, creo que esta confusión no se derivan de los diferentes comportamientos de las variables locales vs campos.]

+0

Un consejo: cite la versión HTML de JLS, no la versión en pdf. –

+0

Buen punto. Fijo. – JeffW

0

Esta pregunta se hizo hace un tiempo, y hay respuestas correctas condición, sin embargo, siento que se pueden expandir un poco.

me gustaría citar un par unas líneas en la página oficial de tutoriales. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Los campos que se declaran pero no inicializada se ajustarán a un valor predeterminado razonable por el compilador

Las variables locales son ligeramente diferentes; el compilador nunca asigna un valor predeterminado a una variable local no inicializada. Acceder a una variable local no inicializada dará como resultado un error en tiempo de compilación.

En Java, las primitivas tienen un valor que es un número. (no es tan simple y te recomiendo que leas más sobre esto.) Un valor para un objeto es una referencia desde donde es posible encontrar el contenido del objeto.

valor predeterminado de un primitivo es esencialmente un 0 donde como valor por defecto para un objeto es nulo. (Cuando no inicializado y cuando un campo)

En su ejemplo, que tratan de comparar "0 a 0, null null y nula a 0".

El hecho es: null = 0.

  • 0 = un valor numérico que representa nada.
  • null = literal para representar referencias no existentes. (Se puede ver What is null in Java? para más detalles sobre nula)

FYI: Creo que esta pregunta fue respondida espléndidamente por Matthew Flaschen ya, simplemente quería añadir información adicional para aquellos que estén interesados.