2011-07-20 3 views
0

Bien travaillé depuis des heures aujourd'hui, donc je pourrais manquer quelque chose de stupide, mais, à ce stade, je suis un peu aveugle avec cela et je cherche une explication pour ce comportement2 renvoie le tir dans la même fonction?

J'ai fait un exemple du problème que je suis avoir et la solution que j'ai trouvé n'est pas tout à fait une solution. Le problème: à la fonction suivante, je passe 1 comme shotCount et 9 comme Countdown le résultat lorsque je débogue, je vois le premier si exécuté, et exécutez le retour 2, mais aussi l'autre décide de courir vers et enfin retourner -1

public int getNextShot(int shotCount, int Countdown) 
    { 
     if ((shotCount == 1) && (Countdown != 10)) return 2; 
     else if (shotCount == 0) return 1; 
     else return -1; 
    } 

mais si je fais cela (mêmes paramètres), il fonctionne:

public int getNextShot(int shotCount, int Countdown) 
    { 
     int res = -2; 
     if ((shotCount == 1) && (Countdown != 10)) res = 2; 
     else if (shotCount == 0) res = 1; 
     else res = -1; 
     return res; 
    } 

Suis-je manque quelque chose ici? Merci :)

+5

Pourquoi vous n'utilisez pas accolades ? –

+0

Publiez le code appelant cette méthode, et pourquoi vous pensez avoir "2 retours de tir" (ce qui n'est pas possible en Java, du moins comme décrit). – jkraybill

+2

Êtes-vous sûr de définir les points d'arrêt aux bons endroits? Peut-être avez-vous accidentellement ignoré l'une de vos déclarations de retour tout en continuant l'exécution de code dans le débogueur, et en obtenant en fait une deuxième invocation de votre fonction? Essayez de diviser les retours à leurs propres lignes, et de définir des points de rupture sur toutes les lignes. (et comme Oleg a dit - utilisez des accolades! C'est l'une des raisons pour les * toujours * les inclure) –

Répondre

4

Parfois, le débogueur dans Eclipse agit comme son saut à la dernière ligne de l'appel de méthode, mais renvoie ensuite la valeur correcte. Par exemple, je viens de copier et coller votre code et ça s'est bien passé pour moi. Le code ci-dessous imprime 2.

public class AA { 

     public static void main(String[] args) { 

       System.out.println(getNextShot(1, 9)); 

     } 

     public static int getNextShot(int shotCount, int Countdown) 
    { 
     if ((shotCount == 1) && (Countdown != 10)) return 2; 
     else if (shotCount == 0) return 1; 
     else return -1; 
    } 
} 
+1

Cela arrive généralement parce que le compilateur fait quelques optimisations (ne sait pas sur eclipse-java, mais c'est assez commun pour android). – Voo

+0

Je pense que vous avez raison, mais avant de vous donner la meilleure réponse, je veux passer un test de plus. Est en retard maintenant je vais courir demain. et laissez-vous savoir, parce que j'ai vu ce que vous dites, mais je pense qu'il y a des moments où il prend réellement la deuxième valeur de retour. –

+0

Aussi je veux ajouter si le code comme dans le deuxième cas que j'ai montré est utilisé, ce comportement étrange n'apparaît pas, seulement vu lors de l'utilisation de plusieurs retours. –

0

Ce code est OK. Quand je lance ceci:

public static int getNextShot1(int shotCount, int Countdown) { 
    if ((shotCount == 1) && (Countdown != 10)) { 
     return 2; 
    } else if (shotCount == 0) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 
public static int getNextShot2(int shotCount, int Countdown) { 
    int res = -2; 
    if ((shotCount == 1) && !(Countdown == 10)) { 
     res = 2; 
    } else if (shotCount == 0) { 
     res = 1; 
    } else { 
     res = -1; 
    } 
    return res; 
} 
public static void main(String[] args) throws KeyStoreException, ParseException { 
    System.out.println(getNextShot1(1, 9)); 
    System.out.println(getNextShot2(1, 9)); 

} 

Je reçois

2 
2 

sur la console :) fonction Second pourrait ressembler à ceci (mot-clé final):

public static int getNextShot2(int shotCount, int Countdown) { 
    final int res; 
    if ((shotCount == 1) && !(Countdown == 10)) { 
     res = 2; 
    } else if (shotCount == 0) { 
     res = 1; 
    } else { 
     res = -1; 
    } 
    return res; 
} 
Questions connexes