爪哇岛。扫描仪请求添加一行,但不打印

Java. Scanner requests an additional line but does not print it

提问人:ruh01 提问时间:6/28/2022 最后编辑:ruh01 更新时间:7/5/2022 访问量:59

问:

刚进入这个社区,这是我在这里的第一个问题,所以请耐心等待菜鸟。我创建了两个类,第一个是 Student,一个包含字段、构造函数和 getter 的基本类。第二个具有 main 方法、一个 LinkedList、一个多条目扫描程序 (for...) 和两个简单方法。 我的问题是,尽管 For 循环的最大索引为 1 (x = 0; x < 2),但扫描仪需要第三行输入和回车,但不打印第三行。我添加了两个类,也许我犯了一个错误,我将不胜感激。先谢谢你。

public class Student {

private String name;
private String surname;
private int firstMark;
private int secondMark;
private int finalExamMark;

public Student(String name, String surname, int firstMark, int secondMark, int finalExamMark) {
    this.name = name;
    this.surname = surname;
    this.firstMark = firstMark;
    this.secondMark = secondMark;
    this.finalExamMark = finalExamMark;
}

public String getName() {
    return name;
}

public String getSurname() {
    return surname;
}

public int getFirstMark() {
    return firstMark;
}

public int getSecondMark() {
    return secondMark;
}

public int getFinalExamMark() {
    return finalExamMark;
}

@Override
public String toString (){
    return this.name + " " + this.surname + " got " + this.firstMark + " at English, " + this.secondMark + " at Math and " + this.finalExamMark + " at the final exam.";
}

}


public class StudentMain {
static LinkedList<Student> courseAttend = new LinkedList<>();
static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {
    addStudent();
    printList(courseAttend);
}

private static void addStudent()  {
    for (int x = 0; x < 2; x++) {
        String s1 = scanner.nextLine();
            String[] split = s1.split("\\s");
            courseAttend.add(new Student(split[0], split[1], Integer.parseInt(split[2]), Integer.parseInt(split[3]), Integer.parseInt(split[4])));
            scanner.nextLine();
    }
    scanner.close();
    }

private static void printList(LinkedList<Student> lista) {
    for (Student elem : lista) {
        System.out.println(elem);
    }
}

}


例如,如果我输入(不带引号) “年轻的约翰 9 9 9” “Johnson Anne 8 8 8”,我按回车键,光标移动到下一行并等待另一个输入。只有在第三行和最后一次输入之后,才会显示消息,但不显示第三行。

Java 循环 java.util.scanner

评论

2赞 Stultuske 6/28/2022
scanner.nextLine();不打印,它接受输入。您不会在上次 nextLine() 调用的任何位置存储输入,那么您希望如何打印它
0赞 ruh01 6/28/2022
事实上,我不想打印第三行,只打印前两行。但是我不知道如何在键入前两行后立即关闭扫描仪。如果您能指出如何解决它,我将不胜感激,因为我尝试了许多变体而没有运气
1赞 Stultuske 6/28/2022
谁说你“必须”关闭扫描仪?关键是,在你的循环中,你对 nextLine() 进行了两次调用,但你忽略了第二次调用的信息。为什么必须输入一定的金额?因为这个: for (int x = 0; x < 2; x++) 你理解你发布的代码吗?
0赞 AddeusExMachina 6/28/2022
为什么在addStudent() for循环中放了两次?scanner.nextLine();
0赞 ruh01 6/28/2022
我尝试没有第二个扫描仪.nextLine();但它会抛出一个异常,即 ArrayOutOfBounds,索引 1 越界。因此,下一步是跳过对 nextline() 的第二次调用,并在数组级别的某个地方查找错误。

答:

0赞 xthe_white_lionx 7/5/2022 #1
  1. courseAttend 应该像你的方法论证一样,因为两者都可以是一个 ArrayList,如果它们不必分开,这是实现变量的正常方式,就像你的情况一样。List<Student> courseAttend = new ...List<>();printList(List<Student> students)

  2. 循环有两个 nextLine(),但您忽略了第二个,因此您正在创建一个学生并等待下一个输入,而不是保存输入

  3. 当用户必须为任何给定的提示输入多个参数时,您可能会有拼写错误。您的提示要求用户输入 5 个参数,并且它们甚至不是来自用空格分隔的单行上的同一类型。如果用户不小心给你一个无效的输入,比如一个整数作为名称或一个字符串作为标记,该怎么办?

    public class StudentMain {
        static List<Student> courseAttend = new LinkedList<>();
        static Scanner scanner = new Scanner(System.in);
    
        public static void main(String[] args) {
            for (int x = 0; x < 2; x++) {
                courseAttend.add(createStudent());
            }
            scanner.close();
            printList(courseAttend);
        }
    
        private static Student createStudent(){
            System.out.print("name: ");
            String name = scanner.nextLine();
            System.out.print("surname: ");
            String surname = scanner.nextLine();
            System.out.print("first mark: ");
            int firstMark = scanner.nextInt();
            System.out.print("second mark: ");
            int secondMark = scanner.nextInt();
            System.out.print("final exam mark: ");
            int finalExamMark = scanner.nextInt();
    
            return new Student(name, surname, firstMark, secondMark ,finalExamMark);
         }
    
         private static void printList(List<Student> students) {
             for (Student elem : students) {
                 System.out.println(elem);
             }
         }
    }
    

评论

0赞 ruh01 7/14/2022
然而,在循环的第一次迭代完成后,扫描仪会跳过名字并跳转到姓氏。它显示“name: surname: ”已连接,无法输入名称,只能在姓氏之后输入
0赞 ruh01 7/14/2022
解决方案是添加 scanner.nextLine();在 int finalExamMark = scanner.nextInt() 之后;