2013-08-28 3 views
-1

После поиска множества способов перезапуска программы Java внутри себя, цикл while казался самым простым. Вот пример базовой программы калькулятора Я пытаюсь это с:Проблема с попыткой перезапустить мою Java-программу

import java.util.Scanner; 
class a { 
public static void main(String args[]){ 
    boolean done = false; 
    int oper; 
    Scanner input = new Scanner(System.in); 
    System.out.println("McMackins Calc v2.0 (Now with fewer crashes!)"); 
    while (!done) 
    { 
    System.out.println("What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):"); 
    while (!input.hasNextInt()){ 
     System.out.println("Enter a valid integer."); 
     input.next(); 
    } 
    oper = input.nextInt(); 
    switch (oper){ 
    case 0: 
     done = true; 
     break; 
    case 1: 
     add addObject = new add(); 
     addObject.getSum(); 
     break; 
    case 2: 
     sub subObject = new sub(); 
     subObject.getDifference(); 
     break; 
    case 3: 
     times multObject = new times(); 
     multObject.getProduct(); 
     break; 
    case 4: 
     divide divObject = new divide(); 
     divObject.getQuotient(); 
     break; 
    case 5: 
     remain remObject = new remain(); 
     remObject.getRemainder(); 
     break; 
    case 6: 
     avg avgObject = new avg(); 
     avgObject.getAvg(); 
     break; 
    case 7: 
     interest intObject = new interest(); 
     intObject.getInterest(); 
     break; 
    default: 
     System.out.println("Invalid entry."); 
     break; 
    } 
    } 
    input.close(); 
} 
} 

Однако, это, кажется, выбросить NoSuchElementException в конце первого тайма через петлю, и происходит сбой программы. Функция этого класса состоит в том, чтобы взять исходный ввод от пользователя, чтобы определить, какой класс использовать, который определит, какую математическую операцию выполнить. Все работает отлично без петли while (!done).

Пример использования:

McMackins Calc v2.0 (Now with fewer crashes!) 
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest): 
1 
How many addends? 
1 
Enter your numbers now. 
1 
You have entered 1 addend. 
The sum is: 1.0 
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest): 
Enter a valid integer. 
Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at a.main(a.java:13) 

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

Обратите внимание, что я немного новичок на Java, поэтому моя программа довольно проста, поэтому старайтесь держать ее простой, если она может быть, или почтовый код, а затем в DETAIL объясните, что это значит, поэтому я может не только исправить эту проблему, но и будущие.

Спасибо!

EDIT:

Код отформатирован лучше в моем редакторе. Брекеты выходили на странные позиции, когда я разместил их здесь.

Поскольку очевидно a написано правильно, это мой класс add. Надеюсь, это что-то прояснит.

import java.util.Scanner; 
public class add { 
public void getSum(){ 
    Scanner input = new Scanner(System.in); 
    double total, addend; 
    int entries, count; 
    total = 0; 
    count = 0; 
    System.out.println("How many addends?"); 
    while (!input.hasNextInt()){ 
     System.out.println("Enter a valid integer."); 
     input.next(); 
    } 
    entries = input.nextInt(); 
    System.out.println("Enter your numbers now."); 

    while (count < entries){ 
     while (!input.hasNextDouble()){ 
      System.out.println("Enter a valid number."); 
      input.next(); 
     } 
     addend = input.nextDouble(); 
     total = total + addend; 
     count++; 
     if (count == 1){ 
      System.out.println("You have entered " + count + " addend."); 
     }else if (count > entries){ 
      System.out.println("You have entered too many addends! Contact program developer."); 
     }else{ 
      System.out.println("You have entered " + count + " addends."); 
     } 
    } 
    System.out.println("The sum is: " + total); 
    input.close(); 
} 
} 
+1

как насчет публикации исключения? – John3136

+0

Вы могли бы лучше форматировать код. Отступ неправильный, и неясно, где «пока» заканчивается где. – tom

ответ

2
public static void main(String args[]){ 
    boolean done = false; 
    int oper; 
    Scanner input = new Scanner(System.in); 
    System.out.println("McMackins Calc v2.0 (Now with fewer crashes!)"); 

    while (!done) { 
     System.out.println("What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):"); 
     while (!input.hasNextInt()){ 
      System.out.println("Enter a valid integer."); 
      input.next(); 
     } 
     oper = input.nextInt(); 
     switch (oper){ 
     case 0: 
      done = true; 
      break; 
     case 1: 
      System.out.println("1"); 
      break; 
     case 2: 
      System.out.println("2"); 
      break; 
     case 3: 
      System.out.println("3"); 
      break; 
     case 4: 
      System.out.println("4"); 
      break; 
     case 5: 
      System.out.println("5"); 
      break; 
     case 6: 
      System.out.println("6"); 
      break; 
     case 7: 
      System.out.println("7"); 
      break; 
     default: 
      System.out.println("Invalid entry."); 
      break; 
     } 
    } 
    input.close(); 
} 

Это, казалось, работал для меня, поэтому, возможно, ошибка что-то делать с вашими собственными классами (добавить, Divide) и т.д.

Кроме того, лучше держать условности при создании собственных классов по используя первую букву, например «Добавить» должно быть «Добавить».

Возможно, вы могли бы сделать это немного легче читать, построив общий класс «Операции», который содержит метод добавления, метод вычитания и т. Д.

EDIT: попробовать это для вашего метода добавления:

public static int add() { 
     Scanner s = new Scanner(System.in); 
     int counter = 0; 

     System.out.println("How many numbers to add?"); 
     int numCount = s.nextInt(); 

     for(int i = 0; i < numCount; i++) { 
      System.out.println("enter number"); 
      counter += s.nextInt(); 
     } 

     return counter; 
    } 
+0

Спасибо за вклад. Создание общего класса операций не похоже на плохую идею. Причина в том, что это так, потому что я просто хотел практиковать работу со многими классами, чтобы я привык к этому. Я мог бы опубликовать свой класс «add», если это поможет выяснить, где я напортачил. – 2mac

+0

Нет проблем! Да, опубликуйте свой класс добавления, и я посмотрю. Вполне возможно, что он ожидает целого раньше или наоборот. –

+0

Добавить класс теперь находится в главном сообщении. – 2mac

1

Использование bufferedreader и inputstream вместо класса Scanner. Этот класс создает множество ошибок и ошибок, поскольку иногда он принимает больше аргументов, которые вы ожидаете от него. также:

while (!input.hasNextInt()){ 
    System.out.println("Enter a valid integer."); 
    input.next(); 
} 

hasNextInt Вы используете метод неправильно, вместо этого попытаться сделать простой, а петля с булевыми и input.next() следует заменить input.nextLine().

Другое дело, вы должны проверить, если пользователь набрал целое число вместо строки или что-то в цикле while и его диапазон. Если все в порядке, вы должны изменить значение Boolean на true и заставить его выйти из цикла while.

1

Для будущих пользователей, которые задаются вопросом, как решить эту проблему, через некоторое перепрограммирования, я обнаружил, что моя проблема закрытия переменной input ДО конец цикла. Благодаря тому, что программа перезагружается на неопределенный срок и закрывается только input, эта программа работает нормально.

Благодаря ответу Бенджамина, я в настоящее время находится в процессе очистки и сокращения моего кода с помощью for петель.

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