Exception in thread "main" [Débutant Java] [Résolu/Fermé]

Signaler
Messages postés
37
Date d'inscription
vendredi 22 juin 2012
Statut
Membre
Dernière intervention
19 avril 2018
-
Messages postés
37
Date d'inscription
vendredi 22 juin 2012
Statut
Membre
Dernière intervention
19 avril 2018
-
Bonjour, je débute dans la programmation sous Java. J'ai essayé de m'exercer un peu et comme le conseil un tutoriel sur le Site du Zero, faire un convertisseur Celsius - Fahrenheit et vice-versa.
Cependant j'ai une erreur quand je le lance :
"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at Convertisseur.main(Convertisseur.java:27)"

Voici mon programme (comme vous pourrez le constater, il n'est pas terminé) :
import java.util.Scanner;


public class Convertisseur {
 public static void main(String[] args){
  Scanner sc = new Scanner(System.in);
  
  System.out.println("CONVERTISSEUR DEGRES CELSIUS ET DEGRES FAHRENHEIT");
  System.out.println("-------------------------------------------------");
  char reponse = 'O';
  do
  {
   System.out.println("Choisissez le mode de conversion :");
   System.out.println("1 - Convertisseur Celsius - Fahrenheit");
   System.out.println("2 - Convertisseur Fahrenheit - Celsius");
   int mode = sc.nextInt();
  
   if (mode == 1);
   {
    System.out.println("Temperature à convertir :");
    float temp = sc.nextShort();
    System.out.print(temp+" °C correspond à : ");
    temp = (((9*temp)/5)+32);
    System.out.println(temp+" °F.");
    System.out.println("Souhaitez-vous convertir une autre temperature ?(O/N)");
   }
   reponse = sc.nextLine().charAt(0);
  }while (reponse == 'O');
  
 }
}

J'ai remarqué que lorsqu'il n'y a que des variables String dans la boucle, il n'y a pas de problème sauf qu'il me faut un variable float pour mon calcul. Comment faire ?
Merci pour votre aide et pour vos réponses.

2 réponses

Messages postés
16163
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
22 janvier 2021
2 773
Il faut se méfier du mélange nextInt / nextLine, en effet le premier lit un entier et s'arrête (il ne va pas jusqu'à la fin de la ligne) et le deuxième lui va jusqu'à la fin de ligne, mais en commençant là où en était resté, c'est à dire à la fin de la ligne de l'entier, pas de la ligne d'après !

Ce qu'il faudrait faire c'est mettre un nextLine juste après le nextInt afin de sauter la fin de ligne de l'entier, sinon quand tu feras le nextLine tu te retrouves avec un String vide et le charAt(0) plante !

int mode = sc.nextInt();
sc.nextLine(); // on finit la ligne

Remarque : c'est pareil avec nextShort, par contre je ne vois pas pourquoi tu fais un nextShort pour récupérer un float, tu peux faire un nextFloat si tu veux !
Messages postés
37
Date d'inscription
vendredi 22 juin 2012
Statut
Membre
Dernière intervention
19 avril 2018
2
Un grand merci, tout marche très bien maintenant !
PS : J'avais mis un nextShort au lieu de nextFloat car a l'origine mon "temp" étais un Short, et j'ai ensuite oublier de changer le nextShort.
Mais vraiment, merci !