2016-06-07 64 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说:

返回true,如果在此扫描器输入信息的下一个标记可以解释为使用nextDouble()方法的双重价值。扫描仪不会超过任何输入。

如果hasNextDouble()返回false,则表示while循环将永久运行,因为没有任何更改。

您必须致电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 
}