Un int può essere nullo in Java?


155

Può intessere nullin Java?

Per esempio:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

Il mio obiettivo è quello di scrivere una funzione che restituisce un int. Detto intè memorizzato all'altezza di un nodo e se il nodo non è presente, sarà nullo e dovrò verificarlo.

Lo sto facendo per i compiti, ma questa parte specifica non fa parte dei compiti, mi aiuta solo a superare quello che sto facendo.

Grazie per i commenti, ma sembra che pochissime persone abbiano effettivamente letto cosa c'è sotto il codice, mi chiedevo in quale altro modo posso raggiungere questo obiettivo; è stato facile capire che non funziona.


1
È un errore di tempo di compilazione.
MayurB

Risposte:


201

int non può essere nullo, ma Integer può . È necessario fare attenzione quando si decomprimono numeri interi null poiché ciò può causare molta confusione e grattarsi la testa!

ad esempio questo:

int a = object.getA(); // getA returns a null Integer

ti darà un NullPointerException, nonostante l'oggetto non sia nullo!

Per dare seguito alla tua domanda, se vuoi indicare l' assenza di un valore, vorrei indagarejava.util.Optional<Integer>


2
Ci sono buone ragioni per l'esistenza della classe Integer, quindi usala quando i bisogni sono convincenti.
Beato Geek,

6
@ h2g2java: spero che tu non stia pensando che essere in grado di usarli con la raccolta predefinita sia convincente perché per cose come HashMap <Integer, Integer> il livello di spreco è enorme e non convincente. Ecco perché TIntIntHashMap di Trove, usando solo primitive, gira intorno alla HashMap <Intero, Intero> non convincente.
SyntaxT3rr0r

1
int non può essere verificato per null, tuttavia, è possibile assegnare in modo sicuro null a int in Java eseguendo il cast su Integer, ad esempio se il metodo check (root) può restituire null, è possibile eseguire il cast sicuro su int facendo qualcosa di simile questo: int data = (Integer)check(node);
sactiw l'

@sactiw - Puoi elaborare? Non sono sicuro di capire a cosa stai arrivando
Brian Agnew,

7
@BrianAgnew Consentitemi di correggere ciò che ho detto qui, avevo torto, in pratica non mi rendevo conto che int i = (Integer)null;avrebbe lanciato NPE in fase di esecuzione mentre lo scartavo.
Sactiw

40

No. Solo i riferimenti agli oggetti possono essere nulli, non primitivi.


3
Vale la pena menzionare la classe Integer che sarebbe più adatta se l'OP volesse un valore nullo. Oppure potrebbe usare un valore negativo per indicare "non trovato"
Glen

31

Un ottimo modo per scoprire:

public static void main(String args[]) {
    int i = null;
}

Prova a compilare.


37
In realtà .. L'OP l'ha già scoperto da solo nell'ultima frase della sua domanda: è stato facile capire che non funziona.
BalusC,

9
Per i posteri quasi 4 anni dopo, quel pezzo era in una modifica successiva.
Matt Luongo,

3
ma .. Integer ii = null; int i = ii;compilerà ma genererà NullPointerException in fase di esecuzione
premek.v

13

In Java, int è un tipo primitivo e non è considerato un oggetto. Solo gli oggetti possono avere un valore nullo. Quindi la risposta alla tua domanda è no, non può essere nulla. Ma non è così semplice, perché ci sono oggetti che rappresentano i tipi più primitivi.

La classe Integer rappresenta un valore int, ma può contenere un valore null. A seconda del checkmetodo, potresti restituire un int o un numero intero.

Questo comportamento è diverso da alcuni linguaggi più puramente orientati agli oggetti come Ruby, dove persino le cose "primitive" come gli ints sono considerate oggetti.


8

Insieme a tutte le risposte sopra vorrei aggiungere anche questo punto.

