Pb de retour d'une méthode
Résolu
amine_marc
Messages postés
256
Date d'inscription
Statut
Membre
Dernière intervention
-
amine_marc Messages postés 256 Date d'inscription Statut Membre Dernière intervention -
amine_marc Messages postés 256 Date d'inscription Statut Membre Dernière intervention -
j'ai un programme contenant une éthode masque() qui accepte en arg une chaine de caractere sous forme "255.240.0.0", le pb est dans le retour de cette fct qui est un entier représentant le nombre différent de 255 et 0 ( dans notre exemple : 240):
private int masque(String m)
{
int masc;
int LeMasqueEst;
String bloc [];
bloc = m.split("\\.");
for(int i=0; i < bloc.length ; i++)
{
masc = Integer.parseInt(bloc[i]);
if(masc!=255 && masc!=0)
LeMasqueEst = masc;
}
return LeMasqueEst;
}
le compilateur java indique que l'erreur est dans la ligne return LeMasqueEst;
Veuillez m'aider à résoudre ce pb, et merci d'avance
private int masque(String m)
{
int masc;
int LeMasqueEst;
String bloc [];
bloc = m.split("\\.");
for(int i=0; i < bloc.length ; i++)
{
masc = Integer.parseInt(bloc[i]);
if(masc!=255 && masc!=0)
LeMasqueEst = masc;
}
return LeMasqueEst;
}
le compilateur java indique que l'erreur est dans la ligne return LeMasqueEst;
Veuillez m'aider à résoudre ce pb, et merci d'avance
A voir également:
- Pb de retour d'une méthode
- Excel retour à la ligne dans une formule - Guide
- Retour à la ligne chatgpt - Forum Réseaux sociaux
- Notepad++ retour à la ligne ✓ - Forum Bureautique
- Retour à la ligne google sheet - Forum Google Docs
- Comment faire retour sur page ✓ - Forum MacOS
4 réponses
Normalement, en plus d'indiquer où est le problème, le compilateur te dit aussi ce que c'est en l'occurrence : "The local variable LeMasqueEst may not have been initialized"
Si tu fais masque(""); tu auras bloc.length==0, donc tu ne rentreras jamais dans la boucle, car la condition i<bloc.length sera immédiatement fausse.
Si tu fais masque("255.255.255.255"); ou masque("0.0.0.0"); par exemple, tous tes masc seront égaux à 255 ou 0, dans ce cas tu ne rentres jamais dans le if.
Pour tous ces cas la variable LeMasque sera retournée alors qu'elle n'a aucune valeur ! Il faut lui en donner une...
Remarque : le compilateur ne vas pas aussi loin dans le raisonnement que je n'ai pu le faire. Pour faire le test il considérera soit que la condition du for est toujours vraie (la boucle ne se termine jamais), soit que la condition peut-être toujours fausse (la boucle peut ne jamais s'exécuter). Pareil pour la condition du if.La confiance n'exclut pas le contrôle
Si tu fais masque(""); tu auras bloc.length==0, donc tu ne rentreras jamais dans la boucle, car la condition i<bloc.length sera immédiatement fausse.
Si tu fais masque("255.255.255.255"); ou masque("0.0.0.0"); par exemple, tous tes masc seront égaux à 255 ou 0, dans ce cas tu ne rentres jamais dans le if.
Pour tous ces cas la variable LeMasque sera retournée alors qu'elle n'a aucune valeur ! Il faut lui en donner une...
private int masque(String m) { int masc; int LeMasqueEst = -1; String bloc []; bloc = m.split("\\."); for (int i=0; i<bloc.length; i++) { masc = Integer.parseInt(bloc[i]); if (masc!=255 && masc!=0) LeMasqueEst = masc; } return LeMasqueEst; }
Remarque : le compilateur ne vas pas aussi loin dans le raisonnement que je n'ai pu le faire. Pour faire le test il considérera soit que la condition du for est toujours vraie (la boucle ne se termine jamais), soit que la condition peut-être toujours fausse (la boucle peut ne jamais s'exécuter). Pareil pour la condition du if.La confiance n'exclut pas le contrôle
t'as pas oublié une accolade pour le if
if(masc!=255 && masc!=0)
{
LeMasqueEst = masc;
}
enfin je sais que moi je ferai comme ça...
et en effet le programme ne sais pas la valeur de LeMasqueEst quand masc=255 ou 0, c'est pour ça qu'il faut l'initialiser
Qui ne tente rien n'a rien
if(masc!=255 && masc!=0)
{
LeMasqueEst = masc;
}
enfin je sais que moi je ferai comme ça...
et en effet le programme ne sais pas la valeur de LeMasqueEst quand masc=255 ou 0, c'est pour ça qu'il faut l'initialiser
Qui ne tente rien n'a rien
bon j'ai compilé ce truc et ça m'a renvoyer la valeur LeMasqueEst
public class testmasc
{
//le main
public static void main(String[] args)
{
String test = "255.240.0.0";
int valeur = masque(test);
System.out.print(valeur);
}
//le programme
private static int masque(String m)
{
int masc;
int LeMasqueEst = -1;
String bloc [];
bloc = m.split("\\.");
for (int i=0; i<bloc.length; i++)
{
masc = Integer.parseInt(bloc[i]);
if (masc!=255 && masc!=0)
LeMasqueEst = masc;
}
return LeMasqueEst;
}
}
c'est un pb dans la procédure il manque le "static", je sais pas si c'est ce que vous recherchez je suis novice là dedans
Qui ne tente rien n'a rien
public class testmasc
{
//le main
public static void main(String[] args)
{
String test = "255.240.0.0";
int valeur = masque(test);
System.out.print(valeur);
}
//le programme
private static int masque(String m)
{
int masc;
int LeMasqueEst = -1;
String bloc [];
bloc = m.split("\\.");
for (int i=0; i<bloc.length; i++)
{
masc = Integer.parseInt(bloc[i]);
if (masc!=255 && masc!=0)
LeMasqueEst = masc;
}
return LeMasqueEst;
}
}
c'est un pb dans la procédure il manque le "static", je sais pas si c'est ce que vous recherchez je suis novice là dedans
Qui ne tente rien n'a rien
Effectivement, la méthode pourrait être static vu qu'elle ne fait intervenir aucune donnée interne, mais là encore ce n'est pas obligatoire, il faudrait juste changer le main en conséquence.
Mais encore une fois l'erreur n'est pas là. Il faudrait que tu testes le code de amine_marc pour voir l'erreur car dans le mien j'ai déjà corrigé l'erreur en initialisation LeMasqueEst avec -1.
Sans cette initialisation, il y aurait plusieurs cas où l'affectation LeMasqueEst = masc; ne serait jamais appelé, or on ne peux pas retourner LeMasqueEst si elle n'a pas de valeur !
public class TestMasc // Les noms de classe en majuscule { private int masque(String m) // pas static { ... } public static void main(String[] args) { TestMasc test = new TestMasc(); int valeur = test.masque("255.240.0.0"); System.out.println(valeur); }
Mais encore une fois l'erreur n'est pas là. Il faudrait que tu testes le code de amine_marc pour voir l'erreur car dans le mien j'ai déjà corrigé l'erreur en initialisation LeMasqueEst avec -1.
Sans cette initialisation, il y aurait plusieurs cas où l'affectation LeMasqueEst = masc; ne serait jamais appelé, or on ne peux pas retourner LeMasqueEst si elle n'a pas de valeur !
Ça c'est à amine_marc de le décider... Personnellement, même une fois l'erreur corrigée, je suis à peu près sûr que le programme ne fait pas ce qu'il attends.
"un entier représentant le nombre différent de 255 et 0"
La méthode actuelle renvoie le dernier de ces nombres s'il y en a plusieurs (il veut peut-être le premier), et s'il n'y a aucun de ces nombres ça renverra -1 avec mon code, mais ce n'est pas forcément non plus ce qu'il veut. Je passe bien sûr outre les Exceptions qui peuvent être trouvées avec genre de code et qui ne sont pas gérées :
Bref, une question en entraîne souvent une autre... pour l'instant ça reste non résolu ;-)
Remarque : pour les utilisateurs les plus avancés, il faut savoir que certaines classes existent déjà pour manipuler les adresses IP, plutôt que de faire manuellement des split et parseInt sans aucun contrôle !
"un entier représentant le nombre différent de 255 et 0"
La méthode actuelle renvoie le dernier de ces nombres s'il y en a plusieurs (il veut peut-être le premier), et s'il n'y a aucun de ces nombres ça renverra -1 avec mon code, mais ce n'est pas forcément non plus ce qu'il veut. Je passe bien sûr outre les Exceptions qui peuvent être trouvées avec genre de code et qui ne sont pas gérées :
masque(null); // NullPointerException masque("toto"); // NumberFormatException
Bref, une question en entraîne souvent une autre... pour l'instant ça reste non résolu ;-)
Remarque : pour les utilisateurs les plus avancés, il faut savoir que certaines classes existent déjà pour manipuler les adresses IP, plutôt que de faire manuellement des split et parseInt sans aucun contrôle !
private static Byte masque(String host) throws UnknownHostException { for (byte b : InetAddress.getByName(host).getAddress()) if (b!=0 && b!=255) return b; return null; }