Сканер выдает исключение NoSuchElementException при вызове next()

Я просмотрел другие вопросы об этом исключении, но похоже, что общая проблема заключается в том, что сканер закрывается слишком рано, чего здесь быть не может. Вот мой код с комментарием над строкой проблемы:

    public void windowOpened(WindowEvent arg0) {

    Scanner input = null;

    try {
        input = new Scanner(new File("/home/brian/workspace/Color Sampler/src/Data.txt"));
    } catch (FileNotFoundException e) {
        System.exit(1);
    }

    int i = 0;
    int nR, nG, nB;
    String nName;
    while(input.hasNextLine())
    {
        // These lines are throwing the exception
        nName = input.next();
        nR = input.nextInt();
        nG = input.nextInt();
        nB = input.nextInt();

        ColorSampler.colors[i] = new myColor(nName, nR, nG, nB); 

        i++;
    }

    ColorSampler.currentColor = ColorSampler.colors[0];
    System.out.println(ColorSampler.currentColor.red);

}

Вот исключение, которое я получаю:

Exception in thread "AWT-EventQueue-1" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:855)
at java.util.Scanner.next(Scanner.java:1364)
at WindowDestroyer.windowOpened(WindowDestroyer.java:57)
at java.awt.Window.processWindowEvent(Window.java:1972)
at javax.swing.JFrame.processWindowEvent(JFrame.java:290)
at java.awt.Window.processEvent(Window.java:1933)
at java.awt.Component.dispatchEventImpl(Component.java:4649)
at java.awt.Container.dispatchEventImpl(Container.java:2103)
at java.awt.Window.dispatchEventImpl(Window.java:2588)
at java.awt.Component.dispatchEvent(Component.java:4475)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:675)
at java.awt.EventQueue.access$300(EventQueue.java:96)
at java.awt.EventQueue$2.run(EventQueue.java:634)
at java.awt.EventQueue$2.run(EventQueue.java:632)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:108)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:119)
at java.awt.EventQueue$3.run(EventQueue.java:648)
at java.awt.EventQueue$3.run(EventQueue.java:646)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:108)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:645)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

Я не могу понять, в чем здесь может быть проблема. Кто-нибудь может помочь?


person Bobazonski    schedule 03.12.2014    source источник
comment
Ваш объект Scanner, скорее всего, не переносит значение, назначенное в вашем try/catch. Сделайте System.out.println(scanner.hasNext()); перед циклом while для проверки. Если это true, то вы знаете, в чем проблема.   -  person Drew Kennedy    schedule 03.12.2014
comment
Я случайно предоставил неправильное сообщение об исключении из предыдущего запуска. Я пересмотрел это в своем вопросе.   -  person Bobazonski    schedule 03.12.2014
comment
Похоже, ваш файл заканчивается пустой строкой, которая не содержит никаких данных, из-за чего next() выдает NoSuchElementException.   -  person Pshemo    schedule 03.12.2014
comment
В конце файла нет пустой строки. Последняя строка форматируется так же, как и остальные. Он также не проходит ни одной итерации цикла, что указывает на то, что проблема где-то в другом месте.   -  person Bobazonski    schedule 03.12.2014


Ответы (1)


В Сканере находит токены по умолчанию, используя пробелы. Когда он не может найти токен при определенном чтении, он будет продолжать читать все данные из источника, пока не найдет.

Источник из Scanner.next()

while (true) {
    String token = getCompleteTokenInBuffer(null);
    if (token != null) {
        matchValid = true;
        skipped = false;
        return token;
    }
    if (needInput)
        readInput();
    else
        throwFor();
}

Имея это в виду, убедитесь, что вы используете пробелы для определения токенов в вашем файле.

person BrendanM    schedule 03.12.2014