Kann ein int in Java null sein?


155

Kann intman nullin Java sein?

Beispielsweise:

int data = check(Node root);

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

Mein Ziel ist es, eine Funktion zu schreiben, die eine zurückgibt int. Said intwird in der Höhe eines Knotens gespeichert, und wenn der Knoten nicht vorhanden ist, ist er null, und ich muss das überprüfen.

Ich mache das für Hausaufgaben, aber dieser spezielle Teil ist nicht Teil der Hausaufgaben, er hilft mir nur, durch das zu kommen, was ich mache.

Vielen Dank für die Kommentare, aber es scheint, dass nur sehr wenige Leute tatsächlich gelesen haben, was unter dem Code steht. Ich habe gefragt, wie ich dieses Ziel sonst noch erreichen kann. Es war leicht herauszufinden, dass es nicht funktioniert.


1
Es ist ein Fehler bei der Kompilierung.
MayurB

Antworten:


201

int kann nicht null sein, Integer kann aber . Sie müssen vorsichtig sein, wenn Sie null Ganzzahlen entpacken, da dies viel Verwirrung und Kopfkratzer verursachen kann!

zB das:

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

wird Ihnen ein geben NullPointerException, obwohl das Objekt nicht null ist!

Um Ihrer Frage nachzugehen und das Fehlen eines Wertes anzuzeigen , würde ich dies untersuchenjava.util.Optional<Integer>


2
Es gibt gute Gründe für die Existenz einer Integer-Klasse. Verwenden Sie sie daher, wenn die Anforderungen überzeugend sind.
Seliger Geek

6
@ h2g2java: Ich hoffe, Sie denken nicht, dass es zwingend ist, sie mit der Standardsammlung verwenden zu können, da für Dinge wie HashMap <Integer, Integer> der Abfall sehr groß und nicht zwingend ist. Aus diesem Grund läuft die TIntIntHashMap von Trove, die nur Grundelemente verwendet, um die nicht zwingende HashMap <Integer, Integer>.
SyntaxT3rr0r

1
int kann nicht auf null geprüft werden. Sie können int jedoch in Java sicher null zuweisen, indem Sie es in Integer umwandeln. Wenn die check (root) -Methode beispielsweise null zurückgeben kann, können Sie es sicher in int umwandeln, indem Sie so etwas tun dies: int data = (Integer)check(node);
sactiw

@sactiw - Kannst du das näher erläutern? Ich bin nicht sicher, ob ich verstehe, worauf du hinaus willst
Brian Agnew,

7
@BrianAgnew Lassen Sie mich korrigieren, was ich hier gesagt habe. Ich habe mich einfach geirrt. Ich wusste im Grunde nicht, dass int i = (Integer)null;NPE zur Laufzeit beim Auspacken ausgelöst wird.
Sactiw

40

Nein. Nur Objektreferenzen können null sein, keine Grundelemente.


3
Erwähnenswert ist die Integer-Klasse, die besser passt, wenn das OP einen Nullwert wünscht. Oder er könnte einen negativen Wert verwenden, um "nicht gefunden" anzuzeigen
Glen

31

Ein guter Weg, um herauszufinden:

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

Versuchen Sie zu kompilieren.


37
Eigentlich ... Das OP hat das bereits selbst herausgefunden, wie aus dem letzten Satz seiner Frage hervorgeht: Es war leicht herauszufinden, dass es nicht funktioniert.
BalusC

9
Für die Nachwelt fast 4 Jahre später - dieses Stück wurde später bearbeitet.
Matt Luongo

3
aber .. Integer ii = null; int i = ii;wird kompilieren, aber NullPointerException zur Laufzeit
auslösen

13

In Java ist int ein primitiver Typ und wird nicht als Objekt betrachtet. Nur Objekte können einen Nullwert haben. Die Antwort auf Ihre Frage lautet also nein, sie kann nicht null sein. Aber es ist nicht so einfach, weil es Objekte gibt, die die meisten primitiven Typen darstellen.

Die Klasse Integer stellt einen int-Wert dar, kann jedoch einen Nullwert enthalten. Abhängig von Ihrer checkMethode können Sie ein int oder eine Integer zurückgeben.

Dieses Verhalten unterscheidet sich von einigen rein objektorientierten Sprachen wie Ruby, in denen selbst "primitive" Dinge wie Ints als Objekte betrachtet werden.


8

Zusammen mit allen obigen Antworten möchte ich auch diesen Punkt hinzufügen.

Für primitive Typen haben wir eine feste Speichergröße, dh für int haben wir 4 Bytes und char haben wir 2 Bytes. Und null wird nur für Objekte verwendet, da dort die Speichergröße nicht festgelegt ist.

