2016-06-07 4 views
-4

Оценка Средняя программа здесь; не может понять, как обрабатывать входные данные, такие как символы и строки; Пробовал trycatch и while/if (! Input.hasNextInt/Double). Не могу понять.Обработка ошибок Java

import java.text.DecimalFormat; 
import java.util.Scanner; 

public class GradeAvgMinMax { 

    public static void main(String[] args) { 

     double largest = Double.MIN_VALUE; 
     double smallest = Double.MAX_VALUE; 
     double sum = 0; 

      Scanner input = new Scanner(System.in); 

       do { 

        System.out.println("How many grades would you like to enter?"); 

        int num = input.nextInt(); 

        for (int i = 1; i <= num; i++) { 

         System.out.println("Enter Grade: "); 

         double grade = input.nextDouble(); 

         while (!input.hasNextInt() || !input.hasNextDouble()) { 
          System.out.println("Not a number!"); 
         } 

         while (grade < 0) { 

          System.out.println("Grade cannot be negative, please retry"); 
          System.out.println("Enter Grade: "); 

          grade = input.nextDouble(); 
         } 

         while (grade > 100) { 

          System.out.println("Grade cannot be over 100, please retry"); 
          System.out.println("Enter Grade: "); 

          grade = input.nextDouble(); 
         } 

         if (grade > largest) { 
          largest = grade;  
         } 

         if (grade < smallest) { 
          smallest = grade; 
         } 

          sum = sum + grade; 

        } 

     double average = sum/num; 
     DecimalFormat df = new 
     DecimalFormat ("#.##"); 

     System.out.println("AVG: " + df.format(average)); 
     System.out.println("MAX: " + df.format(largest)); 
     System.out.println("MIN: " + df.format(smallest)); 

     System.out.println("Would you like to run this program again? (Y/N)"); 
     } while ("Y".equalsIgnoreCase(input.next().trim())); 

       input.close(); 

    } 

} 
+0

не могу понять, что ?! –

ответ

1

Вы все это делаете неправильно.

System.out.println("Enter Grade: "); 
double grade = input.nextDouble(); 
while (!input.hasNextInt() || !input.hasNextDouble()) { 
    System.out.println("Not a number!"); 
} 

hasNextDouble() Javadoc говорит:

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

Вы находитесь в цикле, который будет работать вечно, если hasNextDouble() возвращает false, потому что ничего не меняется.

Необходимо позвонить по телефону hasNextDouble()до по телефону nextDouble(). Таким образом, nextDouble() никогда не потерпит неудачу, и вам не придется ломать исключения.

Но, когда hasNextDouble() возвращает false, вам все равно придется выбросить плохой ввод. Это проще всего сделать, позвонив по телефону nextLine().

Итак, что код должен быть что-то вроде этого:

double grade; 
for (;;) { // loop forever, i.e. until break 
    System.out.print("Enter Grade: "); 
    if (! input.hasNextDouble()) { 
     System.out.println("Not a number!"); 
     input.nextLine(); // discard bad input 
     continue; // loop back to try again 
    } 
    grade = input.nextDouble(); 
    input.nextLine(); // we only asked for one number, so discard any extra input following the number 
    if (grade < 0 || grade > 4.0) { 
     System.out.println("Number must be between 0 and 4"); 
     continue; // loop back to try again 
    } 
    break; // got good value, so exit loop 
}