Un int peut-il être nul en Java?

155

Un intêtre nullen 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 intest 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.

user220755
la source
1
C'est une erreur de compilation.
MayurB

Réponses:

201

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:

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

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êteraisjava.util.Optional<Integer>

Brian Agnew
la source
2
Il y a de bonnes raisons pour l'existence de la classe Integer, alors utilisez-la lorsque les besoins sont impérieux.
Blessed Geek
6
@ h2g2java: J'espère que vous ne pensez pas que pouvoir les utiliser avec la collection par défaut est convaincant car pour des choses comme HashMap <Integer, Integer>, le niveau de gaspillage est énorme et non convaincant. C'est pourquoi le TIntIntHashMap de Trove, utilisant uniquement des primitives, tourne autour du HashMap <Integer, Integer> non convaincant.
SyntaxeT3rr0r
1
int ne peut pas être vérifié pour null, cependant, vous pouvez assigner en toute sécurité null à int en Java en le convertissant en Integer, par exemple si la méthode check (racine) peut retourner null, vous pouvez le convertir en toute sécurité en int en faisant quelque chose comme ceci: int data = (Integer)check(node);
sactiw
@sactiw - Pouvez-vous élaborer? Je ne suis pas sûr de comprendre ce que vous voulez dire
Brian Agnew
7
@BrianAgnew Permettez-moi de rectifier ce que j'ai dit ici, je me suis tout simplement trompé, je n'avais fondamentalement pas réalisé que int i = (Integer)null;cela jetterait NPE au moment de l'exécution pendant le déballage.
sactiw
40

Non. Seules les références d'objet peuvent être nulles, pas les primitives.

Ignacio Vazquez-Abrams
la source
3
Il convient de mentionner la classe Integer qui conviendrait mieux si l'OP veut une valeur nulle. Ou il pourrait utiliser une valeur négative pour indiquer "introuvable"
Glen
31

Un excellent moyen de découvrir:

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

Essayez de compiler.

Matt Luongo
la source
37
En fait ... Le PO l'a déjà découvert lui-même selon la dernière phrase de sa question: il était facile de comprendre que cela ne fonctionne pas.
BalusC
9
Pour la postérité près de 4 ans plus tard, ce morceau était dans une édition ultérieure.
Matt Luongo
3
mais .. Integer ii = null; int i = ii;compilera mais lancera NullPointerException à l'exécution
premek.v
13

En 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 checkmé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.

Jonathon Faust
la source
8

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,

   int a=0;

et pas

   int a=null;

Idem avec les autres types primitifs et par conséquent null n'est utilisé que pour les objets et non pour les types primitifs.

Shoaib Chikate
la source
5

Le code ne se compilera même pas. Seul un digne Objectpeut l'être null, comme Integer. Voici un exemple de base pour montrer quand vous pouvez tester null:

Integer data = check(Node root);

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

Par contre, si check()est déclaré retour int, cela ne peut jamais l' être nullet tout le if-elsebloc est alors superflu.

int data = check(Node root);

// do something

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 revenu Integer, vous risqueriez de l' NullPointerExceptionattribuer à un intau lieu de Integer. L'attribuer en tant que bloc Integeret utiliser le if-elsebloc aurait alors effectivement été obligatoire.

Pour en savoir plus sur autoboxing, consultez ce guide dim. .

BalusC
la source
1
Malheureusement, si "check" renvoie un int plutôt qu'un Integer, cela n'aidera pas, car l'int (qui ne sera pas nul) sera automatiquement encadré dans Integer.
Paul Tomblin
2
D'oh, c'était juste un exemple basique pour montrer quand vous pouvez tester pour null. Par contre, si check est déclaré retourné int, il ne peut jamais être nul et l'ensemble if block est alors superflu.
BalusC
3

au lieu de le int idéclarer comme Integer ialors nous pouvons le fairei=null;

Integer i;
i=null;
Minati
la source
2

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

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}
Nino van Hooff
la source
1

Non, mais int [] peut l'être.

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
JMI MADISON
la source
0

Comme @Glen l'a mentionné dans un commentaire, vous avez essentiellement deux façons de contourner cela:

  • utilisez une valeur "hors limite". Par exemple, si "data" ne peut jamais être négatif en utilisation normale, renvoyez une valeur négative pour indiquer qu'elle n'est pas valide.
  • Utilisez un entier. Assurez-vous simplement que la méthode "check" renvoie un entier et que vous l'assignez à un entier et non à un entier. Parce que si un "int" intervient en cours de route, la boxe et le déballage automatiques peuvent poser des problèmes.
Paul Tomblin
la source
0

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».

user3550884
la source
0

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;

Sachin Pete
la source
0

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

Mohammad Fathi
la source
-2

Puisque vous demandez une autre façon d'atteindre votre objectif, je vous suggère d'utiliser une classe wrapper:

new Integer(null);
Sablonneux
la source
-17

Je ne suis pas un expert, mais je pense que l' nulléquivalent d'un int est 0.

Par exemple, si vous créez un int[], chaque emplacement contient 0par opposition à null, sauf si vous le définissez sur autre chose.

Dans certaines situations, cela peut être utile.

Lahn
la source
Très simplement, 0 n'est pas la même chose que null.
Dave Goodchild