web-dev-qa-db-fra.com

Renvoyer null dans une méthode dont la signature dit return int?

public int pollDecrementHigherKey(int x) {
            int savedKey, savedValue;
            if (this.higherKey(x) == null) {
                return null;  // COMPILE-TIME ERROR
            }
            else if (this.get(this.higherKey(x)) > 1) {        
                savedKey = this.higherKey(x);
                savedValue = this.get(this.higherKey(x)) - 1;
                this.remove(savedKey);
                this.put(savedKey, savedValue);
                return savedKey;
            }
            else {
                savedKey = this.higherKey(x);
                this.remove(savedKey);
                return savedKey;
            }
        }

La méthode se situe dans une classe qui est une extension de TreeMap, si cela fait une différence ... Des idées pour lesquelles je ne peux pas renvoyer null ici?

34
Ryan Yu

int est une primitive, null n'est pas une valeur qu'il peut prendre. Vous pouvez changer le type de retour de la méthode pour renvoyer Java.lang.Integer et vous pouvez ensuite renvoyer null et le code existant qui renvoie int sera automatiquement remplacé.

Les valeurs Null sont attribuées uniquement aux types de référence, cela signifie que la référence ne pointe vers rien. Les primitives ne sont pas des types de référence, ce sont des valeurs, elles ne sont donc jamais définies sur null.

Utiliser l'encapsuleur d'objet Java.lang.Integer comme valeur de retour signifie que vous renvoyez un objet et que la référence de l'objet peut être null.

52
Nathan Hughes

int est un type de données primitif. Ce n'est pas une variable de référence pouvant prendre null valeurs. Vous devez changer le type de retour de la méthode en Integer wrapper.

2
NINCOMPOOP

Le type int est une primitive et il ne peut s'agir de null, si vous voulez renvoyer null, marquez la signature comme

public Integer pollDecrementHigherKey(int x){
      x = 10;

        if(condition){
         return x;      // this is autoboxing, x will be automatically converted to Integer
        }else if(condition2){
         return null; // Integer referes to Object, so valid to return null
        }else{
         return new Integer(x); // manually created Integer from int and then return

         }
         return 5; // also will be autoboxed and converted into Integer
  }
0
Prasad Kharkar