Kann int
man null
in 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 int
wird 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.
Antworten:
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:
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 untersuchen
java.util.Optional<Integer>
quelle
int data = (Integer)check(node);
int i = (Integer)null;
NPE zur Laufzeit beim Auspacken ausgelöst wird.Nein. Nur Objektreferenzen können null sein, keine Grundelemente.
quelle
Ein guter Weg, um herauszufinden:
Versuchen Sie zu kompilieren.
quelle
Integer ii = null; int i = ii;
wird kompilieren, aber NullPointerException zur LaufzeitIn 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
check
Methode 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.
quelle
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:
und nicht
Dasselbe gilt für andere primitive Typen und daher wird null nur für Objekte und nicht für primitive Typen verwendet.
quelle
Der Code wird nicht einmal kompiliert. Nur ein Vollwürdiger
Object
kann seinnull
, wieInteger
. Hier ist ein einfaches Beispiel, um zu zeigen, wann Sie auf null testen können:Auf der anderen Seite kann es niemals sein , wenn
check()
deklariert wird, zurückzukehrenint
, und der gesamte Block ist dann überflüssig.null
if-else
Autoboxing-Probleme treten auch hier nicht auf, wenn
check()
die Rückkehr angekündigt wirdint
. Wenn es zurückgekehrt istInteger
, können Sie das RisikoNullPointerException
eingehen, wenn Sie es einemint
statt zuweisenInteger
. Das Zuweisen alsInteger
und Verwenden desif-else
Blocks wäre dann tatsächlich obligatorisch gewesen.Weitere Informationen zum Autoboxen finden Sie in diesem Sun-Handbuch .
quelle
int
, kann sie niemals null sein, und der gesamte if-Block ist dann überflüssig.anstatt es so zu
int i
deklarieren, wieInteger i
wir es tun könneni=null;
quelle
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
quelle
Nein, aber int [] kann sein.
quelle
Wie @Glen in einem Kommentar erwähnt hat, haben Sie grundsätzlich zwei Möglichkeiten, dies zu umgehen:
quelle
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.
quelle
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;
quelle
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
quelle
Da Sie nach einem anderen Weg fragen, um Ihr Ziel zu erreichen, empfehle ich Ihnen, eine Wrapper-Klasse zu verwenden:
quelle
Ich bin kein Experte, aber ich glaube, dass das
null
Äquivalent für ein int ist0
.Wenn Sie beispielsweise eine
int[]
erstellen, enthält jeder Steckplatz0
im Gegensatz zunull
, es sei denn, Sie setzen ihn auf etwas anderes.In einigen Situationen kann dies von Nutzen sein.
quelle