2012-02-14 150 views
0

我在我的java项目中收到下面的异常。NoSuchElementException扫描器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); 

代码继续,所以这是主要部分。

下一个Employee类

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

downvote的任何特定原因? – 2012-02-14 07:57:47

+0

即使下面这行是空的,hasNextLine()是否返回true?你有没有试图用换行符结束文件? (即最后一行末尾没有换行符) – 2012-02-14 08:18:59

+0

将Employee类中的readDate函数更改为“while(sc。hasNextLine()) { \t empType = sc.nextInt(); \t EmpID = sc.next(); \t DeptID = sc.next(); }“和工资readData()函数作为”super.readData(); while(sc.hasNext()) salary = sc.nextDouble(); – 2012-02-14 13:15:35

回答

1

这里的问题是Scanner类使用内部缓冲区。您在Factory类中创建了一个Scanner对象。这Scanner从底层FileInputStream读取到它自己的缓冲区中。我怀疑你的输入文件很小,整个文件都适合这个缓冲区。这意味着Factory中的Scanner将通读整个FileInputStream。在此之后,您将在Employee类中使用相同的FileInputStream创建一个新的扫描仪对象。但是,第一个Scanner已经占用了该FileInputStream中的所有内容。因此,由于没有数据,Scanner会引发异常。

因此,您需要的仅仅是确保在从文件读取时使用相同的Scanner对象,而不是在同一个FileInputStream上实例化几个不同的扫描仪。

<编辑>

为了验证这种情况下,你可以尝试插入while循环内以下行Factory类:

System.out.println("Data could be read from the InputFileStream: " 
        + (empTextStreamIn.read() != -1)); 

(请注意,读取方法可以抛出IOException,所以你将不得不围绕它与一个try-catch块)

< /编辑>

+0

@ Alderath正如你猜测的一样,可以从InputFileStream中读取数据:false多次 – 2012-02-14 16:38:08

2

似乎您的测试文件包含的数据比您尝试阅读的数据要少,因为这就是为什么this exception is thrown。最好使用hasNext()方法检查输入是否有任何下一个元素。

+0

我在Factory类中使用了hasNextLine()。但仍然存在错误。 – 2012-02-14 08:03:53

+0

每次在下一个 – MByD 2012-02-14 08:15:20

+0

使用它时使用它,但它显示的值为空 – 2012-02-14 13:14:09