2015-04-30 2 views
0

Я пишу программу, которая в основном выступает в качестве почтового клиента как часть домашнего задания для класса в java. Я обычно не прибегаю к Интернету, чтобы отвечать на мои вопросы, но это то, что выходит за рамки того, что профессор пытается заставить нас учиться/практиковать, и мне нужно найти способ исправить это.Почему сканер не находит строку после первой итерации?

Проблема: если я запустил программу и введите вторую команду (ri), она предложит мне номер, а затем закончить, показывая сообщение, но сразу же после того, как она вернется во вторую итерацию методы .run() консоль возвращается:

Exception in thread "main" java.util.NoSuchElementException: No Line Found 
    at java.util.scanner.nextLine(Unknown Source) 

Вот код (я только в то число важных вещей ... или по крайней мере то, что я думаю, что это важно).

public class CmdLoop { 

    private MailClient _client; 
    Scanner kbd; 
    private Hashtable<String, ICommand> _commands = new Hashtable<String, ICommand>(); 

    public CmdLoop(MailClient client) { 
     _client = client; 
     _commands.put("h", new client.cmd.Help()); 
     _commands.put("ri", new client.cmd.ReadInbox()); 
     kbd = new Scanner(System.in); 
    } 

    public void run2() { 
     System.out.print("\nMail: "); 
     String command = kbd.nextLine(); 
     ICommand call = _commands.get(command); 
     if (command.equals("q")) 
      return; 
     else if (call == null) 
      System.out.println(command + " not understood, type h for help"); 
     else if (call.equals("")) 
      System.out.println(command + " not understood, type h for help"); 
     else call.run(_client); 
     this.run2(); 
    } 

и п класс:

public class ReadInbox implements ICommand { 

    @Override 
    public void run(MailClient client) { 

     Scanner sc = new Scanner(System.in); 
     MailBox in = client.getInbox(); 
     if(in.count() < 1) 
      System.out.println("Inbox empty"); 
     else { 
      System.out.print("Enter the number of the message you would like to read: "); 
      int n = Integer.parseInt(sc.nextLine()); 
      if(n > in.count()) 
       System.out.println("Message number " + n + " can't be found"); 
      else 
       in.getMessage(n - 1).show(); 
     } 
     sc.close(); 

    } 

} 

В основном это доходит до конца вызова ReadInbox.run(), то он вызывает this.run2(), возвращается к началу, выходы " Mail: ", а затем возвращает ошибку. Это то, что консоль выглядит в моем тесте:

Mail: ri 
Enter the number of the message you would like to read: 1 
Date: 2015/04/29 20:24:17 
From: Charles Barkley (Charlie) <[email protected]> 
Subj: testerino 
this is another test 


Mail: Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at client.CmdLoop.run2(CmdLoop.java:28) 
    at client.CmdLoop.run2(CmdLoop.java:37) 
    at Main.main(Main.java:29) 

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

+0

Покажите нам свой 'main()', а также покажите нам, какая строка вызывает исключение. – alfasin

ответ

0

В соответствии с documentation a Scanner выдаст это исключение «если линия не была найдена». Вы можете предотвратить это, сначала позвонив kbd.hasNextLine(), который скажет вам, есть ли что-то, что можно получить. Это будет ждать ввода строки, пока сканер не будет закрыт.

Попробуйте это в методе run2:

String command = null; 
    if (kbd.hasNextLine()) 
     command = kbd.nextLine(); 
    ICommand call = _commands.get(command); 
0

Я нашел ответ. Я избавился от sc.close(); в классе ReadInbox. Я знаю, почему это работает, но это так. Если у кого-то есть объяснение, чтобы предложить, высоко ценится, в противном случае, независимо от того, по крайней мере, он работает.

Смежные вопросы