Per i tipi primitivi, abbiamo dimensioni di memoria fisse, cioè per int abbiamo 4 byte e char abbiamo 2 byte. E null viene utilizzato solo per gli oggetti perché la dimensione della memoria non è fissa.

Quindi per impostazione predefinita abbiamo,

   int a=0;

e non

   int a=null;

Lo stesso vale per altri tipi primitivi e quindi null viene utilizzato solo per oggetti e non per tipi primitivi.


5

Il codice non verrà nemmeno compilato. Solo un degno Objectpuò essere null, come Integer. Ecco un esempio di base da mostrare quando è possibile verificare null:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

D'altra parte, se check()viene dichiarato di tornare int, non può mai essere nulle l'intero if-elseblocco è quindi superfluo.

int data = check(Node root);

// do something

I problemi di autoboxing non si applicano anche qui quando check()viene dichiarato di ritorno int. Se fosse tornato Integer, potresti rischiare NullPointerExceptionquando lo assegni a un intinvece di Integer. Assegnarlo come un Integere usare il if-elseblocco sarebbe stato davvero obbligatorio.

Per ulteriori informazioni su autoboxing, controlla questa guida Sun .


1
Sfortunatamente se "check" restituisce un int piuttosto che un intero, questo non aiuta, perché int (che non sarà nullo) verrà automaticamente inscatolato nel numero intero.
Paul Tomblin,

2
D'oh, questo è stato solo un esempio di base da mostrare quando puoi provare per null. D'altra parte, se viene dichiarato che check restituisce int, non può mai essere nullo e l'intero se il blocco è quindi superfluo.
BalusC,

3

invece di dichiararlo come int idichiararlo come Integer iallora possiamo farei=null;

Integer i;
i=null;

2

L'oggetto intero sarebbe il migliore. Se è necessario utilizzare le primitive, è possibile utilizzare un valore che non esiste nel caso d'uso. L'altezza negativa non esiste per le persone, quindi

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

1

No, ma int [] può essere.

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

Come @Glen ha menzionato in un commento, in pratica hai due modi per aggirare questo:

  • usa un valore "fuori limite". Ad esempio, se i "dati" non possono mai essere negativi nell'uso normale, restituire un valore negativo per indicare che non è valido.
  • Usa un numero intero. Assicurati solo che il metodo "check" restituisca un numero intero e lo assegni a un numero intero non a un int. Perché se un "int" viene coinvolto lungo la strada, il boxe automatico e il unboxing possono causare problemi.

0

Controlla null nel tuo metodo check () e restituisci un valore non valido come -1 o zero se null. Quindi il controllo sarebbe per quel valore piuttosto che passare il null lungo. Questa sarebbe una cosa normale da fare ai vecchi tempi "C".


0

Qualsiasi tipo di dati primitivo come int, booleano o float ecc. Non può archiviare il valore null (laterale), poiché java ha fornito la classe Wrapper per la memorizzazione dello stesso tipo int in Intero, booleano in booleano.

Ad esempio: intero i = null;


0

Un int non è nullo, può essere 0 se non inizializzato. Se vuoi che un numero intero sia nullo, devi usare Integer invece di int. le primitive non hanno valore nullo. il valore predefinito per un int è 0.

Tipo di dati / Valore predefinito (per i campi)

int ------------------ 0

lungo ---------------- 0L

float ---------------- 0.0f

doppio ------------- 0.0d

char --------------- '\ u0000'

String --------------- null

booleano ------------ falso


-2

Dato che chiedi un altro modo per raggiungere il tuo obiettivo, ti suggerisco di utilizzare una classe wrapper:

new Integer(null);

-17

Non sono un esperto, ma credo che l' nullequivalente di un int sia 0.

Ad esempio, se ne crei uno int[], ogni slot contiene 0invece di null, a meno che tu non lo imposti su qualcos'altro.

In alcune situazioni, questo può essere utile.


Molto semplicemente, 0 non è uguale a null.
Dave Goodchild,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.