我正在做一些我们必须使用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)
**哦..我应该提一下,它甚至不会在抛出错误之前提供输入数据的选项
答案 0 :(得分:2)
问题出在您的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
或者如果您不希望关闭它,则不要关闭它。更多内容可以阅读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();
}