2010-10-08 6 views
18

Stavo solo studiando sulla mia Java in preparazione per un esame e mi sono imbattuto in una sorta di problema con valori int/Integer non inizializzati.Uninitialized int vs Integer

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

Diciamo che inizializzo un oggetto di Classe A. A a = nuovo A();

Ho provato questo in un compilatore e ottenuto i risultati

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 

Inoltre, ho provato alcuni più non inizializzate confronti int/interger in un riquadro interazioni per vedere se sarei ottenere risultati diversi se il mio x, Non erano variabili di istanza di classe come sopra.

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

Tuttavia, le mie affermazioni professore in una conferenza che i valori devono essere le seguenti:

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

Ora io non voglio mettere in dubbio quello che scrive l'esame, ma che x == 0 e y == il valore di verità nullo è corretto? Una spiegazione sul perché sarebbe molto apprezzata, grazie.

+15

Se vi state chiedendo chi è più credibile nel sapere che cosa farà il compilatore: il compilatore o il vostro professore ... la risposta è il compilatore. –

risposta

17
  • a.x == 0 - vero perché ascia ha un valore predefinito 0.
  • a.x == null - Come notato, questo è un errore in fase di compilazione. Ciò segue da §15.21.3: "Si verifica un errore in fase di compilazione se è impossibile convertire il tipo di entrambi gli operandi con il tipo dell'altro mediante una conversione di conversione (§5.5)." Il tipo null non è convertibile in un numero.
  • a.y == 0 - Questo tenta di unboxing a.y, che è nullo, quindi getta una NullPointerException. A differenza di quanto sopra (che ha un valore letterale nullo), il compilatore non tenta di capire in fase di compilazione che a.y sarà nullo.
  • a.y == null - nuovo, vero perché a.y inizializzata a null
  • a.z == 0 - Come a.x (eccetto statica)
  • a.z == null - Come a.x (eccetto statica)
  • a.z2 == 0 - Come a.y (eccetto statico)
  • a.z2 == null - Uguale a a.y (tranne statica)

Il problema con il pannello interazioni è che dipende dall'IDE come implementarlo. Se x e y sono variabili locali (non inizializzate), tutti e quattro gli ultimi confronti non verranno compilati.

17

valori Java di tipi semplici come int/lungo non può essere nullo in modo che siano inizializzati per 0.

+2

Perché è stato downvoted? È giusto! –

+0

@ Mark Peters: Grazie. –

+1

Correzione ... le variabili primitive 'di istanza' sono inizializzate ... le variabili primitive locali non lo sono, devono essere inizializzate. –

1

EDIT: variabili locali non inizializzate non possono essere utilizzate.

Oltre gente del posto:

non inizializzate int uguale a 0.

non inizializzate Integer è uguale a zero.

L'intero è un oggetto. Gli oggetti unitializzati sono nulli.

int è un tipo primitivo. Le specifiche della lingua definiscono il suo valore non inizializzato è 0.

+0

"Gli oggetti unitati sono uguali a null" -non credo. –

+1

"Unitialized int equals 0. L'intero unitializzato è uguale a null." Non vero, solo quando sono variabili di istanza e non variabili locali. –

+0

@Stas. Dammi un esempio di un oggetto unitializzato che non è nullo. – 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

Tutti gli oggetti/variabili di una classe vengono inizializzati quando un oggetto viene creata un'istanza ai valori di default.

Questo è il motivo, le variabili all'interno della classe hanno i seguenti valori:

... e il resto va avanti allo stesso modo. Spero che la mia risposta sia utile !!!

10

In Java, le variabili di classe (statiche), le variabili di istanza (quelle nel proprio esempio) ei componenti dell'array hanno valori predefiniti. Le variabili locali d'altra parte devono avere valori espliciti e non ottenere valori predefiniti.

Per ulteriori dettagli, vedere §4.12.5.

+1

Questo è da un JLS obsoleto, potrebbe voler citare la versione 3 (vedere la risposta di JeffW) –

+0

@Mark: Grazie. Aggiornato. – Nabb

1

Questo mi ha infastidito prima poiché le descrizioni e il comportamento sembrano un po 'incoerenti. Se guardi lo language specification in section 4.12.5 c'è una sezione che descrive questo e fa jive con ciò che hai osservato facendo il compilatore.

La ragione per cui a volte penso che sia fonte di confusione è che altre pubblicazioni che ho letto da Sun (ad esempio "Core Java 2") descrivono il comportamento indicato dal prof.E in un'altra variante, io uso NetBeans che consente l'uso di primitive non inizializzate ma contrassegna l'uso di oggetti non inizializzati; Non sono sicuro che sia un compilatore o una scelta IDE.

[EDIT: dopo aver esaminato uno dei posti, credo che questa confusione non derivano dal diverso comportamento per le variabili locali vs campi.]

+0

Un consiglio: cita la versione HTML del JLS, non la versione pdf. –

+0

Buon punto. Fisso. – JeffW

0

Questa domanda è stato chiesto un po 'indietro, e non ci sono risposte corrette fornite, tuttavia, ritengo che possano essere ampliati in qualche modo.

Vorrei citare un paio di righe dalla pagina delle esercitazioni ufficiali. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

I campi che vengono dichiarati, ma non inizializzate verranno impostati su un ragionevole di default dal compilatore

Le variabili locali sono leggermente diverse; il compilatore non assegna mai un valore predefinito a una variabile locale non inizializzata. L'accesso a una variabile locale non inizializzata comporterà un errore in fase di compilazione.

Nelle primitive Java hanno un valore che è un numero. (Non è così semplice e vi invito a leggere di più a riguardo.) Un valore per un oggetto è un riferimento da cui è possibile trovare il contenuto dell'oggetto.

valore standard per primitivo è essenzialmente un 0 dove come valore predefinito per un oggetto è nullo. (Quando non inizializzato e quando un campo)

Nel tuo esempio, si tenta di confrontare "0 a 0, null a null e nulla a 0".

Il fatto è: null! = 0.

  • 0 = un valore numerico che rappresenta nulla.
  • null = un valore letterale per rappresentare un riferimento non esistente. (È possibile visualizzare What is null in Java? per maggiori dettagli su nulla)

FYI: Credo che questa domanda è stato risposto splendidamente da Matthew Flaschen già, ho solo voluto aggiungere informazioni extra per coloro che sono interessati.