Исключение NoSuchElement в вводе-выводе Java - PullRequest
0 голосов
/ 17 марта 2012

У меня есть этот метод, который должен прочитать из текстового файла, а затем распечатать на панели взаимодействий прочитанную информацию. Метод работает, и я получаю все данные в файле, но в конце я также получаю распечатанное исключение 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)

Я думаю, что проблема может быть в текстовом файле, который я создал. Я использую - как разделитель и в последней строке файла я не должен ставить -, то есть Оранжевый- оранжевый- Зеленое яблоко

Когда я делаю это, я больше не получаю ошибку

1 Ответ

3 голосов
/ 17 марта 2012

Одна из проблем, с которой вы столкнулись, заключается в том, что вы не проверяете hasNext каждый раз, когда используете next:

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