Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de type Exception in thread "main" java.lang.String

Exception in thread "main" java.lang.StringIndexOutOfBoundsE

11 avril 2010 à 19:43:53

Bonjour les gars, J'ai un petit probleme avec ce bout de programme, il compile mais ne s'exécute pas jusqu'au bout
il y'a cette ereeur qui apparait lors de l'éxécution:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:694)
at Conversion.main(Conversion.java:46)

PLEASE HELP!!!!!!!!!!!!!!

import java.util.*;

public class Conversion
{

public static void main(String[] args)
{
double td;
double tf;
double e;
int p;
Scanner sc = new Scanner(System.in);
char reponse=' ';


System.out.println("--------------------------------------------------------------");
System.out.println("\t\tCONVERSION DEGRE °C - DEGRE °F\t\t");
System.out.println("--------------------------------------------------------------");

do
{
System.out.println("Bonjour!!!!!!");
System.out.println("\n");
System.out.println("Bienvenue sur le dernier logiciel de conversion °C - °F");
System.out.println("\n");
System.out.println("Veuillez saisir votre Température de départ\n");
td=sc.nextDouble();
System.out.println("Veuillez saisir votre Température de fin\n");
tf=sc.nextDouble();
System.out.println("Veuillez saisir votre pas de conversion\n");
p=sc.nextInt();
System.out.println("\n");

e=tf-td;

if(p<e && tf>td)
{
System.out.println("Votre température de départ est:" +td);
System.out.println("Votre température de fin est:" +tf);
System.out.println("Votre pas de conversion est:" +p);

do
{
System.out.println("\n");
System.out.println("Est-ce exact?? (O/N)");
reponse = sc.nextLine().charAt(0);
}while(reponse != 'O' && reponse != 'N');

}

else
{

System.out.println("ERREUR!!!!!");
System.out.println("Le pas de conversion doit être inférieur à tf-td");
System.out.println("tf doit être supérieur à td");

}



}while(reponse == 'O');
//System.out.println("Etes-vous prêt à commencer???");
}

}
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 19:45:46

met ton code entre des balises <code> puis on t'aidera ;)
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 19:59:17

j'ai pas compri ce que tu veux dire
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 20:07:11

pour afficher du code sur les sdz, on le met entre des balises spéciales.
Par exemple, pour java, il faut mettre:
<code type="java"><code type="java">

Puis, il fallait lire les régles du forum avant de poster
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 20:23:21

Bravo Einstein, je pense que tu lui as été super utile...

Pour revenir à ton problème, je pense qu'il provient de ta boucle ici

do
{
System.out.println("\n");
System.out.println("Est-ce exact?? (O/N)");
reponse = sc.nextLine().charAt(0);
}while(reponse != 'O' && reponse != 'N');


Plusieurs remarques :
1) println ajoute déjà un \n, donc à la limite, la première ligne est pas super utile
2) Pour ton problème, je ne sais pas comment marche ta méthode sc.nextLine(), mais à mon avis, s'il n'y a rien dans la ligne, il doit... foutre un gros null dans reponse, d'où le OutOfBoundsException que tu te paies à l'éxécution quand tu testes la valeur de reponse.
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 20:25:35

ben ce sont les régles du forum, sinon le sujet risque d'étre fermé.
http://www.siteduzero.com/forum-83-302 [...] ce-forum.html
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 20:25:35

Le message qui suit est une réponse automatique activée par un modérateur.
Les réponses automatiques permettent d'éviter aux modérateurs d'avoir à répéter de nombreuses fois la même chose, et donc de leur faire gagner beaucoup de temps.
Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter le modérateur en question par MP.


Merci d'utiliser les balises de code


Bonjour,

Les forums du Site du Zér0 disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source.
Vous avez posté un code source sans utiliser cette fonctionnalité. Pourriez-vous éditer votre message en entourant votre code des balises <code > et </code > ?

Cela aura pour effet de "colorer" votre code et donc d'en faciliter grandement la lecture. Vous aurez ainsi beaucoup plus de chances d'avoir des réponses.

Voici un exemple de code non coloré avec la balise "citation" (mauvais exemple) :

Citation

int main(int argc, char *argv[])
{
long choixOperation;

printf("Choisissez l'operation a effectuer");
/* etc. */
}



Voici maintenant le même code coloré, si vous aviez utilisé la balise "code" (bon exemple) :

int main(int argc, char *argv[])
{
    long choixOperation;

    printf("Choisissez l'operation a effectuer");
    /* etc. */
}


C'est plus clair n'est-ce pas ? :)
N'hésitez pas à éditer votre message pour changer la balise afin de colorer votre code.

