web-dev-qa-db-fra.com

Comment tester si une variable est définie?

En PHP, il existe une fonction isset. Et Java? Je pense que je peux utiliser == null avec des objets, mais qu'en est-il des types de valeur comme int

30
Jiew Meng

Le compilateur de Java ne vous permettra pas de définir des variables et de les utiliser avant de leur affecter une valeur, donc le problème n'existe pas sous la même forme qu'il existe en php.

MODIFIER

Si dans votre cas, le compilateur ne vous a pas déjà arrêté (car il s'agit par exemple d'une variable d'instance), la meilleure solution est probablement d'initialiser la variable à une valeur "spéciale" comme suggéré par Guest11239193. Comme ça:

int x = 0; // because by convention 0 is a reasonable default here

Bien sûr, ce qu'est une valeur d'initialisation "sûre et raisonnable" dépend de l'application.

Ensuite, vous pourriez

if (x == 0) { // only allow setting if x has its initial value
    x = somenewvalue;
}

Ou vous pouvez accéder à x via un setter qui empêche de changer plus d'une fois (probablement exagéré dans la plupart des cas):

private int x;
private boolean x_was_touched = false;

public void setX (int newXvalue) {
    if (!x_was_touched) {
       x = newXvalue;
       x_was_touched = true;
    }
}

public int getX() {
    return x;
}

Vous pouvez également utiliser un Integer, frère de l'objet int, qui peut être initialisé à null

Integer x = null; 

Cependant, le fait que vous pensiez avoir besoin de ces connaissances peut masquer une faille logique plus profonde dans votre programme, donc je vous suggère d'explorer la raison pour laquelle vous voulez savoir si une valeur primitive (primitive par opposition aux objets, int vs Integer) n'a pas été touché.

28
fvu

Une variable non existante n'existe pas en Java.

12
Mob

Dans Java c'est une erreur du compilateur d'utiliser une variable sans être définie.

Les variables de classe et d'instance sont initialisées avec ce qui est considéré comme une valeur "nulle" par défaut, selon le type de données.

Donc une fonction semblable à isset n'a pas de sens.

5
Paulo Pinto

Vous ne pouvez pas vérifier si la variable est définie. Vous pouvez:

  1. Initialisez la variable qui a du sens comme valeur initiale - comme 0 pour un compteur, la valeur entière maximale si vous calculez un minimum, etc.
  2. Initialisez la variable à une valeur que vous n'allez pas utiliser, par exemple -1 si vous allez utiliser des valeurs entières non signées et une chaîne vide pour une chaîne.
  3. Introduisez un indicateur booléen qui indique si vous avez commencé à faire quelque chose.
3
Guest11239193

La valeur par défaut pour int sera 0 et pour string sera "".

1
Asdfg

Vous pouvez essayer d'utiliser un objet au lieu d'une valeur primitive, c'est-à-dire.


Integer x = null;
...
public Integer getX(){
   if(x == null) {
      x = new Integer(10);
   }
   return x;
}
0
emt14

Le cas d'utilisation le plus courant de vouloir avoir une valeur non définie est lors de la récupération d'informations à partir d'une source de données. Dans toute requête SQL donnée, vous avez probablement des enregistrements qui ont des entiers dont les valeurs sont 0, mais qui peuvent également être des champs vides/nuls. Il en va de même pour les chaînes, où une chaîne vide '' n'est pas la même chose qu'une chaîne non définie ou nulle.

Il semble que l'utilisation des versions de référence d'objet des types natifs soit la seule solution ici, ce qui est regrettable car c'est désordonné. L'alternative serait de stocker un booléen pour chaque champ de données unique qui doit être vérifié et maintenu à la main, ce qui est encore pire.

0
Dread Quixadhal

Créez vos fonctions pour ce contrôle car chaque objet a ses propres règles concernant le "résultat isset ()";

Exemples :

    public static final boolean isEmpty(String x) {
        return (x == null || x.trim().equals(""));
    }
    public static final boolean isEmpty(Integer x) {
        return (x == null || x == 0);
    }
    public static final boolean isEmpty(Long x) {
        return (x == null || x == 0);
    }
    public static final boolean isEmpty(Collection<?> x) {
        return (x == null || x.size() == 0);
    }
    public static final boolean isEmpty(Map<?,?> x) {
        return (x == null || x.size() == 0);
    }
    public static final boolean isEmpty(Object[] x) {
        return (x == null || x.length == 0);
    }
0
hurricane

La variable entière déclarée dans Java, ne peut pas subir la condition pour "undefined" ou "null". Mais en utilisant le wrapper class nous pouvons l'utiliser, c'est-à-dire: Integer a = null;

public class Solution {
    public static void main(String[] args) {
        Integer max = null; //works perfectly
        int max1 == null; //throws and incompatible error 
        if (max == null)
            System.out.println("null");
    }
}
0
Nirmal Lamrin