2010-04-12 8 views
18

Tout d'abord, je suis assez nouveau sur Java, donc désolé si cette question est tout à fait simple. La chose est: J'ai un String[] s fait en fractionnant une chaîne dans laquelle chaque élément est un nombre. Je veux lancer les objets de s en int[] n.Comment vérifier si une variable a été initialisée?

s[0] contient le nombre d'éléments que n tiendra, effectivement s.length-1. Je suis en train de le faire en utilisant une boucle foreach:

int[] n; 
for(String num: s){ 
    //if(n is not initialized){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 

Maintenant, je me rends compte que je pouvais utiliser quelque chose comme ceci:

int[] n = new int[(int) s[0]]; 
for(int i=1; i < s.length; i++){ 
    n[i-1] = (int) s[i]; 
} 

Mais je suis sûr que je serai confronté à ce "Si n n'est pas initialisé, initialisez-le" dans le futur.

+0

Si s [0] est "effectivement de longueur-1", pourquoi l'inclure? Pourquoi ne pas simplement laisser la longueur de s se représenter? – CPerkins

+0

Je suis d'accord, mais je n'ai aucun contrôle sur cette entrée. :) –

Répondre

13

Vous ne pouvez pas jeter un String à un int. Java est fortement typé, et il n'y a pas de conversion de type implicite comme vous pourriez le trouver dans un langage de script.

Pour convertir un String en un int, utilisez une conversion explicite, comme Integer.parseInt(String). Toutes les variables membres et les éléments des tableaux sont initialisés avec une valeur par défaut.

Pour les types int, la valeur est 0. Pour les types de référence (tout sous-type de Object), la valeur par défaut est null. Les variables locales n'obtiennent pas de valeur par défaut, mais le compilateur analyse le code pour s'assurer qu'une valeur est attribuée avant la lecture de la variable. Sinon, le code ne compilera pas.

Je pense que ce que vous voulez est quelque chose comme ceci:

int[] n = new int[Integer.parseInt(s[0]); 
for (int idx = 0; idx < n; ++idx) 
    n[idx] = Integer.parseInt(s[idx + 1]); 
+0

La partie concernant les types de référence doit être "types de référence (any * subtype * of Object)", car 'Object []' n'est pas une sous-classe de 'Object', mais c'est un sous-type. –

+0

Merci, après avoir joué un peu avec, j'ai trouvé que je devais faire de nouveaux Integer (s) pour le lancer. –

+2

@Javier: encore une fois: ce n'est pas "casting", c'est "conversion". –

1

Si vous initialisez vos variables ou objets à null avant d'utiliser eux,

String myVar1 = null; 
Person bobby = null; 

Vous pouvez comparer la variable ou de l'objet à ne pas nul,

if (myVar != null) { 
    // myVar has a value. 
} 
+1

seulement si elle avait été initialement et explicitement initialisée à null OU c'est un objet/membre de la classe – Yaneeve

+0

J'avais édité ma réponse, j'aurais dû être plus clair avec ma direction. –

0

Vous pouvez vérifier null:

int[] n; 
for(String num: s){ 
    if(n == null) { 
     n = new int[(int) num]; 
    } 
    n[n.length] = (int) num; 
} 

Notez que cela ne peut que ha ppen si n est un membre de la classe. S'il s'agit d'une variable locale, le compilateur ne vous laissera rien faire sans l'initialiser.

+3

Cela ne compilera pas: les variables locales ne sont * pas * définies sur "null" par défaut. (De plus, il y a le problème avec l'int-casting qui ne fonctionnera pas comme @erickson noté). –

2
int[] n = null; 
for(String num: s){ 
    if(n == null){ 
     n = new int[(int) num]; 
     continue; 
    } 
    n[n.length] = (int) num; 
} 
+0

Merci. Je ne savais pas que je pouvais attribuer null à n'importe quel type de variable. –

+0

@Javier: uniquement pour les types variables/champs de références. Donc tout sauf 'int',' boolean', 'char',' short', 'long',' float', 'double'. Les types de référence incluent 'Integer',' int [] 'et un nombre infini d'autres possibilités. – polygenelubricants

+0

@polygenelubricants merci pour la clarification, donc c'est tout sauf les types natifs, non? –

12

Vous ne pouvez pas vérifier si une variable est initialisée dans votre code, car en lisant la définition d'une variable qui pourrait ne pas avoir été initialisé conduit à une erreur de compilation.

Vous pouvez initialiser la variable à null et vérifier si cette valeur votre variable n'est pas un type primitif etnull n'est pas une valeur valide après l'initialisation.

Dans l'exemple spécifique, le deuxième code que vous avez montré serait certainement plus propre.

1

La seule chose que vous pouvez faire est de vérifier contre null. Si votre code est dans une méthode, il ne sera pas compilé si vous ne l'initialisez pas. Donc, s'il compile et fonctionne, vous savez qu'il est initialisé au moins null puis effectuez la vérification null.

1

Comme d'autres l'ont noté, la chose la plus proche d'une "bonne façon" de le faire est d'initialiser le tableau à null.

Sur d'autres points:

"n [n.length]" jetteront un "indice hors limites" exception. Les tableaux ont des éléments allant de 0 à la longueur-1. En tout cas, je pense que ce que vous vouliez dire dans le premier cas était "n [0]" et dans le second était "n [i]".

Le stockage de la taille d'un tableau dans le premier élément est probablement une mauvaise idée. Cela peut être fait pour un tableau int, mais ce serait un désordre dans un tableau String et cela ne fonctionnerait pas du tout pour un tableau booléen. Même dans le cas de l'int, vous mélangez deux choses très différentes dans la même structure de données, ce qui risque d'être source de confusion. Si la taille du tableau est fixe, "length" conserve la taille de toute façon. Si la taille du tableau est variable et que vous pensez que vous allez créer un tableau assez grand et ensuite stocker la quantité que vous utilisez réellement, il vaut mieux utiliser ArrayList, qui gère correctement les tableaux de taille dynamique.

+0

Merci pour votre réponse. Ouais, je suis arrivé à la n.length revenant toujours x, je n'ai pas compris l'implémentation de la longueur de java, maintenant que je la vois, ça fait beaucoup de sens, après tout je l'ai initialisé avec x éléments, donc n.length devrait retourne toujours x. Et ouais je suis d'accord, stocker la taille dans le premier élément est désordonné, mais je n'ai aucun contrôle sur ça (je code quelques exercices, et c'est l'entrée attendue) –

+0

Ah, les exigences non-sensales conduisent encore à un design non-sens . Cela me rappelle un cours d'économie que j'ai suivi à l'université. Un chapitre du manuel parle des coûts irrécupérables et fait remarquer que les coûts irrécupérables ne sont pas pertinents pour les plans futurs. À la fin du chapitre, il y avait un exercice qui disait: «Supposons que vous obteniez un emploi et que votre patron vous dise:« Je me fiche de ce qu'ils vous ont dit en cours d'économie! Je veux que vous preniez en compte tous nos coûts irrécupérables. 'est viré!' Est-ce que les coûts irrécupérables sont maintenant hors de propos pour vous? " – Jay

0

J'ai rencontré ce problème en vérifiant si un int a été initialisé. Dans mon programme, il était possible qu'il ait été initialisé à 0, donc vérifier if (int i = 0) ne ferait pas beaucoup de bien.

En tant que solution/solution de contournement, j'ai créé une variable boolean qui est définie lorsque int est initialisée. J'espère que cela t'aides.

Questions connexes