Plus d'informations à ce sujet


Merci de votre compréhension :)
Les modérateurs.
  • Partager sur Facebook
  • Partager sur Twitter
Pwaite.net > Transfert de crédit téléphonique et monétisation de site web                                                                                        « I am awesome »
11 avril 2010 à 20:32:10

import java.util.*;

public class Conversion
{

      public static void main(String[] args)
      {
      double td;
      double tf;
      double e;
      int p;
      Scanner sc = new Scanner(System.in);
      char reponse=' ';


      System.out.println("--------------------------------------------------------------");
      System.out.println("\t\tCONVERSION DEGRE °C - DEGRE °F\t\t");
      System.out.println("--------------------------------------------------------------");

      do
      {
      System.out.println("Bonjour!!!!!!");
      System.out.println("\n");
      System.out.println("Bienvenue sur le dernier logiciel de conversion °C - °F");
      System.out.println("\n");
      System.out.println("Veuillez saisir votre Température de départ\n");
      td=sc.nextDouble();
      System.out.println("Veuillez saisir votre Température de fin\n");
      tf=sc.nextDouble();
      System.out.println("Veuillez saisir votre pas de conversion\n");
      p=sc.nextInt();
      System.out.println("\n");

      e=tf-td;

	if(p<e && tf>td)
	{
      System.out.println("Votre température de départ est:" +td);
      System.out.println("Votre température de fin est:" +tf);
      System.out.println("Votre pas de conversion est:" +p);

      	   do
	   {
      System.out.println("\n");
      System.out.println("Est-ce exact?? (O/N)");
      reponse = sc.nextLine().charAt(0);
	   }while(reponse != 'O' && reponse != 'N');

	}

	else
	{

	System.out.println("ERREUR!!!!!");
	System.out.println("Le pas de conversion doit être inférieur à tf-td");
	System.out.println("tf doit être supérieur à td");

	 }



      }while(reponse == 'O');
//System.out.println("Etes-vous prêt à commencer???");
    }

}
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 20:59:32

Merci
La méthode nextLine() de la classe Scanner lit l'entrée standard et s'arrête dés que elle rencontre un '\n' (retour à la ligne)
lorsque tu utilises nextInt(), tu tapes 26 + un retour à la ligne pour valider le nombre
Cependant ce retour à la ligne est un caractère : '\n' et il resté stoqué dans le buffer. Lorsque tu utilises après nextLine() (ligne 46), le scanner rencontre le '\n' donc il retourne directement le String trouvé. Mais ce String étant vide, vouloir accéder au premier caractère via charAt(0) lancera un StringOutOfBoundsException
Pour contourner le problème, tu peut ajouter un nextLine() juste après le nextInt().

Bon après on retrouve cette question chaque semaine sur le forum (j'ai eu moi aussi ce problème lors de ce TP ), cysboy doit mettre une remarque sur ce cas d'erreur dans le tutoriel (ou on doit faire une sorte de FAQ sur le forum Java)

Edit: et tu as oublié de fermer ton Scanner .
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 21:33:39

Merci
Mais cependant:
-comment dois-je fermer mon scanner??
-J'ai essayé de contourner le pb comme tu me l'as indiqué mais en vain
Que dois-je faire??
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 22:06:42

Pour fermer le scanner tu fais à la fin de ton programme
sc.close();
pour contourner le problème au lieu d'utiliser sc.nextLine() tu utilises sc.next().
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 22:11:39

Merci Yamazaki ça marche à merveille
  • Partager sur Facebook
  • Partager sur Twitter
11 avril 2010 à 22:12:02

Citation : yamazaki

pour contourner le problème au lieu d'utiliser sc.nextLine() tu utilises sc.next().


Le plus propre est encore d'instancier un nouveau Scanner à mon humble avis.
  • Partager sur Facebook
  • Partager sur Twitter
23 décembre 2010 à 23:33:28

Merci beaucoup yamazaki mon code marche enfin ^^
  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2017 à 3:37:08

Merciiiiii 

La méthode pour contourner en remplacant nextLine() par next() est très efficace 

  • Partager sur Facebook
  • Partager sur Twitter
12 mai 2017 à 5:55:57

Bonjour, c'est bien de remercier les personnes qui vous ont aidées, merci à vous, mais le fait de poster un nouveau message fait remonter le sujet. Il est préférable de cliquer sur le pousse lever pour liker le(s) message(s) qui vous a(ont) aidé(s).

Je ferme pour éviter un nouveau déterrage.

  • Partager sur Facebook
  • Partager sur Twitter