Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 7797|回复: 0

Java学习(异常类)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-21 13:06:34 | 显示全部楼层 |阅读模式

    一、什么是异常:

    异常就是在运行时产生的问题。通常用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;
        }
    
    }

     

     

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-5 04:00 , Processed in 0.057872 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表