Java中的异常处理(基础解析二)

继承中 方法重写异常

父类中抛出异常

    // 子类可以不抛出异常
    // 子类也可以抛出异常

    class Father{
        public void fun() throws Exception{

        }
    }

    class Son extends Father{
        @Override
        public void fun(){

        }
    }

父类中没有抛出异常

    //子类不能抛出异常

    class Father{
        public void fun(){

        }
    }

    class Son extends Father{
         @Override
         // 会发生编译异常
        public void fun() throws Exception{

        }
    }

子类重写父类方法时调用了一个有异常的方法

    //只能选择try...catch处理 不能抛出

    class Father{
        public void fun(){

        }
    }

    class Son extends Father{
         @Override
         public void fun(){
             try {
                 method();
             } catch(Exception e){
                 e.printStackTrace();
             }
         }

         // 带异常的方法
         public void method() throws Exception{

         }
    }

练习

    /*
    * 获取数字的工具类
    * 要求:从键盘输入 输入的是字符串要处理异常重新输入
     * 
    *封装一个有两个数的对象类
    * 要求:类中有两个int数字 作为成员变量
    * 
    * 封装自定义异常类
    * 要求:类名表示除法除数不能为0 
    * 
    * 封装运算类
    * 1.获取 两个数的对象
    * 2.获取 要做的运算法则 加法或者除法 
    *   输入数字1是加法 2是除法(输入错误 要重新输入)
    * 3.加法方法
    * 4.除法方法(要求捕获异常 并抛出自定义异常)
    * 5.根据运算法则 执行运算 并返回运算结果
    *   除数如果是0 要重新输入数字
    *   
    * 测试类:
    * 对以上方法进行测试
    */

    //获取数字的工具类
    //一般工具类里写的都是静态方法
    //一般工具类中构造方法都需要私有化构造方法

    public class IntTools{

        // 私有化构造方法
        private IntTools(){

        }

        // 这里有两种方法 使用哪种都行
        //方法一 使用递归
        public static int getIntNum{
            System.out.println("请输入数字");
            Scanner scanner = new Scanner(System.in);
            String string = scanner.nextLine();

            try{
                // 字符串转数字
                int num = Integer.parseInt(string);
                return num;
            } catch(Exception e){
             System.out.println("输入错误,请重新输入");
             // 再次调用本方法 进行数字输入
             return getIntNum();
            }
        }

        //方法二 使用循环
        public static int getIntNum2(){
            System.out.println("请输入数字");
            Scanner scanner = new Scanner(System.in);
            while(true){
                //接收从键盘输入的值
                String string = scanner.nextLine();
                try{
                    // 字符串转数字
                    int num = Integer.parseInt(string);
                    return num;
                } catch(Exception){
                    System.out.println("输入错误,请重新输入");
                }
            }
        }
    }

    // 封装一个有两个数的对象类
    // 要求:类中有两个int数字 作为成员变量
    public class MyNum{
        private int a;
        private int b;

        public MyNum(){

        }

        public MyNum(int a, int b){
            this.a = a;
            this.b = b;
        }
        public int getA() {
        return a;
    }
        public void setA(int a) {
            this.a = a;
        }
        public int getB() {
            return b;
        }
        public void setB(int b) {
            this.b = b;
        }


        @Override
        public String toString() {
            return "MyNum [a=" + a + ", b=" + b + "]";
        }
    }

    // 封装自定义异常类
    public class DivNotZeroException extends Exception {
        public DivNotZeroException(){

        }

        public DivNotZeroException(String message){
            super(message);
        }
    }

    /* 封装运算类
     * 1.获取 两个数的对象
     * 2.获取 要做的运算法则 加法或者除法 
     *   输入数字1是加法 2是除法(输入错误 要重新输入)
     * 3.加法方法
     * 4.除法方法(要求捕获异常 并抛出自定义异常)
     * 5.根据运算法则 执行运算 并返回运算结果
     *   除数如果是0 要重新输入数字
     */   
     public class Operation{
         //获取 两个数的对象
         int num = IntTools.getIntNum();
         int num2 = IntTools.getIntNum();
         Mynum myNum = new MyNum(num, num2);
         return myNum;
     }

     //获取 要做的运算法则 加法或者处罚
     //输入数字1 是 加法 2 是处罚(输入错误 要重新输入)
     public String getChooseMethod(){
         System.out.println("输入数字1是加法 2是除法(输入错误 要重新输入)");
         //这里要从键盘接收一个数字
         //可以再次调用之前那个从键盘输入的方法
         int num = IntTools.getIntNum();
         //判断数字 返回要做的运算
         if(num == 1){
             return "+";
         }else if(num == 2) {
             return "/";
         }else {
             System.out.println("只能输入1或2");
             //输入的不是1或者2 就让用户重新输入人
             return getChooseMethod();
         }
     }

     // 加法方法
     public int sum(MyNum myNum){
         return myNum.getA() + myNum.getB();
     }

     //除法方法(要求捕获异常 并抛出自定义异常)
     public int div(MyNum myNum) throws DivNotZeroException {
         try{
             return myNum.getA() / myNum.getB();
         } catch(Exception e){
             // 获取到这个异常 但是不处理
             // 交给方法的调用者去处理
             // 抛出异常 交给调用者去处理
             throw neww DivNoZeroException("除数为0")
         }
     }

     // 根据运算法则 执行运算 并返回运算结果
     // 除数如果是0 要重新输入数字
     public int getResultByOperactAndMyNum(String operact,MyNum myNum){
         // 判断操作符 去做相应的运算
         if(operact.equals("+")){
             return sum(myNum);
         }
         // 除法 如果报了异常 说明除数为0
         // 需要重新输入两个数
         try{
             return div(myNum);
         } catch(DivNotZeroException e){
            System.out.println(e.getMessage());
            System.out.println("请重新输入两个数");

            // 重新调用获取两个数对象的方法
            MyNum newNum = getMyNum();
            // 重新调用运算的方法 进行运算
            return getResultByOperactAndMyNum(operact, newNum);
         }
     }

http://blog.csdn.net/ssssssue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值