Pb de retour d'une méthode

Résolu/Fermé
amine_marc Messages postés 256 Date d'inscription dimanche 21 février 2010 Statut Membre Dernière intervention 11 avril 2016 - 14 déc. 2012 à 06:34
amine_marc Messages postés 256 Date d'inscription dimanche 21 février 2010 Statut Membre Dernière intervention 11 avril 2016 - 14 déc. 2012 à 19:55
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

4 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 14/12/2012 à 08:35
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...

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
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 14/12/2012 à 10:21
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
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
14 déc. 2012 à 10:18
Elle n'est pas obligatoire lorsque l'on a qu'une seule instruction. Avec ou sans ça ne changerai rien, le problème n'est pas là.
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
14 déc. 2012 à 10:26
ah d'accord je savais pas on m'a toujours dit de faire comme ça, pour une question de lisibilité je pense
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
Modifié par totodunet le 14/12/2012 à 10:43
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
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
14 déc. 2012 à 13:00
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.

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 !
0
totodunet Messages postés 1377 Date d'inscription mercredi 18 mars 2009 Statut Membre Dernière intervention 5 mars 2020 199
14 déc. 2012 à 13:29
ok! le problème est normalement résolu donc
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
14 déc. 2012 à 13:53
Ç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 :

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;
}
0
amine_marc Messages postés 256 Date d'inscription dimanche 21 février 2010 Statut Membre Dernière intervention 11 avril 2016 2
14 déc. 2012 à 19:55
Merci vivement Monsieur KX ^^, c très gentil de votre part de nous présenter toutes ces infos... en fait, le pb c'est résolu, merci encore une fois :)
0