【问题标题】:NoSuchElement exception in java I/Ojava I/O 中的 NoSuchElement 异常
【发布时间】:2012-03-16 21:24:42
【问题描述】:

我有这个方法应该从 txt 文件中读取,然后在交互窗格中打印出读取的信息。该方法有效,我得到了文件中的所有数据,但最后我也得到了 java.util.NoSuchElementException 打印出来。我知道这意味着扫描仪已到达文件末尾,没有更多数据可供读取,但不知道如何解决问题。有人可以帮帮我吗?

public void parseRecord(String recordFileName){

File recordFile = null;
Fruit fruit = null;
String color = null, name = null;
Scanner sc = null;
PrintWriter output = null;      

try{    
  recordFile = new File(recordFileName);
  sc = new Scanner(recordFile);
  sc.useDelimiter("- *");

  while(sc.hasNext()){
    color = sc.next();
    name = sc.next();

    fruit = new Fruit(color, name);
    System.out.println(fruit);
  }
  sc.close();
}catch(Exception e){
  System.out.println(e);
}  

}


  java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at ReadFruits.parseRecord(ReadFruits.java:21)
at ReadFruits.main(ReadFruits.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.dynamicjava.symbol.JavaClass$JavaMethod.evaluate(JavaClass.java:362)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.handleMethodCall(ExpressionEvaluator.java:92)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.visit(ExpressionEvaluator.java:84)
at koala.dynamicjava.tree.StaticMethodCall.acceptVisitor(StaticMethodCall.java:121)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:38)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:37)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:106)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:101)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.evaluateSequence(StatementEvaluator.java:66)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:77)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:47)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:246)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:220)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我认为问题可能出在我创建的 txt 文件上。我使用 - 作为分隔符,在文件的最后一行我不应该放 -,意思是 橙-橙- 青苹果

当我这样做时,我不再收到错误

【问题讨论】:

  • 哪一行抛出异常?你能发布堆栈跟踪吗?
  • 当我捕捉到异常时,它只是将其打印出来,没有给出行,如下所示:java.util.NoSuchElementException
  • @user1181847 不要做System.out.println(e);,而是做e.printStackTrace();
  • 你能贴出代码的行号吗?

标签: java exception io java.util.scanner


【解决方案1】:

您遇到的一个问题是您没有在每次使用next 时检查hasNext

while(sc.hasNext()) {
    String color = sc.next();
    if(sc.hasNext()) {
        String name = sc.next();
        Fruit fruit = new Fruit(color, name);
        System.out.println(fruit);
    }
}

【讨论】:

  • 内部while不应该是if吗?
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 2013-06-19
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 2013-01-07
  • 2011-12-29
  • 1970-01-01
相关资源
最近更新 更多