185 votes

Un int peut-il être nul en Java ?

Est-ce qu'un int être null en Java ?

Par exemple :

int data = check(Node root);

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

Mon but est d'écrire une fonction qui renvoie un int . Dit int est stockée dans la hauteur d'un noeud, et si le noeud n'est pas présent, elle sera nulle, et je devrai vérifier cela.

Je fais cela pour mes devoirs mais cette partie spécifique ne fait pas partie des devoirs, elle m'aide juste à avancer dans ce que je fais.

Merci pour les commentaires, mais il semble que très peu de gens ont réellement lu ce qui se trouve sous le code, je demandais comment je pouvais atteindre cet objectif autrement ; il était facile de comprendre que cela ne fonctionne pas.

1 votes

C'est une erreur de compilation.

235voto

Brian Agnew Points 143181

int ne peut pas être nul, mais Integer peut . Vous devez être prudent lorsque vous déballez des nombres entiers nuls, car cela peut entraîner beaucoup de confusion et de casse-tête !

Par exemple, ceci :

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

vous donnera un NullPointerException alors que l'objet n'est pas nul !

Pour faire suite à votre question, si vous voulez indiquer la absence d'une valeur, j'enquêterais java.util.Optional<Integer>

2 votes

Il y a de bonnes raisons pour l'existence de la classe Integer, alors utilisez-la lorsque les besoins sont impérieux.

6 votes

@h2g2java : J'espère que vous ne pensez pas que le fait de pouvoir les utiliser avec la collection par défaut est convaincant parce que pour des choses comme HashMap<Integer,Integer> le niveau de gaspillage est énorme et non convaincant. C'est pourquoi TIntIntHashMap de Trove, qui n'utilise que des primitives, tourne autour du non contraignant HashMap<Integer,Integer>.

1 votes

Int ne peut pas être vérifié pour null, cependant, vous pouvez en toute sécurité attribuer null à int en Java en le coulant en Integer, par exemple si la méthode check(Root) peut retourner null alors vous pouvez en toute sécurité le couler en int en faisant quelque chose comme ceci : int data = (Integer)check(node);

46voto

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

3 votes

Il convient de mentionner la classe Integer qui serait plus adaptée si le PO souhaite une valeur nulle. Ou il pourrait utiliser une valeur négative pour indiquer "non trouvé".

32voto

Matt Luongo Points 4671

Un bon moyen de le découvrir :

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

Essayez de compiler.

49 votes

En fait, le PO l'a déjà découvert lui-même, comme l'indique la dernière phrase de sa question : il a été facile de comprendre que ça ne marche pas.

13 votes

Pour la postérité, près de 4 ans plus tard, cette partie était dans un montage ultérieur.

5 votes

Mais Integer ii = null; int i = ii; compile mais lève une NullPointerException à l'exécution.

19voto

Jonathon Faust Points 7543

En Java, int est un type primitif et il n'est pas considéré comme un objet. Seuls les objets peuvent avoir une valeur nulle. La réponse à votre question est donc non, il ne peut pas être nul. 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. En fonction de votre check vous pouvez renvoyer un int ou un Integer.

Ce comportement est différent de celui de certains langages plus purement orientés objet comme Ruby, où même les éléments "primitifs" comme les ints sont considérés comme des objets.

5voto

BalusC Points 498232

Le code ne sera même pas compilé. Seul un [Object](http://java.sun.com/javase/6/docs/api/java/lang/Object.html#toString()) peut être null comme Integer . Voici un exemple de base pour montrer quand vous pouvez tester pour null :

Integer data = check(Node root);

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

D'autre part, si check() est déclaré retourner int il peut jamais être null et l'ensemble if-else est alors superflu.

int data = check(Node root);

// do something

Les problèmes d'autoboxage ne s'appliquent pas ici non plus lorsque check() est déclaré retourner int . S'il était revenu Integer alors vous risquez NullPointerException lors de son affectation à un int au lieu de Integer . L'assigner comme un Integer et en utilisant le if-else Le bloc aurait alors effectivement été obligatoire.

Pour en savoir plus sur l'autoboxing, consultez ce guide du soleil .

1 votes

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 l'Integer.

2 votes

D'oh, c'était juste un exemple basique pour montrer quand vous pouvez tester la nullité. D'un autre côté, si check est déclaré comme devant retourner int il ne peut jamais être nul et l'ensemble du bloc if est alors superflu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X