我在java项目中遇到以下异常。
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at com.ooad.ooadfirstassignment.Employee.readData(Employee.java:25)
at com.ooad.ooadfirstassignment.Salaried.readData(Salaried.java:16)
at com.ooad.ooadfirstassignment.Factory.<init>(Factory.java:21)
at com.ooad.ooadfirstassignment.MainClass.main(MainClass.java:25)
守则如下:
=============================================== ==
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) throws IOException
{
// TODO Auto-generated method stub
FileInputStream empTextStreamIn = null;
try
{
empTextStreamIn = new FileInputStream("Employee.txt");
}
catch(FileNotFoundException fex)
{
System.out.println("Employee File not found");
fex.printStackTrace();
}
Factory f = new Factory(empTextStreamIn);
empTextStreamIn.close();
}
}
=============================================== =====================
public class Factory
{
public Factory(FileInputStream empTextStreamIn)
{
// TODO Auto-generated constructor stub
int empType;
String EmpID = null,DeptID = null;
double salary=0;
Scanner sc = new Scanner(empTextStreamIn);
while(sc.hasNextLine())
{
empType = sc.nextInt();
switch (empType)
{
case 1:Salaried salr = new Salaried(empTextStreamIn);
salr.readData();
System.out.println("EmpType="+empType+" EmpID="+EmpID+" DeptID="+DeptID+" Salary="+salary);
代码继续,所以这是主要部分。
public class Employee
{
String EmpID, DeptID; //Unique detail for Employee class
protected Scanner sc;
Employee()
{
}
public Employee(FileInputStream empTextStreamIn)
{
// TODO Auto-generated constructor stub
sc = new Scanner(empTextStreamIn);
}
void readData()
{
String EmpID = sc.next();
String DeptID = sc.next();
}
薪水等级
public class Salaried extends Employee
{
double salary; //Unique detail for Salaried class
public Salaried(FileInputStream empTextStreamIn)
{
super(empTextStreamIn);
}
void readData()
{
super.readData();
salary = sc.nextDouble();
}
}
请在我出错的地方帮助我。
答案 0 :(得分:2)
似乎您的测试文件包含的数据少于您尝试阅读的数据,因为这就是this exception is thrown的原因。最好使用hasNext()
方法检查输入是否包含任何下一个元素。
答案 1 :(得分:1)
这里的问题是Scanner
类使用内部缓冲区。您在Scanner
类中创建了一个Factory
对象。此Scanner
从基础FileInputStream
读取到其自己的缓冲区中。我怀疑你的输入文件太小,整个文件都适合这个缓冲区。这意味着Scanner
中的Factory
会读取整个FileInputStream
。在此之后,您使用相同的Employee
在FileInputStream
类中创建一个新的Scanner对象。但是,第一个Scanner
已经消耗了FileInputStream
中的所有内容。因此,由于没有数据,Scanner
会引发异常。
所以你需要的只是确保你在从文件中读取时使用相同的Scanner
对象,而不是在同一个FileInputStream
上实例化几个不同的扫描器。
&LT;编辑&gt;
要验证是否是这种情况,您可以尝试在Factory
类的while循环中插入以下行:
System.out.println("Data could be read from the InputFileStream: "
+ (empTextStreamIn.read() != -1));
(请注意,read方法可能会抛出IOException,因此您必须使用try-catch块将其包围起来)
&LT; /编辑&gt;