zoukankan      html  css  js  c++  java
  • Day6:面向对象------异常

    异常:java程序在 运行 时期发生的不正常情况(问题)。
    
        java就按照面向对象的思想对不正常情况进行描述和对象的封装。
    
    问题分两种:
    Throwable:定义了对于问题的共性的功能。
        |--Error:由系统底层发生的,告诉jvm,jvm告诉使用者。不做针对性处理。直接修改代码。
        |--Exception:jvm发生,并告诉给使用者。可以进行针对性的处理。
        
        
    
    总结:
    1,运行时发生。
    2,符合面向对象,将问题描述并封装成对象。
    3,error和exception的区别。
    异常的处理。
    
    两种:
    1,遇到问题不进行具体的处理,而是继续抛给调用者。
        其实就是在函数上通过throws关键字声明异常。告诉调用者处理。
    
    
    2,针对性的处理方式:捕获!
    try
    {
        //有可能发生异常的代码。
    }
    catch(异常类  变量)
    {
        //这是真正的捕获,处理异常的代码;
    }
    finally
    {
        //一定会被执行的代码。
    }
    
    
    
    
    throw和throws有什么区别呢?
    
    1,位置不同。
    throws用在函数上,后面跟的是异常类,可以跟多个。
    throw用在函数内,后面跟的是异常对象。
    
    2,功能不同。
    throws用来声明异常,让调用者只知道该功能有可能出现的问题,并由调用者可以给出预先的处理方式。
    throw抛出具体问题对象。执行到throw功能就已经结束了,跳转到调用者。并将具体的问题对象也抛给调用者。
    
    也就说throw语句独立存在时,下面不要定义其他语句。因为执行不到。
    
    异常体系的特殊情况:
    Excpetion
        |--Error
        |--Exception
    异常体系最大的特点就是体系中的类以及类产生的对象,都具备这可抛性,可抛性的意思是可以被throws和throw所操作。
    class Demo
    {
        /*
        在编写功能时,编写者知道该功能有可能发生问题。而这个问题很容易来自于调用者传递的参数。
        而导致功能无法运行。这时发生的问题就应该让调用者知道。并最好让调用有预先的处理方式。
        所以在定义功能时,需要在功能上对有可能发生的问题进行声明。
        声明问题需要使用关键字。throws 异常类,  声明的目的:就是让调用者可以进行处理。
        */
        int div(int a,int b)throws Exception//声明异常。
        {
            
            if(b==0)
                throw new ArithmeticException("除零了,废了!");//抛出异常对象。
            return a/b;//throw new ArithmeticException("/ by zero")抛给调用者。
        }
    }
    class ExceptionDemo2 
    {
        public static void main(String[] args) //throws Exception
        {
            Demo d = new Demo();
            try
            {
                int num = d.div(4,0);
                System.out.println("num="+num);
            }
            catch (Exception e)//Exception e = new ArithmeticException("/ by zero");
            {
                //处理这个对象。可以使用该对象的方法。
                System.out.println("异常啦!");
                System.out.println(e.getMessage());//异常信息
                System.out.println(e.toString());//异常名称+异常信息
                e.printStackTrace();//名字+信息+位置。jvm默认处理收到异常就是调用这个方法。将信息显示在屏幕上。
            }
            
            System.out.println("over");
        }
    }
    异常的原则:
    1,功能内部有异常throw抛出,功能上一定要throws声明。
        内部抛什么,功能上就声明什么。
        声明的目的就是为了让调用者处理,如果调用者不处理,编译失败。
    
    2,特殊情况:
        当函数内通过throw抛出了RuntimeException及其子类的异常对象时,函数上可以不用throws声明。
        不声明的目的就是不让调用者处理。让调用者的程序停止。要对代码进行修改。
    
    
        Exception分两种:
        1,编译时会被检测的异常。
        2,运行时异常(编译时不检测)RuntimeException
    /*
    在自定义的程序中,如果有了问题。也可以像java中的异常一样。
    对问题进行描述。
    
    举例:
    定义一个功能可以实现除法运算。但是除数不可以为负数。
    */
    //将负数为除数的问题描述,自定义异常。
    class FuShuException extends RuntimeException
    {
        private int num;
        FuShuException()
        {
            super();
        }
        FuShuException(String message)
        {
            super(message);
        }
        FuShuException(String message,int num)
        {
            super(message);
            this.num = num;
        }
    
    }
    
    
    class Demo
    {
        int div(int a,int b)
        {
            if(b<0)
                throw new FuShuException("负数不可以作为除数",b);
    
            if(b==0)
                throw new ArithmeticException(" 被零除了。");
    
            return a/b;
        }
    }
    小节:
    异常:其实就将问题封装成对象。并抛给调用者。
        如果声明了,就需要调用者处理(继续声明or捕获)。
        什么时候声明,什么时候捕获?
        功能内部可以解决,就捕获,不能解决,或者解决了还必须告诉调用者问题这时就应该声明。
    /*
    try
    catch
    finally
    
    
    finally作用的是:无论是否有异常发生,都要对资源进行释放。
    资源释放动作就定义在finally代码块中。
    */
    
    
    class ExceptionDemo5 
    {
        public static void main(String[] args) 
        {
            try
            {
                int num = 4/0;
                System.out.println("num="+num);
            }
            catch (Exception e)
            {
                System.out.println(e.toString());
    //            return ;
    //            System.exit(0);//推出jvm。只有这种情况,finally也不执行。
            }
            finally
            {
                System.out.println("finally");
            }
            
            System.out.println("over");
    
        }
    }
    异常的针对性处理方式;
    try
    {
        
    }
    catch ()
    {
    }
    finally
    {}
    的几种组合方式。
    
    
    1,有资源需要释放。仅仅是处理异常。
    try
    {
        
    }
    catch ()
    {
    }
    
    2,一个try多个catch,一般对应的是被调用的函数,抛出多个异常的情况。分别处理。
    try
    {
        
    }
    catch ()
    {
    }
    catch ()
    {
    }
    catch ()
    {
    }
    注意:在多catch语法上特殊的地方,如果catch中的异常类存在子父类。
    父类的catch一定要放子类的下面。否则编译失败。
    
    3,不一定要处理异常,但是有资源需要释放。
    try
    {
        
    }
    finally
    {
        
    }
    
    
    void show()throws Exception
    {
        try
        {
            throw new Exception ();
        }
        finally
        {
            
        }
    }
    
    
    class ExceptionDemo6 
    {
        public static void main(String[] args) 
        {
            System.out.println("Hello World!");
        }
    }
    /*
    Exception
        |--AException
            |--AAException
        |--BException
    
    
    覆盖时:
    子类方法覆盖父类方法只能抛出父类方法异常或者该异常的子类。
    如果父类方法抛出多个异常,子类只能抛出父类异常的子集
    原则:就是子类的异常必须要在父类的异常处理控制中。
    
    
    注意:有一种情况,只能try不能throws。
    被覆盖的方法没有抛出异常。
    那么子类在覆盖时,子类方法中发生了异常,就只能try 无法throws声明。
    
    interface Inter
    {
        void show();
    }
    class Demo implements Inter
    {
        public void show()
        {
            try
            {
                throw new Exception();
            }
            catch(Exception e)
            {
                throw new RuntimeException("");//将编译时检测异常,转换成运行时异常。这样就不用声明。
            }
        }
    }

    异常练习

    /*
    关键字:try catch finally throw throws 
    
    
    1,异常思想:
        1,将问题封装成对象。(异常的名称,异常的信息,异常的位置 printStackTrace())
        2,是在程序不正常时才会用到。
        3,异常都具备可抛性。throws throw
        4,异常的好处:可以将功能中的问题封装后抛给调用者,
            如果是throws声明,可以让调用预先建立问题的处理方式(继续throws,捕获catch)
            如果没有throws声明,而且仅在功能中通过throw抛出了RuntimeException,
            让调用者在运行时终止,让调用者修改代码。
    
    
    2,异常处理的原则:
        1,功能内部通过throw抛出,功能上必须throws声明,throw什么,throws什么(RuntimeException除外)
        2,调用到throws声明异常的函数,如果进行try catch处理,那么声明几个,就定义几个对应的catch。
        3,将本层异常在本层处理后,可以抛出让调用者可以处理的其他异常,异常转换。
        4,如果有资源的调用,并需要释放,一定要定义finally代码块。
    
    
    3,异常try catch finally代码块的几种结合方式。一定要明确好处和区别。
    
    
    4,异常在继承时需要注意的问题?
    
    
    
    
    */
    //既然矩形的面积。
    /*
    描述长方形。
    */
    class NotValueException extends RuntimeException
    {
        NotValueException()
        {
            super();
        }
        NotValueException(String message)
        {
            super(message);
        }
    }
    class Rec
    {
        private int length;
        private int width;
        Rec(int length,int width)
        {
            if(length<=0 || width<=0){
                throw new NotValueException("数值非法!");
            }
            this.length = length;
            this.width = width;
        }
        //定义面积函数。
        public double getArea()
        {
            return length*width;
        }
    }
    
    //老师用电脑上课的示例,使用考虑异常情况。
    class RecDemo 
    {
        public static void main(String[] args) 
        {
            Rec r = new Rec(-4,5);
            double area = r.getArea();
            System.out.println(area);
        }
    }
    
    
    class Fu
    {
        void show()
        {}
    }
    class Zi extends Fu
    {
        void show()
        {
            try{
            throw new Exception();
            }catch(Exception e)
            {
                throw new RuntimeException();
            }
        }
    }
    
    
    
    面向对象总结:
    
    1,三个特征。
    封装:
    
    继承:
    
    多态:自己的理解,代码证明自己的理解是对的。USB.
    
    //this:代表当前对象。
    this.name = name;
    
    抽象类和接口。
    
    内部类,匿名内部类。
    
    异常。
    
    class Person
    {
    }
  • 相关阅读:
    css 学习笔记 菜鸟
    html学习 菜鸟
    flask 杂记2
    logging 为全局的日志工具对象添加日志记录器
    flask 框架 转载:https://cloud.tencent.com/developer/article/1465968
    flask 框架 转载:https://cloud.tencent.com/developer/article/1465949
    flask blueprint
    [ZJOI2005]午餐
    [ZJOI2006]皇帝的烦恼
    数位dp小练
  • 原文地址:https://www.cnblogs.com/vijay/p/3502941.html
Copyright © 2011-2022 走看看