Java程序计算平均值与例外

问题描述:

编写一个计算N个整数平均值的程序。程序应该提示用户输入N的值,然后必须输入所有Nnumbers。如果用户为N输入了非正值,则应该抛出(并捕获)出现“N必须是正数”消息的异常。如果在用户输入N个号码时有任何异常,则应显示错误消息,并且用户提示再次输入号码。如果用户没有输入整数,程序必须请求使用重新输入值。Java程序计算平均值与例外

我是否正确地抛出异常?

import java.util.Scanner; 
import java.util.InputMismatchException; 

class Playground { 
    public static void main(String[ ] args) { 
     int sum = 0, mean; 
     System.out.println("Please enter number of integers"); 
     Scanner sc1 = new Scanner(System.in); 
     int counter = sc1.nextInt(); 

     if (counter <= 0) { 
      throw new InputMismatchException("N must be positive"); 
     } 
     else { 
      System.out.println("Please enter "+counter+" numbers"); 
     } 

     for (int i =0; i< counter; i++) { 
      int inputnum = sc1.nextInt(); 
      if (inputsum <= 0){ 
       throw new InputMismatchException("Please enter again"); 
       continue; 
      } 
      sum = sum+inputnum; 
      System.out.println(); 
     } 


     mean = sum/counter; 

     System.out.println(mean); 

    } 
} 
+2

不,你做得不对。从你的问题:“*应该被抛出(**和被捕获**)*” -​​ 你没有捕捉到异常。 'throw'后的'continue'实际上是无法访问的代码。 – Maroun

+1

用'System.err.println(“请再次输入”)替换'throw new InputMismatchException(“请再次输入”);'和everthing将按预期工作。阅读有关例外的教程。 – clemens

+1

虽然你想要求你的用户再次输入输入,你的for循环仍然在滴答滴答。另外,即使这个数字不是正数,你仍然把它加到你的总和中,而你应该丢弃它。除了别人提到的异常处理之外,这些还有其他一些问题。 – Nishit

抛出的异常被由最内层try/catch声明该异常类相匹配抓到。 在这种情况下,try/catch声明不在您的主要方法中。 换句话说,当抛出异常时,它会被捕获以外的的主要功能,并且你的程序将完成。

当我们在被调用的函数中出现错误时,异常特别有用,我们需要将它报告给调用者绕过返回值,然后不需要为错误保留一个值。

在这一行。

throw new InputMismatchException("Please enter again"); 
continue; 

continue永远不会被控制,因为throw(如return)达到使控制退出方法。

如果用一个简单的System.out.println代替throw来描述问题,那么程序将按照您的预期工作。

编辑:因为您需要一个具体的例子,请考虑您的for声明。您使用Scanner#nextInt()获取下一个号码。 如果Scanner完成其输入源,它可能会抛出IllegalStateException?然后:

try { 
    for (int i =0; i< counter; i++) { 
       /* … */ 
    } 
} catch (IllegalStateException ex) { 
    System.err.println(ex.getMessage()); 
} 

如果任何IllegalStateException发生,这使得catch子句中的控制跳跃,使其走出for声明没有努力。

+0

感谢您的回复。它现在总是有意义的,但在问题本身中有一些提供。抛出: InputMismatchException - 如果下一个标记与Integer正则表达式不匹配或超出范围NoSuchElementException - 如果输入已耗尽IllegalStateException - 如果此扫描器已关闭。所以我只是想知道,如果我可以通过尽可能恰当地使用这些问题来让我的程序更好或更有效地解决问题? –

+1

如果你的程序没有为某个东西提供一个“接口”,但在代码中使用'throw'本身是没有意义的,但它只是一个简单的程序,它接受它的输入并给出它的输出。顺便说一句,如果你真的想使用它们,你可以使用try/catch语句。我会在这个问题上给你一个例子。 – NoImaginationGuy

这样比较好还是有问题?

import java.util.Scanner; 
import java.util.InputMismatchException; 
import java.util.NoSuchElementException; 
import java.util.IllegalStateException; 

public class Calculator{ 
    public static void main(String[] args){ 
     int sum =0, mean; 
     System.out.println("Please enter no."); 
     Scanner sc1= new Scanner(System.in); 
     int counter = sc1.nextInt(); 
     if (counter <=0){ 
      throw new InputMismatchException("not valid no."); 
     } 
     else { 
      try { 
       for (int i = 0;i<counter;i++){ 
        int inputsum= sc1.nextInt(); 
        sum = inputsum+sum; 
        System.out.println(); 
       } 
       mean = sum/counter; 
       System.out.println(mean); 
      } 
      catch(IllegalStateException | NoSuchElementException | InputMismatchException e){ 
       System.err.println(e.getMessage); 
      } 
     } 
     catch(InputMismatchException e) { 
      System.out.println(e.getMessage); 
     } 
    } 
}