2014-12-03 50 views
0

我看过关于此异常的其他问题,但似乎常见的问题是扫描程序过早关闭,但在此情况并非如此。这里是我的代码,这个问题线以上评论:扫描程序在调用next()时抛出NoSuchElementException()

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) 

我想不出什么会在这里是问题。有人可以帮忙吗?

+0

您的'Scanner'对象可能没有包含try/catch中指定的值。在你的while循环之前做一个'System.out.println(scanner.hasNext());'来测试。如果它是“真的”,那么你知道问题在哪里。 – 2014-12-03 16:21:06

+0

我意外地从前一次运行中提供了错误的异常消息。我在我的问题中修改了它。 – Bobazonski 2014-12-03 16:23:52

+0

它看起来像你的文件以空行结束,它不包含导致'next()'抛出'NoSuchElementException'的任何数据。 – Pshemo 2014-12-03 16:24:31

回答

0

在扫描仪查找标记时,默认情况下使用空格。当它在特定的读取中找不到标记时,它将继续从源读取所有数据,直到它完成。从Scanner.next

源()

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

所以考虑到这一点确保您使用空格来定义您的文件标记。

相关问题