NoSuchElementException扫描程序java

时间:2012-02-14 07:48:01

标签: 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();


    }

}

请在我出错的地方帮助我。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这里的问题是Scanner类使用内部缓冲区。您在Scanner类中创建了一个Factory对象。此Scanner从基础FileInputStream读取到其自己的缓冲区中。我怀疑你的输入文件太小,整个文件都适合这个缓冲区。这意味着Scanner中的Factory会读取整个FileInputStream。在此之后,您使用相同的EmployeeFileInputStream类中创建一个新的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;