zoukankan      html  css  js  c++  java
  • 异常类

    一、什么是异常:

    异常就是在运行时产生的问题。通常用Exception描述。

    在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位置)。

    二、异常的继承关系:

    Throwable类是所有错误跟异常类的超类(祖宗类)。

    Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。

    RuntimeException类是运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。

    Error类是与Exception的平级的类,用来表示Java中存在的严重错误,只能通过修改代码来解决问题。

    继承体系的总结:

        Throwable: 它是所有错误与异常的超类(祖宗类)
            |- Error 错误
            |- Exception 编译期异常,进行编译JAVA程序时出现的问题
                |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

    三、异常与错误的区别:

     异常是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。 

    错误是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。

    四、异常产生的过程:

     1.运行或编译时产生异常

    2.创建异常类的对象

    3.声明异常类

    4.将异常类对象传给调用者(main()方法)处理

    5.调用者无法处理,再将异常类对象传给jvm虚拟机

    6.jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行

     五、抛出异常throw

     在java中,提供了一个throw关键字,用来抛出一个指定的异常。

     使用方法:

    1.创建一个异常对象。封装一些提示信息

    2.将这个异常告知调用者

     使用格式:

    throw new 异常类名(参数);

     六、声明异常throws

     声明异常格式:

    修饰符 返回值类型 方法名称 (参数)throws 异常1名称,异常2名称{

    }

    七、捕获异常try...catch...finally

    捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

     语句格式:

    复制代码
    try {
    
         //需要被检测的语句。
    
    }
    
    catch(异常类 变量) { //参数。
    
         //异常的处理语句。
    
    }
    
    finally {
    
         //一定会被执行的语句。
    
    }
    复制代码

    try该代码块中编写可能产生异常的代码。

    catch用来进行某种异常的捕获,实现对捕获到的异常进行处理。

    finally有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

    捕获异常的组合方式:

     1.  try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

     2.  try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

     3.  一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。

    注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

    4. try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

    八、运行时期异常 RuntimeExecption

    特点:

       方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

        运行时期异常一旦发生,需要程序人员修改源代码

    九、异常在方法重写中细节

    1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

    复制代码
    class Fu {
        public void method () throws RuntimeException {
    }
    }
    class Zi extends Fu {
        public void method() throws RuntimeException { }  //抛出父类一样的异常
        //public void method() throws NullPointerException{ } //抛出父类子异常
    }
    复制代码

    2.当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集

    复制代码
    class Fu {
        public void method () throws NullPointerException, ClassCastException{
    }
    }
    class Zi extends Fu {
        public void method()throws NullPointerException, ClassCastException { }          
    public void method() throws NullPointerException{ } //抛出父类异常中的一部分 public void method() throws ClassCastException { } //抛出父类异常中的一部分 }
    复制代码

    3.当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

    复制代码
    class Fu {
        public void method (){
    }
    }
    class Zi extends Fu {
        public void method() throws Exception { }//错误的方式
    }
    复制代码

    十、异常中常用方法

    在Throwable类中为我们提供了很多操作异常对象的方法,常用的如下:

    1.getMessage方法:返回该异常的详细信息字符串,即异常提示信息

    2. toString方法:返回该异常的名称与详细信息字符串

    3. printStackTrace:在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

    十一、自定义类异常

    格式:

    复制代码
    Class 异常名 extends Exception{ //或继承RuntimeException
        public 异常名(){
    }
        public 异常名(String s){ 
    super(s); 
    }
    }
    复制代码

    自定义异常继承Exception演示:

    复制代码
    class MyException extends Exception{
        /*
        为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
        */
        public MyException(){
            super();
        }
        public MyException(String message)    {
            super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
        }
    }
    复制代码

    自定义异常继承RuntimeException演示:

    复制代码
    class MyException extends RuntimeException{
        /*
        为什么要定义构造函数,因为看到Java中的异常描述类中有提供对异常对象的初始化方法。
        */
        MyException(){
            super();
        }
        MyException(String message)    {
            super(message);// 如果自定义异常需要异常信息,可以通过调用父类的带有字符串参数的构造函数即可。
        }
    }
    复制代码

     实例代码:

    throw,throws,try/catch的使用

    复制代码
    package com.oracle.Demo01;
    
    public class Demo01 {
    //try/catch格式:    用来处理异常
    //        try{
    //            被检测的代码(可能出现异常的代码)
    //        }catch(异常类名  变量){
    //            异常的处理方式
    //        }finally{
    //            必须要执行的代码
    //        }
        public static void main(String[] args) {
            int[] arr={1,2,3};
            try{
                int res=getArray(arr);
                System.out.println(res);
            }catch(ArrayIndexOutOfBoundsException ex1){  //多catch处理时,平级的没有先后顺序
                System.out.println(ex1);    //当出现父子类关系式,一定要将子类的放在前面
                System.out.println("===========");
                System.out.println(ex1.getMessage());
                System.out.println("===========");
                System.out.println(ex1.toString());
                
            }catch(NullPointerException ex2){
                System.out.println(ex2);
                System.out.println(ex2.getMessage());
                System.out.println("===========");
                ex2.toString();
            }finally{
                System.out.println("必须要执行的代码");
            }
            
            System.out.println("我执行了吗");
        }
        //throw跟throws的区别     用来报告异常
        //throw 关键字后面,必须跟异常对象
        // throws 关键字后面,必须跟异常类名    用来将异常传给调用者
        public static int getArray(int[] arr) throws ArrayIndexOutOfBoundsException,NullPointerException{
            if(arr==null){
                throw new NullPointerException("数组为空o(╯□╰)o");
            }
            if(arr.length<4){
                throw new ArrayIndexOutOfBoundsException("数组长度不够(キ`゚Д゚´)!!");
            }
            int i=arr[3]*2;
            System.out.println("aaa");
            return i;
        }
    
    }
    复制代码
  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/gaowc/p/10701463.html
Copyright © 2011-2022 走看看