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编辑


    相关文章
    |
    3月前
    |
    Java
    在 Java 中捕获和处理自定义异常的代码示例
    本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
    117 1
    |
    3月前
    |
    Java API 调度
    如何避免 Java 中的 TimeoutException 异常
    在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
    203 13
    |
    12天前
    |
    Java 程序员 开发者
    Java社招面试题:一个线程运行时发生异常会怎样?
    大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
    69 14
    |
    14天前
    |
    缓存 Java 应用服务中间件
    java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
    java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
    46 5
    |
    1月前
    |
    Java 调度 开发者
    Java线程池ExecutorService学习和使用
    通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
    36 10
    |
    1月前
    |
    Java 数据库连接 数据库
    【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
    《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
    118 4
    |
    1月前
    |
    前端开发 Java 数据库连接
    【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
    深度解读JavaWeb开发在Java学习中的重要性
    38 4
    |
    1月前
    |
    存储 移动开发 算法
    【潜意识Java】Java基础教程:从零开始的学习之旅
    本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
    56 1
    |
    2月前
    |
    Java
    java do while 的语法怎么用?
    java do while 的语法怎么用?
    70 3
    |
    9月前
    |
    存储 Java
    【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
    【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法

    热门文章

    最新文章