/** * 编写一个Java应用程序的方法,该方法接收从键盘输入的自然数: * 如果输入的数不是自然数。抛出异常,提示“请正确输入数字!”,然后继续等待用户输入。 * 如果输入的数为正数,则显示这个数,程序继续运行。 * 如果输入为负数,抛掷自定义的异常,输出错误信息后,程序终止运行。 * 如果输入的数为0,则程序终止运行。注:本题中,0不当作自然数 * 当程序终止运行时,会显示"程序退出,Bye!"。 */ import java.util.*; public class TestException { static double d; public static void main(String [] args){ System.out.println("请输入一个数字:"); //首先通过调用testA()方法,要求能接收键盘输入的数,并对输入进行异常捕获,以确定输入的是数字。 double dd = TestException.testA(); // System.out.println(dd); try { //此处调用testB()方法,可用来判断在testA()方法中输入的数是否是自然数 int n = TestException.testB(dd);// System.out.println(n + " 是自然数"); } catch (MyException e) { // TODO Auto-generated catch block System.out.println("程序退出,Bye!"); e.printStackTrace(); } } public static int testB(double dd)throws MyException{ int n = (int)dd; // System.out.println(n); if(dd < 0){ throw new MyException("输入的是负数,非法!"); } else if(dd == 0){ throw new MyException("输入的是0!"); } else if(n == dd){ return n; } else{ throw new MyException("不是自然数"); } } public static double testA(){ //判断输入的是不是数字 Scanner in = new Scanner(System.in); /**起初,把Scanner 的对象定义成了static 的类成员变量, * 结果本方法中递归调用时出现循环错误,即不能二次接收try中键盘输入 * 分析: */ try{ d = in.nextDouble(); return d; }catch (InputMismatchException e) { System.out.println("请输入数字:"); testA(); //能过catch捕获,如果输入的不是数字,则重新调用输入方法,并要求重新输入 } //如果输入的是数字,即可与double类型匹配,便不会报异常,可直接返回 return d; } }