java学习之高级语法(十四)----- 异常

简介: java学习之高级语法(十四)----- 异常

 异常

▶  异常概念

异常:指程序在执行过程中出现非正常的情况,最终会导致 jVM 的非正常停止

在 java 等面向对象的编程语言中,异常本身就是一个类,产生异常就是创建异常对象并抛出一个异常对象

java 处理异常的方式是中断处理

异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行

▶  异常体系

异常机制其实是帮助我们找到程序中的问题

异常的根类是:java.lang.Throwable ,其下面有两个子类:java.lang.Error 和 java.lang.Exception

【 注:平常所说的异常是指 java.lang.Exception 】

Throwable 体系:

    • Error :严重错误Error ,无法通过处理的错误,只能事先避免,就像绝症一样
    • Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的,就像感冒一样

    ▶ 异常产生过程的解析

    image.gif编辑

    image.gif编辑

    这里访问了数组中的3索引,而且数组是没有3索引的,所以JVM就会检测出程序出现异常,则此时JVM会做两件事情:

    (1)JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的内容、原因、位置

            new ArrayIndexOutOfBoundsException( " 3 " ) ;

    (2)在getElement方法中没有异常的处理逻辑(try...catch),JVM就会把异常对象抛出给方法的调用者main方法来处理这个异常

            main方法接收到了这个异常对象,main方法也没有异常的处理逻辑继续把对象抛出给main方法的调用者JVM处理  

            JVM接收到了这个异常对象做了两件事情:

              ① 把异常对象(内容、原因、位置)以红色的字体打印在控制台

              ② JVM会终止当前正在执行的 java 程序 ---> 中断处理

    ▶  异常的处理

    java异常处理的五个关键字:try、catch、finally、throw、throws

    ---  throw关键字

        作用:可以使用throw关键字在指定方法中抛出指定的异常

        使用格式:throw new xxxException( " 异常产生的原因 ") ;

        注意:

                 1. throw关键字必须写在方法的内部

                 2. throw关键字后边的new的对象必须是Exception或者Exception的子类对象

                 3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象

                     throw关键字后边创建的是RuntimeException或者是RuntimeException的子类对象,可以不处理,默认交给JVM处理(打印异常对象,中断程序)

                     throw关键字后边创建的是编译异常(写代码的时候报错)则必须处理这个异常,要么throws,要么try...catch

               

    ---  throws关键字

         异常处理的第一种方式,交给别人处理

         作用:当方法内部抛出异常对象的时候,我们就必须处理这个异常对象,可以使用throws这个关键字处理异常对象,  会把异常对象声明抛出给方法的调用者处理(自己不处理,给别人处理)最终交给JVM处理 ---> 中断处理

        使用格式:在方法声明时使用

                          修饰符  返回值类型  方法名(参数列表) throws  AAAException,BBBException...{

                                        throw new AAAException(“ 产生原因 ”) ;

                                        throw new BBBException(“ 产生原因 ”) ;

                         }

         注意:1. throws关键字必须写在方法声明处

                    2. throws关键字后边声明的异常必须是Exception或者是Exception的子类

                    3. 方法内部如果抛出多个异常对象,那么throws后边也必须声明多个异常    

                        如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可

                    4. 调用了一个声明抛出异常的方法,就必须处理声明的异常

                        要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM

                        要么try...catch自己处理异常

          image.gif编辑

    --- try...catch关键字

        try...catch异常处理的第二种方式,自己处理异常

        格式:

                     image.gif编辑

            注意: 1. try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象

                        2. 如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码 ;如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码就继续执行try...catch之后的代码

      image.gif编辑

    输出:

               image.gif编辑

    --- finally代码块

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

       什么时候的代码必须最终执行:当在 try 语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),都得在使用完之后最终关闭打开的资源

       格式:

                  image.gif编辑

        注意: 1. finally 不能单独使用,必须和try一起使用

                    2. finally 一般用于资源释放(资源回收),无论程序是否出现异常,最后都要资源释放(IO)

    image.gif编辑

    ▶  Objects 非空判断

    Objects类由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),在它的源码中,对对象为null的值进行了抛出异常的操作。

    --- public static <T> T requireNonNull( T obj ) :查看指定引用对象不是null

       源码:

                  image.gif编辑

                  从源码中可以发现这里对为null的对象进行了抛出异常的操作

    ▶  Throwable 类中3个异常处理的方法

    (1)String getMessage()  :返回此 throwable 的简短描述

    (2)String toString()  :返回此 throwable 的详细消息字符串

    (3)void printStackTrace()  :JVM打印异常对象,默认此方法打印的异常信息是最全面的

    image.gif编辑

    ▶  异常的注意事项

    ●  多个异常使用捕获该如何处理呢 ?

       1. 多个异常分别处理

         image.gif编辑

     2. 多个异常一次捕获,多次处理                                                                                                                                

      image.gif编辑

     

    3. 多个异常一次捕获,一次处理

    image.gif编辑

    【 运行时异常被抛出可以不处理,即不捕获也不声明抛出 ,默认给虚拟机处理,终止程序,什么时候不抛出运行时异常了,再来继续执行程序 】

    ● 如果finally 有return 语句,永远返回 finally 中的结果,避免该情况

      image.gif编辑

    ● 子父类异常

    如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常

    如果父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常,此时子类产生该异常,只能捕获处理,不能声明抛出

    注意:   父类异常时什么样,子类异常就什么样

    image.gif编辑

    ▶  自定义异常类

    java提供的异常类不够我们使用,需要自定义一些异常类

    格式:

              public class XXXException extends Exception / RuntimeException {

                           添加一个空参数的构造方法

                            添加一个带异常信息的构造方法              

               }

    注意:  1. 自定义异常类一般都是以 Exception 结尾,说明该类是一个异常类

                2. 自定义异常类,必须的继承 Exception 或者 RuntimeException

                    继承Exception :那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try...catch

                    继承RuntimeException :那么自定义的异常就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)

                    image.gif编辑

    自定义异常类练习:

    ---   要求:模拟注册操作,如果用户名已存在,则抛出异常并提示 :亲,该用户名已被注册

    ---   分析:

         1.使用数组保存已经注册过的用户名(数据库)

         2.使用Scanner获取用户输入的注册的用户名(前端,页面)

         3.定义一个方法,对用户输入的已注册用户名进行判断

            遍历存储已经注册过用户名的数组,获取每一个用户名

            使用获取到的用户名和用户输入的用户名比较

            true:

                    用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经被注册”

            false:

                    继续遍历比较

            如果循环结束了,还没有找到重复的用户名,提示用户:“恭喜您,注册成功!”

    image.gif编辑


    相关文章
    |
    27天前
    |
    Java API Maven
    2025 Java 零基础到实战最新技术实操全攻略与学习指南
    本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
    271 1
    |
    28天前
    |
    存储 Java 容器
    Java基本语法详解
    本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
    |
    1月前
    |
    数据采集 搜索推荐 Java
    Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用(221)
    本文探讨 Java 大数据在智能教育虚拟学习环境中的应用,涵盖多源数据采集、个性化推荐、实时互动优化等核心技术,结合实际案例分析其在提升学习体验与教学质量中的成效,并展望未来发展方向与技术挑战。
    |
    2月前
    |
    并行计算 Java API
    Java 基础篇完整学习攻略
    本教程涵盖Java基础到高级内容,包括模块化系统、Stream API、多线程编程、JVM机制、集合框架及新特性如Records和模式匹配等,适合零基础学员系统学习Java编程。
    73 0
    |
    2月前
    |
    Java 数据库连接 数据库
    Java 相关知识点总结含基础语法进阶技巧及面试重点知识
    本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
    113 2
    Java 相关知识点总结含基础语法进阶技巧及面试重点知识
    |
    26天前
    |
    算法 Java 测试技术
    零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
    本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
    75 0
    |
    2月前
    |
    前端开发 Java API
    新手 Java 学习资料结合最新技术的精选推荐及高效学习资源参考
    本文为新手推荐了涵盖Java基础到最新技术的学习资料,包括官方文档、在线课程、书籍、学习网站及实践平台,帮助系统掌握Java编程,并通过Spring Boot实战提升开发能力。
    115 1
    |
    2月前
    |
    NoSQL Java 数据库
    Java 全栈学习超全面知识图谱构建完整 Java 知识体系
    本文全面讲解Java核心技术体系,涵盖基础语法、面向对象、集合框架、主流框架(Spring、Spring Boot、MyBatis)及三大实战项目(微服务电商、响应式博客、企业后台系统),助你系统掌握Java全栈开发技能。
    179 1
    |
    1月前
    |
    存储 搜索推荐 安全
    Java 大视界 --Java 大数据在智能教育学习效果评估与教学质量改进中的应用(209)
    本文探讨了 Java 大数据在智能教育中的创新应用,涵盖学习效果评估、教学质量改进及个性化教学方案定制等内容,结合实战案例与代码解析,展现技术如何赋能教育智能化转型。
    |
    2月前
    |
    存储 安全 Java
    从基础语法到实战应用的 Java 入门必备知识全解析
    本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
    61 0

    热门文章

    最新文章