2015-12-23 4 views
1

Я пытаюсь сделать программу конвертации валют, которая использует методы в одном классе. Мне удалось успешно вызвать метод enterValues ​​из mainMenu, но когда этот метод завершился, мне нужно, чтобы он вернулся в главное меню. Я получаю NoSuchElement исключение при вызове моего метода MainMenu:Нет такого исключения элемента при возврате в главное меню

Exception in thread "main" java.util.NoSuchElementException: No line found 
at java.util.Scanner.nextLine(Unknown Source) 
at Conversion.mainMenu(Conversion.java:25) 
at Conversion.mainMenu(Conversion.java:34) 
at Conversion.main(Conversion.java:63) 

Вот мой код:

import java.util.Scanner; 
public class Conversion { 

    int value; 

    public void mainMenu() { 
     int menuChoice; 

     Scanner menuScan = new Scanner(System.in); 

     System.out.println("1. Enter values and type -1 to stop"); 
     System.out.println("2. Euros"); 
     System.out.println("3. Dollars"); 
     System.out.println("4. Yen"); 
     System.out.println("5. Rupees"); 
     System.out.println("6. Exit"); 

     while (!menuScan.hasNextInt() || (menuChoice = menuScan.nextInt()) > 6) { 
      menuScan.nextLine(); 
      System.err.println("Please enter a valid menu option 1 - 6: "); 
     } 

     switch (menuChoice) { 
     case 1: 

      enterValues(); 
      mainMenu(); 

     case 2: 

     } 

    } 

    public void enterValues() { 

     Scanner valueScan = new Scanner(System.in); 
     System.out.print("Enter value to convert: "); 
     value = valueScan.nextInt(); 
     System.out.println("Value entered. Returning to main menu."); 

     valueScan.close(); 

    } 

    public static void main(String[] args) { 

     Conversion conv = new Conversion(); 

     conv.mainMenu(); 

    } 

} 
+0

Можете ли вы указать, какие строки указаны в трассировке стека, и что вы указали для ввода? –

+0

Возможный дубликат [java.util.NoSuchElementException - пользовательский ввод считывателя сканера] (http://stackoverflow.com/questions/13042008/java-util-nosuchelementexception-scanner-reading-user-input) – Tom

ответ

1

Несколько вопросов на риск с вашим кодом:

  • Вы создаете более чем один сканер с System.in, а затем закрыть один из них, прежде чем вы закончите с другими сканерами, рискуя закрыть System.in.
  • Вы смешивание nextInt() с nextLine() вызовов на сканер без первой обработки конца строки маркеров правильно
  • Вы используете рекурсию, где вы не хотите его использовать - имеющий метод называют себя.

Предложения:

  • Используйте один и только один сканер на основе System.in и не закрываются, пока ваш сделано.
  • Передайте его другим методам, которые в этом нуждаются.
  • Каждый раз, когда вы вызываете на него nextInt(), позвоните по телефону nextLine() тоже сразу после того, как обработаете конец токена линии.
  • Не используйте рекурсию здесь - есть лучшие и более безопасные способы повторного вызова главного меню.
+0

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

1

Это связано с тем, что вы делаете более 1 объекта своей System.in. Вы должны попытаться использовать только один, если это необходимо, а также использовать правильный метод для элемента, который вы пытаетесь прочитать (целые числа в вашем случае). Кроме того, я бы разработал класс немного по-другому, а цикл while будет более уместным, вы также не назовете перерыв в своем коммутаторе, заставив его также выполнить случай 2 независимо от ватта. Вот некоторые примеры кода для вас работать с:

public class Main { 

    private int value; 
    private int menuChoice; 
    private Scanner menuScan; 
    private boolean stop = false; // program stops when stop == true 


    public static void main(String[] args){ 
     Main main = new Main(); 
     main.runProgram(); 
    } 

    public void printMenu() { 
     System.out.println("Enter values and type -1 to stop"); 
     System.out.println("1. Euros"); 
     System.out.println("2. Dollars"); 
     System.out.println("3. Yen"); 
     System.out.println("4. Rupees"); 
     System.out.println("5. Exit"); 
    } 

    public void runProgram() { 
     stop = false; 
     menuScan = new Scanner(System.in); 
     do { 
      printMenu(); 
      menuChoice = menuScan.nextInt(); 
      switch(menuChoice){ 
       case 1: 
        enterValues("Euro"); // enter the values and give it a string with the type of value that is being entered, so you can check for this later 
        break; 
       case 2: 
        enterValues("Dollar"); 
        break; 
       case 3: 
        enterValues("Yen"); 
        break; 
       case 4: 
        enterValues("Rupees"); 
        break; 
       case 5: 
        System.out.println("Stopping program"); 
        stop = true; 
        break; 
       default: 
        System.out.println("Please enter a valid number"); 
        break; 
      } 
     }while(!stop); 
    } 

    public void enterValues(String valueType) { 
     System.out.print("Enter value to convert: "); 
     value = menuScan.nextInt(); 
     System.out.println("Value entered. - run your conversion now. (Returning to main menu for now)"); 
     /////// run your conversion here or create a method for this and call it now. 
    } 

} 

примечание я использовал только 1 класс область действия System.in и не рекурсию для главного меню, его все в петле.

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