0

宿題、ラボ、テストなどのユーザー入力を受け取り、それらを文字列に入れるクラス用のプログラムを作成する必要があります。また、それらを個別の「二重」数値に分割し、書き込む writeToFile メソッドを含む別のクラスがあります。生徒の成績をファイルに。

しかし、問題が発生し続けます..初めてユーザーに名前を尋ねると、問題なく動作しますが、ユーザーが do-while ループに再び入ることにした場合、「あなたの名前は何ですか」はスキップされます。 idに直接。最後の入力が文字列ではないことに関係があることはわかっています。その解決策は、「keyboard.nextLine();」を配置することです。質問の上ですが、私はそれを試しましたが、質問が尋ねられる前にユーザーに名前を尋ねるだけです..

import java.util.Scanner; 
    import java.io.*;
    import java.text.DecimalFormat;

    public class GradeApplication
    {
        public static void main(String[] args) throws IOException 
        {
            Scanner keyboard = new Scanner(System.in);

            //Define variables
            String name;
            int id;
            String homework;
            String labs;
            String tests;
            double project;
            double discussion;
          int answer;

            do
            {
                System.out.print("\nWhat is your name? ");
                name=keyboard.nextLine();

                System.out.print("\nWhat is your student ID? ");
                id=keyboard.nextInt();

                homework = keyboard.nextLine();
                System.out.println("\nPlease enter homework grades separated by spaces:");
                homework = keyboard.nextLine();

                System.out.println("Please enter lab grades separated by spaces:");
                labs = keyboard.nextLine();

                System.out.println("Please enter test grades separated by spaces:");
                tests = keyboard.nextLine();

                System.out.println("Please enter project grade:");
                project = keyboard.nextDouble();

                System.out.println("Please enter discussion grade:");
                discussion = keyboard.nextDouble();

                System.out.println("\nResults: ");
                //Call toString method
                Student_Khazma s = new Student_Khazma(name,id,homework,labs,tests,project,discussion);
                System.out.print(s.toString()); 

     //Open file         
         PrintWriter outputFile= new PrintWriter("gradeReport.txt");
         System.out.println(s.writeToFile());
         outputFile.close();

         System.out.print("\n\nWould you like to see your grade report again? (1 is yes, 2 is no): ");
         answer=keyboard.nextInt();

             System.out.print("\n\nWould you like to see your grade report again? (1 is yes, 2 is no): ");
             answer=keyboard.nextInt();

                }while(answer==1);

        }
    }
4

1 に答える 1

6

への最後の通話Scanner#nextInt():

    ...
    System.out.print("\n\nWould you like to see your grade report again? (1 is yes, 2 is no): ");
    answer=keyboard.nextInt();

} while(answer==1);

改行文字を消費しないため、 の最初の呼び出しに渡されますScanner#nextLine()。結果として、スキャン操作は入力待ちをブロックしません (詳細については、javadocを参照してください)。それを解決するには、以下を追加する必要がありますkeyboard.nextLine();:

    ...
    System.out.print("\n\nWould you like to see your grade report again? (1 is yes, 2 is no): ");
    answer=keyboard.nextInt();
    keyboard.nextLine(); // <== line added here
} while(answer==1);

への最初の呼び出しがnextLine()入力をブロックするように (ループが再起動したとき)。

于 2013-07-20T04:35:07.300 に答える