Problème avec la fonction scanner

aliostux Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, tout le monde
je viens de commencer le Java ,j'ai appris quelques variables et boucles que j'ai voulu mettre en pratique. J'ai fait un petit programme ,sauf que quand je le lance et je repasse la boucle il lit le scanner précédent ou affiche une erreur du type
"Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:658)
at project2.main(project2.java:44)"
je pense qu'il faut purger les lignes lue mais je sais pas comment le faire ni où faut t-il exactement purger?
voici mon code
import java.util.Scanner;


public class project2 {

public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println("calulateur des propriétés du photon");
System.out.println("---------------------------------------------------------------------");
char rep = ' ';
char mode;
double resultat;
double h = 6.6260*(Math.pow(10,-34));
double c = 3.00*(Math.pow(10, 8));
double en;
double lambda;
char typeconv = ' ';
char typeconv1 = ' ';
char typeconv2 = ' ';
char typeconv3 = ' ';
Scanner sc = new Scanner(System.in);
double resultat2 ;
do
{
do {
System.out.println("Que voulez vous calculer :");
System.out.println("1-Nu");
System.out.println("2-lamdba");
System.out.println("3-?E");
mode = sc.nextLine().charAt(0);
}while(mode != '1' && mode != '2' && mode != '3' );
switch(mode)
{
case '1':
{
System.out.println("entrez ?E ");
en = sc.nextDouble();
sc.nextLine();
while (typeconv!= '1' && typeconv!='2')
{
System.out.println("?E est en Joule (1) ou en eV(2)");
typeconv = sc.nextLine().charAt(0);
sc.nextLine().charAt(0);

}
if (typeconv == '1')
{resultat = en / h;}
else { resultat = ((en * (1.602*Math.pow(10, -19))) / h);}
System.out.println("Nu est égale à " + resultat + " Hz");}
break;
case '2':
{
System.out.println("entrez ?E");
en = sc.nextDouble();
while (typeconv1!= '1' && typeconv1!='2')
{
System.out.println("?E est en Joule (1) ou en eV(2)");
sc.nextLine();
typeconv1 = sc.nextLine().charAt(0);
sc.nextLine();
}
if (typeconv1 == 1)
{resultat = (h*c)/en;}
else { resultat = ((h*c)/(en * (1.602*Math.pow(10, -19))));}
System.out.println("lambda est égale à " + resultat + " m");
}
break;
default:
{
System.out.println("entrer lambda");
lambda = sc.nextDouble();
sc.nextLine();
while (typeconv2!= '1' && typeconv2!='2')
{
System.out.println("? est en m (1) ou en nm(2) ?");
typeconv2 = sc.nextLine().charAt(0);
}
if (typeconv2 == 1)
{resultat = (h*c)/ lambda;}
else { resultat = ((h*c)/(lambda * (Math.pow(10,-9))));
typeconv3= sc.nextLine().charAt(0);
sc.nextLine();
}
if(typeconv3 == 'O')
{ resultat2 = resultat / (1.6*Math.pow(10, -19));
System.out.println(resultat2 + " eV"); }
else System.out.println("ok");}}
do
{
System.out.println("voulez vous recommencer ?(O/N)");
rep = sc.nextLine().charAt(0);
sc.nextLine();
}while(rep != 'O' && rep != 'N');
sc.nextLine();
}while(rep == 'O');
System.out.println("au revoir!");}}

Merci d'avance pour votre aide
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Avant d'utiliser chatAt(0) il faut être sûr que ta chaîne de caractère n'est pas vide.

Par exemple :

String line = sc.nextLine();
mode = line.isEmpty() ? '#' : line.charAt(0);
0