Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec instanceof

boucle infinie

Sujet résolu
    29 octobre 2014 à 14:42:07

    Bonjour,

    Je suis actuellement en train de faire le TP celsius fahrenheit de la partie 1. J'ai déjà des bases en java, mais je suis pas très fort, du coup je revois du début. J'aime toujours personnaliser les exercices, du coup j'ai fais un truc un peu particulier pour celui ci. Voici mon code :

    import java.util.Scanner;
    
    public class Temperatures
    {
    	public static void main (String[] args)
    	{
    		Object continuer; // Object au cas où l'utilisateur rentre autre chose que true et false
    		Scanner entree = new Scanner (System.in);
    		double celsius, fahrenheit;
    		do // grande boucle pour convertir et demander si on veut continuer
    		{
    			String choix;
    			do // demande a l'utilisateur quel type de conversion il désire faire
    			{
    				System.out.println("Quel type de conversion voulez vous faire ?");
    				System.out.println("Tappez \"CF\" pour convertir des celsius en fahrenheit");
    				System.out.println("Tappez \"FC\" pour convertir des fahrenheit en celsius");
    				choix = entree.nextLine();
    			} while(!(choix.equals("CF")) && !(choix.equals("FC")));
    			if (choix.equals("CF")) // premier cas
    			{
    				System.out.print("Combien de celsius ? ");
    				celsius = entree.nextDouble();
    				System.out.println(celsius + "°C = " + (((9.d/5.d) * celsius) + 32) + "°F");
    			}
    			else if (choix.equals("FC")) // second cas
    			{
    				System.out.print("Combien de fahrenheit ? ");
    				fahrenheit = entree.nextDouble();
    				System.out.println(fahrenheit + "°F = " + (((fahrenheit - 32) * 5.d) / 9.d) + "°C");
    			}
    			else // juste au cas où
    			{
    				System.out.println("erreur");
    			}
    			do // continuer ?
    			{
    				System.out.print("\"true\" pour continuer, \"false\" pour arrêter. ");
    				continuer = entree.next(); // next tout court car je sais pas ce qu'il entre
    			} while (!(continuer instanceof Boolean)); // est-sensé regarder s'il a entré un boolean mais ne marche pas
    // CI-DESSUS BOUCLE INFINIE !!! ne considère apparemment jamais qu'on a entré un boolean même si on rentre "true" ou "false", pas moyen de sortir de la boucle.
    		} while ((Boolean) continuer);
    	}
    }

    Voilà ! J'ai un peu expliqué en commentaires. Typiquement, quand le programme me demande si je veux continuer, si je met true comme false ça reste dans la boucle et me redemande. à croire qu'instanceof ne regarde que le type de classe et pas le type d'instance ? Moi je voudrais vérifier que la valeur stockée dans le Object correspond a un boolean... Il n'y a pas moyen ?

    En vous remerciant.

    -
    Edité par frm2 29 octobre 2014 à 14:46:50

    • Partager sur Facebook
    • Partager sur Twitter
      29 octobre 2014 à 15:32:29

      Scanner::next() retourne un String, donc continuer instanceof Boolean sera toujours false.

      Il existe Boolean.parse(String) permettant de faire la conversion. Regarde la Javadoc pour plus de détails.

      PS : tu peux utiliser le switch sur les String depuis Java 7

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        29 octobre 2014 à 15:37:38

        Comme mentionné dans la documentation Scanner.next() te retourne un String, tu n'obtiendras jamais de Boolean. Par contre tu peux faire un truc du style

        if(entree.hasNext()){
           String response = entree.next();
           Boolean continuer  = Boolean.valueOf(response)
           if(continuer){
          //TODO
        }
        }
        
        

        Edit: Merci Pinguet pour le grill :D

        -
        Edité par max-om-93 29 octobre 2014 à 15:38:31

        • Partager sur Facebook
        • Partager sur Twitter
          29 octobre 2014 à 15:57:00

          max-om-93 a écrit:

          Edit: Merci Pinguet pour le grill :D

          Il a 2 solutions comme ça :ange:
          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            29 octobre 2014 à 16:12:00

            Yep!

            N'hésite pas à nous poser des questions si tu ne comprends pas quelque chose... Et n'hésite pas à aller d'abord faire un tour sur la documentation officielle :)

            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2014 à 12:48:19

              D'accord, merci à vous deux pour vos réponses instructives. Je connaissais pas le hasnext.

              En fait Boolean.parseBoolean(String) j'avais déjà vu dans la doc mais j'avais systématiquement des erreurs je sais pas pourquoi... Je devais en faire une mauvaise utilisation :euh: 

              En effet, je vais d'avantage interroger la doc dorénavant vous avez raison ;) merci encore bonne journée.

              • Partager sur Facebook
              • Partager sur Twitter

              problème avec instanceof

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown