Un int
être null
en Java?
Par exemple:
int data = check(Node root);
if ( data == null ) {
// do something
} else {
// do something
}
Mon objectif est d'écrire une fonction qui renvoie un int
. Said int
est stocké à la hauteur d'un nœud, et si le nœud n'est pas présent, il sera nul, et je devrai vérifier cela.
Je fais cela pour mes devoirs, mais cette partie spécifique ne fait pas partie des devoirs, cela m'aide simplement à traverser ce que je fais.
Merci pour les commentaires, mais il semble que très peu de gens aient lu ce qui se trouve sous le code, je demandais comment je pouvais atteindre cet objectif; il était facile de comprendre que cela ne fonctionne pas.
Réponses:
int
ne peut pas être nul, maisInteger
peut . Vous devez être prudent lors du déballage des entiers nuls car cela peut causer beaucoup de confusion et de grattage!par exemple ceci:
vous donnera un
NullPointerException
, bien que l'objet ne soit pas nul!Pour donner suite à votre question, si vous souhaitez indiquer l' absence de valeur, j'enquêterais
java.util.Optional<Integer>
la source
int data = (Integer)check(node);
int i = (Integer)null;
cela jetterait NPE au moment de l'exécution pendant le déballage.Non. Seules les références d'objet peuvent être nulles, pas les primitives.
la source
Un excellent moyen de découvrir:
Essayez de compiler.
la source
Integer ii = null; int i = ii;
compilera mais lancera NullPointerException à l'exécutionEn Java, int est un type primitif et n'est pas considéré comme un objet. Seuls les objets peuvent avoir une valeur nulle. La réponse à votre question est donc non, elle ne peut pas être nulle. Mais ce n'est pas si simple, car il existe des objets qui représentent la plupart des types primitifs.
La classe Integer représente une valeur int, mais elle peut contenir une valeur nulle. Selon votre
check
méthode, vous pourriez renvoyer un entier ou un entier.Ce comportement est différent de certains langages plus purement orientés objet comme Ruby, où même les choses "primitives" comme les ints sont considérées comme des objets.
la source
Avec toutes les réponses ci-dessus, je voudrais également ajouter ce point.
Pour les types primitifs, nous avons une taille de mémoire fixe, c'est-à-dire que pour int, nous avons 4 octets et char nous avons 2 octets. Et null n'est utilisé que pour les objets car la taille de la mémoire n'est pas fixe.
Donc, par défaut, nous avons,
et pas
Idem avec les autres types primitifs et par conséquent null n'est utilisé que pour les objets et non pour les types primitifs.
la source
Le code ne se compilera même pas. Seul un digne
Object
peut l'êtrenull
, commeInteger
. Voici un exemple de base pour montrer quand vous pouvez tester null:Par contre, si
check()
est déclaré retourint
, cela ne peut jamais l' êtrenull
et tout leif-else
bloc est alors superflu.Les problèmes de boîte automatique ne s'appliquent pas ici non plus lorsque le
check()
retour est déclaréint
. S'il était revenuInteger
, vous risqueriez de l'NullPointerException
attribuer à unint
au lieu deInteger
. L'attribuer en tant que blocInteger
et utiliser leif-else
bloc aurait alors effectivement été obligatoire.Pour en savoir plus sur autoboxing, consultez ce guide dim. .
la source
int
, il ne peut jamais être nul et l'ensemble if block est alors superflu.au lieu de le
int i
déclarer commeInteger i
alors nous pouvons le fairei=null;
la source
Un objet entier serait le meilleur. Si vous devez utiliser des primitives, vous pouvez utiliser une valeur qui n'existe pas dans votre cas d'utilisation. La hauteur négative n'existe pas pour les personnes, donc
la source
Non, mais int [] peut l'être.
la source
Comme @Glen l'a mentionné dans un commentaire, vous avez essentiellement deux façons de contourner cela:
la source
Recherchez null dans votre méthode check () et renvoyez une valeur non valide telle que -1 ou zéro si nul. Ensuite, la vérification porterait sur cette valeur plutôt que de passer la valeur nulle. Ce serait une chose normale à faire dans l'ancien temps «C».
la source
Tout type de données primitif comme int, boolean ou float, etc. ne peut pas stocker le null (latéral), car java a fourni la classe Wrapper pour stocker la même chose comme int en Integer, boolean en boolean.
Par exemple: Entier i = nul;
la source
Un int n'est pas nul, il peut être 0 s'il n'est pas initialisé. Si vous voulez qu'un entier puisse être nul, vous devez utiliser Integer au lieu de int. les primitives n'ont pas de valeur nulle. la valeur par défaut pour un int est 0.
Type de données / valeur par défaut (pour les champs)
int ------------------ 0
longue ---------------- 0L
flotteur ---------------- 0.0f
double ------------- 0.0d
char --------------- '\ u0000'
Chaîne --------------- null
booléen ------------ false
la source
Puisque vous demandez une autre façon d'atteindre votre objectif, je vous suggère d'utiliser une classe wrapper:
la source
Je ne suis pas un expert, mais je pense que l'
null
équivalent d'un int est0
.Par exemple, si vous créez un
int[]
, chaque emplacement contient0
par opposition ànull
, sauf si vous le définissez sur autre chose.Dans certaines situations, cela peut être utile.
la source