Standardmäßig haben wir also:

   int a=0;

und nicht

   int a=null;

Dasselbe gilt für andere primitive Typen und daher wird null nur für Objekte und nicht für primitive Typen verwendet.


5

Der Code wird nicht einmal kompiliert. Nur ein Vollwürdiger Objectkann sein null, wie Integer. Hier ist ein einfaches Beispiel, um zu zeigen, wann Sie auf null testen können:

Integer data = check(Node root);

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

Auf der anderen Seite kann es niemals sein , wenn check()deklariert wird, zurückzukehren int, und der gesamte Block ist dann überflüssig.nullif-else

int data = check(Node root);

// do something

Autoboxing-Probleme treten auch hier nicht auf, wenn check()die Rückkehr angekündigt wird int. Wenn es zurückgekehrt ist Integer, können Sie das Risiko NullPointerExceptioneingehen, wenn Sie es einem intstatt zuweisen Integer. Das Zuweisen als Integerund Verwenden des if-elseBlocks wäre dann tatsächlich obligatorisch gewesen.

Weitere Informationen zum Autoboxen finden Sie in diesem Sun-Handbuch .


1
Wenn "check" ein int anstelle einer Ganzzahl zurückgibt, hilft dies leider nicht, da das int (das nicht null sein wird) automatisch in die Ganzzahl eingefügt wird.
Paul Tomblin

2
D'oh, das war nur ein einfaches Beispiel, um zu zeigen, wann man auf Null testen kann. Wenn andererseits die Prüfung als zurückgegeben deklariert wird int, kann sie niemals null sein, und der gesamte if-Block ist dann überflüssig.
BalusC

3

anstatt es so zu int ideklarieren, wie Integer iwir es tun könneni=null;

Integer i;
i=null;

2

Ganzzahliges Objekt wäre am besten. Wenn Sie Grundelemente verwenden müssen, können Sie einen Wert verwenden, der in Ihrem Anwendungsfall nicht vorhanden ist. Negative Körpergröße gibt es also nicht für Menschen

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

1

Nein, aber int [] kann sein.

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

Wie @Glen in einem Kommentar erwähnt hat, haben Sie grundsätzlich zwei Möglichkeiten, dies zu umgehen:

  • Verwenden Sie einen "out of bound" -Wert. Wenn beispielsweise "Daten" bei normaler Verwendung niemals negativ sein können, geben Sie einen negativen Wert zurück, um anzuzeigen, dass sie ungültig sind.
  • Verwenden Sie eine Ganzzahl. Stellen Sie einfach sicher, dass die "check" -Methode eine Ganzzahl zurückgibt, und weisen Sie sie einer Ganzzahl zu, nicht einer int. Denn wenn ein "int" auf dem Weg beteiligt wird, kann das automatische Ein- und Auspacken Probleme verursachen.

0

Suchen Sie in Ihrer check () -Methode nach null und geben Sie einen ungültigen Wert wie -1 oder null zurück, wenn null. Dann würde die Prüfung auf diesen Wert erfolgen, anstatt die Null weiterzugeben. Dies wäre eine normale Sache in der alten Zeit 'C' zu tun.


0

Jeder primitive Datentyp wie int, boolean oder float usw. kann die Null (lateral) nicht speichern, da Java die Wrapper-Klasse zum Speichern derselben wie int in Integer, boolean in Boolean bereitgestellt hat.

Beispiel: Ganzzahl i = null;


0

Ein int ist nicht null, es kann 0 sein, wenn es nicht initialisiert wird. Wenn eine Ganzzahl null sein soll, müssen Sie Ganzzahl anstelle von int verwenden. Grundelemente haben keinen Nullwert. Standardmäßig ist für ein int 0.

Datentyp / Standardwert (für Felder)

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

lang ---------------- 0L

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

double ------------- 0.0d

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

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

boolean ------------ false


-2

Da Sie nach einem anderen Weg fragen, um Ihr Ziel zu erreichen, empfehle ich Ihnen, eine Wrapper-Klasse zu verwenden:

new Integer(null);

-17

Ich bin kein Experte, aber ich glaube, dass das nullÄquivalent für ein int ist 0.

Wenn Sie beispielsweise eine int[]erstellen, enthält jeder Steckplatz 0im Gegensatz zu null, es sei denn, Sie setzen ihn auf etwas anderes.

In einigen Situationen kann dies von Nutzen sein.


Ganz einfach, 0 ist nicht dasselbe wie null.
Dave Goodchild
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.