J'essaye de faire en sorte qu'un scanner prenne une entrée en boucle. Une fois que l'utilisateur veut terminer, il peut quitter cette boucle. J'ai essayé de nombreuses façons de le faire mais il y a toujours un problème. C'est le code:
private void inputEntries() {
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number = sc.nextInt();
Student student = new Student(name, surname, number);
students.add(student);
try {
addToFile(student);
} catch (Exception ex) {
Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Continue?[Y/N]");
}
}
Le problème avec le code ci-dessus, qui se produit également sur différentes méthodes que j'ai essayées, est que lorsque l'utilisateur tapeY, la Scanner
saute la première entrée du prénom et passe au nom de famille. Si l'utilisateur tapeN, la boucle s'arrête correctement. Quelqu'un peut expliquer la raison pour laquelle cela se produit et comment surmonter l'utilisation de Scanner
class?
p.s: Faire quelque chose comme while(sc.nextLine().equals("Y"))
, entraînera la fin de la boucle avant la saisie de l'utilisateur après la première exécution de la boucle.
C'est parce que vous utilisez Scanner#next
méthode. Et si vous regardez la documentation de cette méthode, elle renvoie le prochain jeton lu.
Ainsi, lorsque vous lisez l'entrée utilisateur à l'aide de la méthode next
, elle ne lit pas la newline
à la fin. Ce qui est alors lu par la nextLine()
dans la boucle while
. Et ainsi, votre firstName
contient une newline
sans que vous le sachiez.
Donc, vous devriez utiliser nextLine()
dans votre while plutôt que next()
.
Il en va de même avec nextInt
method. Il ne lit pas non plus la nouvelle ligne. Donc, vous pouvez read
utiliser readLine
et le convertir en int
en utilisant Integer.parseInt
. Il peut générer NumberFormatException
si la valeur d'entrée ne peut pas être convertie en int
. Donc, vous devez le gérer en conséquence.
Vous pouvez essayer le code ci-dessous: -
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number = 0;
try {
number = Integer.parseInt(sc.nextLine());
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
System.out.println("Continue?[Y/N]");
}
Cependant, notez une chose: si vous entrez une valeur qui ne peut pas être passée à Integer.parseInt
, vous obtiendrez une exception et cette entrée sera ignorée. Dans ce cas, vous devez le gérer en utilisant la boucle while
.
Ou, si vous ne souhaitez pas gérer cette exception: -
Vous pouvez ajouter un empty sc.nextLine()
après sc.nextInt()
, qui consommera la newline
restante, comme ceci: -
// Left over part of your while loop
String surname = sc.nextLine();
System.out.println("Enter number");
int number = sc.nextInt();
sc.nextLine(); // To consume the left over newline;
System.out.println("Continue?[Y/N]");
equalsIgnoreCase(..)
pour éviter que la casseYouNne soit en minuscule et vice versa.sc.next()
plutôt que sc.nextLine()
pour obtenir ce que vous voulez, car next()
ne lit que jusqu'à l'espace suivant, alors que nextLine()
se lit jusqu'au prochain saut \n
.nextInt()
lire toutes les données sous la forme String
puis convertissez-les car nextInt()
est comme next()
et ne lit donc pas jusqu'au prochain\n .Essayez comme ça:
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number=0;
try {
number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse
}catch(NumberFormatException nfe) {
nfe.printStackTrace();
}
System.out.println("Continue?[Y/N]");
}
public void display() {
int i, j;
for (i = 1; i <= 5; i++) {
for (j = i; j < 5; j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(i % 2);
}
for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(j);
}
System.out.println();
}
for (i = 4; i >= 1; i--) {
for (j = i; j < 5; j++) {
System.out.print(" ");
}
for (j = 1; j <= i; j++) {
System.out.print(j);
}
for (j = i - 1; j >= 1; j--) {
System.out.print(j);
}
for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(j);
}
System.out.println();
}
}
Vous pourriez utiliser
String abc = "abc";
String answer = "null";
while (abc.equals("abc")
{
if (answer.equals("n")
{
break;
}
while (answer.equals("y"))
{
//Put your other code here
System.out.print("Continue? [y/n]")
answer = input.nextLine();
if (answer.equals("n")
{
break;
}
}
}
Cela devrait arrêter le programme lorsque l'entrée est
"n"
Vous devrez également importer et créer le scanner comme ceci:
//This is how you import the Scanner
import Java.util.Scanner;
//This is how you create the Scanner
Scanner input = new Scanner(System.in);
/**
*The name
*/
"input"
/**
*is used because of
*/
input.nextLine