Java Beginning - 扫描程序类错误

时间:2013-11-22 22:12:13

标签: java java.util.scanner

我正在做一些我们必须使用Scanner课程的作业。我能够用它来读取String,int和float。当我搬到下一阶段(下面的课程)时,我突然无法像以前那样使用扫描仪。我确实关闭了我创建和打开的任何其他扫描仪对象。谢谢你的帮助。

为什么这段代码:(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/4)

     

线程“main”java.util.NoSuchElementException

中的异常      

at java.util.Scanner.throwFor(Unknown Source)

     

at java.util.Scanner.next(Unknown Source)

     

在Grades.enterGradeNames(Grades.java:14)

     

在成绩。(Grades.java:34)

     

在Demo1.main(Demo1.java:32)

**哦..我应该提一下,它甚至不会在抛出错误之前提供输入数据的选项

3 个答案:

答案 0 :(得分:2)

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

input.next()

您必须先拨打input.hasNext();

来自documentation

  

抛出:       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或者如果您不希望关闭它,则不要关闭它。更多内容可以阅读here

答案 1 :(得分: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];
enterGradeNames();
input.close();
}

答案 2 :(得分:0)

我从“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();
}