编写一个计算N个整数平均值的程序。程序应提示用户输入N的值,然后必须输入所有Nnumbers。如果用户输入N的非正值,则应抛出(并捕获)异常,并显示消息“N必须为正”。如果用户输入N个数字时出现任何异常,则应显示错误消息,并提示用户再次输入该号码。如果用户未输入整数,程序必须请求使用重新输入值。
我是否正确抛出异常?
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);
}
}
答案 0 :(得分:2)
由与查询异常类匹配的最内层的try/catch
语句捕获引发异常。
在这种情况下,try/catch
语句不在主方法之内。
换句话说,当抛出异常时,它会被外部捕获到主函数,并且程序将完成。
当我们在被调用函数内部出现错误时,异常特别有用,我们需要绕过返回值向调用者报告,然后不需要为错误保留值。
在这一行。
throw new InputMismatchException("Please enter again");
continue;
控件永远不会触及 continue
,因为throw
(就像return
)使控件离开方法。
如果您使用简单的throw
替换System.out.println
来描述问题,那么您的程序将按预期运行。
编辑,因为您需要一个具体示例,请考虑您的for
声明。您使用Scanner#nextInt()
获取下一个号码。
如果IllegalStateException
完成输入源,它可能会抛出Scanner
?然后:
try {
for (int i =0; i< counter; i++) {
/* … */
}
} catch (IllegalStateException ex) {
System.err.println(ex.getMessage());
}
如果发生任何IllegalStateException
,这会使控件跳转到catch
子句中,使其不费力地退出for
语句。
答案 1 :(得分:0)
这样更好还是有问题?
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);
}
}
}