扫描仪类错误

我正在做一些家庭作业,我们必须使用Scanner类。 我能够使用它来读取一个字符串,一个int和一个浮点数。 当我进入下一阶段(下面的课程)时,我突然无法像以前那样使用扫描仪。 我确实关闭了我创建和打开的任何其他扫描仪对象。 感谢您的任何帮助。

为什么这个代码:(nextLine()也不起作用)

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

public class Grades {
private int len;
private String [] gradeNames;
private int [] gradeArray;
private int enterGradeNames(){
    Scanner input = null;
    input = new Scanner(System.in);
    for (int i = 0; i < len; ++i){
        System.out.println("Enter the type of grades you will be reporting: (" + 
                (i + 1) + " of " + gradeArray.length + ")" );
        gradeNames[i] = new String(input.next() );
    }
    input.close();
    return 0;
}
protected int displayGradeNames(){
    System.out.println("Type of Grades tracking");
    for (int i = 0; i < len; ++i)
        System.out.println(gradeNames[i]);
    return 0;
};
public Grades(){
    len = 0;
    Scanner input = null;
    input = new Scanner(System.in);
    System.out.println("Enter the size of the grade array to be created");
    len = 4;
    gradeArray = new int[len];
    gradeNames = new String[len];
    input.close();
    enterGradeNames();
}

}

给我这个错误:

输入您将要报告的成绩类型:(1 of 4)

线程“main”java.util.NoSuchElementException中的异常

在java.util.Scanner.throwFor(未知源)

在java.util.Scanner.next(未知源)

在Grades.enterGradeNames(Grades.java:14)

在Grades。(Grades.java:34)

在Demo1.main(Demo1.java:32)

**哦,我应该提到的是,它甚至没有在抛出错误之前给出输入数据的选项


问题出在你的enterGradeNames()方法中:

input.next()

你必须先调用input.hasNext() ;

从文档:

抛出:NoSuchElementException - 如果没有更多的标记可用。

编辑:根据意见

我无法重现该问题,但代码中有许多不必要的行,因此请尝试运行此编辑的代码并查看它是否更改了任何内容。

public class Grades {
private int len;
private String [] gradeNames;
private int [] gradeArray;

private int enterGradeNames(){
    Scanner input = new Scanner(System.in);
    for (int i = 0; i < len; i++){
        System.out.println("Enter the type of grades you will be reporting: (" + 
                (i + 1) + " of " + gradeArray.length + ")" );
        gradeNames[i] = new String(input.next());
    }
    return 0;
}

public Grades(int length){
    this.len = length;
    gradeArray = new int[len];
    gradeNames = new String[len];
}

在构造函数中调用非静态方法通常不是很好的选择,因为对象还没有完成。 你可以在(工厂)方法中做到这一点:

public static Grades buildGrades(){
    Scanner s = new Scanner(System.in);
    System.out.println("Enter size:");
    int size = s.nextInt();
    Grades grades = new Grades(size);
    grades.enterGradeNames();

    return grades;
}

EDIT2:

我搜索了一下,这个问题可能与您关闭Scanner 。 因为如果您在Scanner上调用close,它会查看它的流是否实现Closeable ,如果是,它也会关闭它。 我从来没有想过System.in是可以关闭的,但它是。

所以最好的选择? 可能为整个程序使用一个Scanner ,或者如果您不希望其流关闭,请不要关闭它。 更多可以在这里阅读。


试试这个:

public Grades(){
len = 0;
Scanner input = null;
input = new Scanner(System.in);
System.out.println("Enter the size of the grade array to be created");
len = 4;
gradeArray = new int[len];
gradeNames = new String[len];
enterGradeNames();
input.close();
}

我从你的“Grades”构造函数中删除了输入参考,因为它没有用处两次(在enterGradeNames中你再次启动它)。 问题是你关闭了构造函数的资源,然后试图重新创建它。

public Grades(){
    len = 0;
    System.out.println("Enter the size of the grade array to be created");
    len = 4;
    gradeArray = new int[len];
    gradeNames = new String[len];
    enterGradeNames();
}
链接地址: http://www.djcxy.com/p/96091.html

上一篇: Scanner Class Error

下一篇: Scanner next() confusion