Ошибка: NoSuchElementException

Эта программа обращается к текстовому файлу с текстовыми элементами, разделенными запятыми. Элементы регистрируются в созданных мной переменных. Кроме последнего. Затем возникает ошибка. Программа отлично работает с разделителем пробелов по умолчанию для класса сканера (текстовый файл корректируется соответствующим образом), но терпит неудачу, когда я использую запятую в качестве разделителя. Может кто-нибудь, пожалуйста, дайте некоторое представление.

Текстовые данные:

smith,john,10
stiles,pat,12
mason,emrick,12

Код:

public void openFile(String f)
    {   
        try{
            x = new Scanner(new File(f));
            x.useDelimiter(",");
        } catch(Exception e){
            System.out.println("File could not be found please check filepath");
        }

    }

public boolean checkNameRoster()
    {
        openFile(file);
        boolean b = false;
        while(x.hasNext())
        {
            String lName = x.next().trim();
            **String fName = x.next().trim();**
            String grade = x.next().trim();
            if(fName.equalsIgnoreCase(firstName) && lName.equalsIgnoreCase(lastName) && grade.equalsIgnoreCase(grade))
                {
                    b = true;
                }
        }
        closeFile();
        return b;
    }

person Patrick Stiles    schedule 24.10.2016    source источник


Ответы (1)


Проблема связана с тем, что вы вызвали x.useDelimiter(","); на своем Scanner в функции openFile().

Поскольку ваши текстовые данные:

smith,john,10
stiles,pat,12
mason,emrick,12

Scanner видит это как:

"smith,john,10\nstiles,pat,12\nmason,emrick,12"

Итак, что происходит, когда вы выполняете свой код:

1: x.hasNext() ? Yes
    x.next().trim() => "smith"
    x.next().trim() => "john"
    x.next().trim() => "10\nstiles"
2: x.hasNext() ? Yes
    x.next().trim() => "pat"
    x.next().trim() => "12\nmason"
    x.next().trim() => "emrick"
3: x.hasNext() ? Yes
    x.next().trim() => "12"
    x.next().trim() => Error!

Чтобы исправить это, вы можете либо отредактировать файл и заменить все \n на ,, либо использовать первую Scanner для получения всех строк, а другую для получения токенов, как показано здесь:

public void openFile(String f)
    {   
        try{
            x = new Scanner(new File(f)); // Leave default delimiter
        } catch(Exception e){
            System.out.println("File could not be found please check filepath");
        }

    }

public boolean checkNameRoster()
    {
        openFile(file);
        boolean b = false;
        while(x.hasNextLine()) // For each line in your file
        {
            Scanner tk = new Scanner(x.nextLine()).useDelimiter(","); // Scan the current line
            String lName = x.next().trim();
            String fName = x.next().trim();
            String grade = x.next().trim();
            if (fName.equalsIgnoreCase(firstName) && lName.equalsIgnoreCase(lastName) && grade.equalsIgnoreCase(grade))
                {
                    b = true;
                }
        }
        closeFile();
        return b;
    }
person Marco    schedule 04.09.2017