Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP1 - erreur avec charAt()

Sujet résolu
    3 novembre 2008 à 14:42:56

    Bonjour,

    J'ai entrepris de faire le premier TP du cours de Java et j'ai une erreur que je n'arrive pas à corriger. Vous serez sans doute plus clairvoyants que moi.
    Voici mon code, il y a sûrement d'autres erreurs mais pour l'instant je ne voudrais être aidé que sur une :
    import java.util.Scanner;
    
    
    public class conversion {
    	public static void main(String[] args) {
    		char reponse = 'O';
    		char pret ='N';
    		int debut;
    		int fin;
    		int pas;
    		int i;
    		Scanner sc = new Scanner(System.in);
    		while (reponse == 'O'){
    			System.out.println("-------------------------------------------------------");
    			System.out.println("|    CONVERSION DEGRES CELSIUS EN DEGRES FARENHEIT    |");
    			System.out.println("-------------------------------------------------------");
    			System.out.println("A partir de :");
    			debut = sc.nextInt();
    			System.out.println("Jusqu'à :");
    			fin = sc.nextInt();
    			System.out.println("Par pas de :");
    			pas = sc.nextInt();
    			if (debut>fin) {
    				System.out.println("Opération impossible");
    			}
    			else{
    					while(pret=='N'){
    						System.out.println("Êtes vous prêt(O/N) ?");
    						pret = sc.nextLine().charAt(0);
    					}
    					
    					System.out.println("TABLE DE CONVERSION CELSIUS / FARENHEIT");
    					System.out.println("---------------------------------------");
    					System.out.println("|     Celsius     |     Farenheit     |");
    					System.out.println("---------------------------------------");
    						for (i = debut;i >= fin;i = i + pas){
    						System.out.println("|       "+i+"     |        "+conv(i)+"            |");
    						}
    					System.out.println("Voulez vous éditer une autre table(O/N) ?");
    					reponse = sc.nextLine().charAt(0);
    			}
    		}
    		System.out.print("Au revoir.");
    	}
    	public static double arrondi(double A, int B) {
    	     return (double) ( (int) (A * Math.pow(10, B) + .5)) / Math.pow(10, B);
    	}
    	public static double conv(double cel) {
    		double far = 9/5 * cel + 32;
    		return far;
    	}
    }
    




    Et l'erreur se produit au moment du "Êtes vous prêt ?" :

    Citation : eclipse

    Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
    at java.lang.String.charAt(Unknown Source)
    at conversion.main(conversion.java:29)


    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 novembre 2008 à 18:28:45

      Ca veut simplement dire que ta String est vide, tu appelle nextLine alors que l'utilisateur n'a peut etre rien entré au clavier.

      while(!sc.nextLine().startsWith("N")){
          //doSomething
      }
      

      est plus robuste et aussi plus élégant(d'après moi).
      • Partager sur Facebook
      • Partager sur Twitter
        3 novembre 2008 à 19:37:30

        Salut, tu peux aussi utiliser cette façon de faire qui fonctionne tout aussi bien ^^ :

        //tu déclare une variable de type String à côté de tes autres variables
        String chaine;
        
        //puis à la place du while tu utilise une do-while
        do{
             System.out.println("Êtes vous prêt(O/N) ?");
             chaine = sc.next();
             pret = chaine.charAt(0);
        
        //tu peux également ajouter cette ligne pour être sûr d'avoir en retour
        //une majuscule.
             pret.toUpperCase();
        
        }while(pret == 'N');
        
        • Partager sur Facebook
        • Partager sur Twitter
          3 novembre 2008 à 20:39:54

          Citation : shakhal

          Ca veut simplement dire que ta String est vide, tu appelle nextLine alors que l'utilisateur n'a peut etre rien entré au clavier.

          while(!sc.nextLine().startsWith("N")){
              //doSomething
          }
          


          est plus robuste et aussi plus élégant(d'après moi).



          Mais le nextLine n'est il pas censé justement récupérer une entrée clavier, comme expliqué dans le tutorial ?
          http://www.siteduzero.com/tutoriel-3-1 [...] -clavier.html

          Je n'ai pas compris pourquoi ça posait problème ici alors qu'en faisant comme dans le tuto (juste entrer un truc et afficher cette entrée) ça tourne.

          Tobben : le uppercase ne fonctionne pas sur mon "pret" qui est un char.
          • Partager sur Facebook
          • Partager sur Twitter
            3 novembre 2008 à 20:45:46

            Si, il permet de récuperer une chaine entrer au clavier mais nextLine ne permet ceci qu'avec des variables de types String, c'est pour cela qu'il faut également créer une variable de type char (caractère) qui sera équivalente au premier caractères de la chaine de type String grâce à charAt(0) comme dans mon exemple précedent :) .

            P.S: Autant pour moi, toUpperCase ne fonctionne que sur les String je ne m'en rapellait plus ^^ .
            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2008 à 21:23:23

              En tout cas maintenant ça marche. La boucle en do...while est en effet plus logique dans cet exercice.
              Sinon les autres qui voudraient s'inspirer de ce que j'ai écrit au début, sachez que j'ai aussi fait une erreur au niveau du for.
              Et aussi que j'ai modifié la formule qui bizarrement ne fonctionnait pas présentée ainsi, certainement un problème de priorité.

              Merci à tous les deux.
              • Partager sur Facebook
              • Partager sur Twitter

              TP1 - erreur avec charAt()

              × 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