スキャナーにループで入力を取得させようとしています。ユーザーが終了したい場合は、このループを終了できます。私はそれを行うためにさまざまな方法を試しましたが、常にいくつかの問題があります。これはコードです:
_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]");
}
}
_
上記のコードの問題は、私が試したさまざまなメソッドでも発生しますが、ユーザーが[〜#〜] y [〜#〜]と入力すると、Scanner
がスキップされます名の最初の入力、および姓にジャンプします。ユーザーが[〜#〜] n [〜#〜]と入力すると、ループは正しく停止します。これが発生する理由と、Scanner
クラスの使用を克服する方法を誰かが説明できますか?
ps:while(sc.nextLine().equals("Y"))
のようなことを行うと、ループの最初の実行後、ユーザーから入力を取得する前にループが終了します。
_Scanner#next
_ メソッドを使用しているためです。そして、そのメソッドのドキュメントを見ると、読み込まれた次のトークンが返されます。
したがって、next
メソッドを使用してユーザー入力を読み取る場合、最後にnewline
を読み取ることはありません。次に、while
ループ内のnextLine()
によって読み取られます。したがって、あなたのfirstName
には、知らないうちにnewline
が含まれています。
したがって、whileではnextLine()
ではなくnext()
を使用する必要があります。
nextInt
メソッドの場合も同様です。また、改行も読みません。したがって、read
を使用してreadLine
し、_Integer.parseInt
_を使用してint
に変換できます。入力値をNumberFormatException
に変換できない場合は、int
をスローできます。したがって、それに応じて処理する必要があります。
以下のコードを試すことができます:-
_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]");
}
_
ただし、1つ注意してください。_Integer.parseInt
_に渡せない値を入力すると、例外が発生し、その入力はスキップされます。その場合は、while
ループを使用して処理する必要があります。
または、その例外処理を行いたくない場合:-
empty sc.nextLine()
の後にsc.nextInt()
を追加すると、次のように、残りのnewline
を消費します。-
_ // 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(..)
を使用します小文字であり、その逆も同様です。sc.next()
は次のスペースまでしか読み取らないため、sc.nextLine()
は次のスペースまでしか読み取れないため、next()
ではなくnextLine()
を使用しないでください。次の_\n
_休憩まで。nextInt()
はnextInt()
と似ているため、next()
はすべてのデータをString
として読み取ってから変換しないでください。 \ n。このようにしてみてください:
_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();
}
}
あなたは使うことができます
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;
}
}
}
これにより、入力があったときにプログラムが停止します。
"n"
また、次のようにスキャナーをインポートして作成する必要があります。
//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