[英]NoSuchElementException Scanner java
我的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();
}
}
請幫助我哪里出問題了。
這里的問題是Scanner
類使用內部緩沖區。 您在Factory
類中創建一個Scanner
對象。 該Scanner
從基礎FileInputStream
讀取到其自己的緩沖區中。 我懷疑您的輸入文件太小,以至於整個文件都適合此緩沖區。 這意味着Factory
中的Scanner
將讀取整個FileInputStream
。 之后,使用相同的FileInputStream
在Employee
類中創建一個新的Scanner對象。 但是,第一個Scanner
已經使用了該FileInputStream
所有內容。 因此,由於沒有數據,該Scanner
會引發異常。
因此,您所需要的可能只是確保從文件讀取時使用相同的Scanner
對象,而不是在同一FileInputStream
上實例化多個不同的掃描器。
<編輯>
要驗證是否是這種情況,您可以嘗試在Factory
類的while循環內插入以下行:
System.out.println("Data could be read from the InputFileStream: "
+ (empTextStreamIn.read() != -1));
(請注意,read方法可能會引發IOException,因此您必須使用try-catch塊將其包圍)
</ EDIT>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.