簡體   English   中英

NoSuchElementException掃描儀Java

[英]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();


    }

}

請幫助我哪里出問題了。

似乎您的測試文件包含的數據少於您嘗試讀取的數據,因為這就是拋出此異常的原因。 最好使用hasNext()方法檢查輸入中是否有下一個元素。

這里的問題是Scanner類使用內部緩沖區。 您在Factory類中創建一個Scanner對象。 Scanner從基礎FileInputStream讀取到其自己的緩沖區中。 我懷疑您的輸入文件太小,以至於整個文件都適合此緩沖區。 這意味着Factory中的Scanner將讀取整個FileInputStream 之后,使用相同的FileInputStreamEmployee類中創建一個新的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM