0

学習プログラム (これについてはよくわかりません。Java を学習するためのものでした) では、getQ を呼び出したメソッドの 2 回目の反復で入力を取得するために出力が停止しません。

これはコードです:

import java.util.Scanner;
public class pubQuizArray {
private static Scanner kb = new Scanner (System.in);
static String[] questions;
static String[][] answers;
static char ans;
static char yn;
static char[] correctAns;
static int questionNum;
static int questionNumArray;
static int numQ;
static int score;

public static void writeQuiz()
{
    getQNum();
    getQ();
}

public static void getQNum()
{
    System.out.println("How many Questions?");
    numQ = kb.nextInt();
    questions = new String[numQ];
}

public static void getAns()
{
    answers = new String[numQ][6];
    System.out.println("What are the answers?");

    System.out.print("a: ");
    answers[questionNum][0] = kb.nextLine();

    System.out.print("b: ");
    answers[questionNum][1] = kb.nextLine();

    System.out.print("c: ");
    answers[questionNum][2] = kb.nextLine();

    System.out.print("d: ");
    answers[questionNum][3] = kb.nextLine();


    correctAns = new char[numQ];
    System.out.println("What is the correct Answer?");
    correctAns[questionNum] = kb.next().charAt(0);

}

public static void getQ()
{
    questionNum = 0;
    System.out.println("What is the First Question?");
    questions[questionNum] = kb.nextLine();
    questions[questionNum] = kb.nextLine();
    getAns();
    questionNum ++;
    while(questionNum < numQ)
    {
        System.out.println("What is the next Question?");
        questions[questionNum] = kb.nextLine();
        getAns();
        questionNum ++;
    }
}

public static void askQ()
{
    questionNum = 0;
    score = 0;
    do
    {
        System.out.println("Q" + (questionNum + 1) +": " + questions[questionNum]);

        System.out.println("a: " + answers[questionNum][0]);
        System.out.println("b: " + answers[questionNum][1]);
        System.out.println("c: " + answers[questionNum][2]);
        System.out.println("d: " + answers[questionNum][3]);

        ans = kb.next().charAt(0);
        if(ans == correctAns[questionNum])
        {
            System.out.println("That was correct");
            score ++;
        }
        else
        {
            System.out.println("That was incorrect");
        }
        questionNum ++;
    }while(questionNum < numQ);
}

public static void menu()

{
    System.out.println("Would you like to write a new Quiz? y/n");
    yn = kb.next().charAt(0);
    while(yn == 'y')
    {
        writeQuiz();
        System.out.println("Would you like to play the Quiz? y/n");
        yn = kb.next().charAt(0);
        while(yn == 'y')
        {
            askQ();
            System.out.println("Would you like to play again? y/n");
            yn = kb.next().charAt(0);
        }
    }
}

public static void main(String[] args)
{
    menu();
}
}

これが出力です

Would you like to write a new Quiz? y/n
y
How many Questions?
2
What is the First Question?
asdf
asdf
What are the answers?
a: asd
b: as
c: a
d: adfs
What is the correct Answer?
a
What is the next Question?
What are the answers?
a: 

2 番目の質問が何であるかを尋ねるとわかるように、入力は許可されません。これはJavaを学ぶための単なるプロジェクトであることを覚えておいてください。

4

1 に答える 1

0

何が原因なのか完全にはわかりませんが、javadoc コメントを見てください。

Advances this scanner past the current line and returns the input that was skipped. This  
method returns the rest of the current line, excluding any line separator at the end. The 
position is set to the beginning of the next line. 

私の推測では、行間で nextLine() が呼び出されると、前の行に存在するもの (改行文字を除く) を返して、スキャナーを次の行に配置しようとします。

nextLine() 呼び出しで返される文字列の長さを出力しようとしましたが、0 でした。

本当に何かを返すかどうかを確認するために、次のように入力を提供しました

 What is the correct Answer?
 a b 

nextLine() 呼び出しは " b" 文字列を返します (スペースが必要であることに注意してください。そうしないと、入力全体が 1 つのトークンとして扱われ、kb.next() によって読み取られます)。

問題を解決するには、ユーザーからの回答を読むときに kb.nextLine().chatAt(0) を使用できます。

System.out.println("What is the correct Answer?");
correctAns[questionNum] = kb.nextLine().charAt(0);

お役に立てれば。

于 2013-08-21T17:51:31.880 に答える