• Java异常


    在这里插入图片描述

      戳我跳到个人主页

      本人码云(建议pc端打开,手机可能会出现字体过小问题。)
      本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
      如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。

      本人后续会在这里更新操作系统和计组的笔记,敬请期待!
      有赞必回,评论必回,顺着网线回访!

    异常的基本语法

    异常:程序没按照预计的结果运行,在运行过程中发生了“错误”。
    在这里插入图片描述异常的基本语法:
    try{
    //可能会产生异常的代码,除0,数组越界,空指针等
    }
    [catch 0..N个]{
    //出现异常以后如何处理
    }
    [finally]{
    //异常的出口,最终会执行的代码块
    }
    catch, finally 为可选,可写可不写

    其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。有如下三种:
    try-catch
    try-finally
    try-catch-finally

    1.程序中不处理异常

    在这里插入图片描述

    2.使用try … catch … 处理异常

    在这里插入图片描述

    我们发现,一旦try中出现异常,那么try代码块中的其他程序就不会继续执行,而是交给catch中的代码来执行,catch执行完毕后继续向下执行

    3.异常类

    Java中一切都是类,异常其实也是类,因此catch代码块只能捕获相应的异常“类型”
    在这里插入图片描述
    例:
    在这里插入图片描述

    有一个异常类是所有异常类的父类,Exception

    我们如果catch块中捕获的是Exception类型,那么就可以接受所有的异常类型。(自动向上转型

    这样虽然可以一劳永逸,但是不推荐,因为这样写,不知道异常产生的具体原因,如果很清楚异常产生的类型,建议还是写对应的Exception的子类异常。
    在这里插入图片描述

    4.关于错误“堆栈”信息

    如果想要输出程序出现异常的位置以及原因,就调用异常对象printStackTrace方法 e.printStackTrace();
    在Java中,出现问题很好解决,异常的错误信息非常完善,到底在哪一行出现了什么错误,说的非常清楚。
    在这里插入图片描述

    5.关于finally代码块

    无论是否有异常产生,最终都会执行finally代码块 (易错)
    在这里插入图片描述
    在这里插入图片描述猜猜这个ret是多少?
    在这里插入图片描述不可思议是 30
    在这里插入图片描述finally作为最终都会执行的代码块,若finally中存在返回值,覆盖掉try或者catch的返回值
    所以,不要在finally代码块中写返回值

    一般来说资源的释放,方法的关闭操作都在finally代码块中。 比如关闭数据库的连接,关闭文件的操作都在finally块中,无论是否有异常产生,都能保证资源得到释放。

    6.异常处理

    流程
    在这里插入图片描述

    7.throws和throw关键字

    人为抛出异常

    • throws: 用在方法声明上,表示该方法可能会产生的异常类型,但是本方法中不处理该异常。若异常产生抛回给调用者
    • throw: 用在方法内部,表示人为产生异常对象并抛出
      异常对象的产生都是发生异常后由JVM产生的,若需要人为产生异常对象,就使用throw关键字
      这是抛出异常,真正出错了如果我用e.printStackTrace();会怎么样?
      在这里插入图片描述

    8.异常体系

    JDK内部异常的继承关系
    Java中的异常分为两大类,一类称之为 “受查异常”,另一类称为 “非受查异常”。
    在这里插入图片描述

    • RuntimeException以及其子类包括Error及其子类称之为非受查异常, 编译阶段可以不显示进行异常处理(try … catch / throw 抛出等等)。即蓝色部分的类

    • 除了非受查异常以外的其他异常都是受查异常,必须在编译阶段显示进行异常的处理,否则编译就会出错。即红色部分的类

    • RuntimeException:运行时异常,编译阶段不报错,运行时出错。
      常见的运行时异常
      ArrayIndexofBoundsException - 数组越界异常
      NullPointerException - 空指针异常
      ClassCaseException - 类型转换异常
    • Error:程序内部错误,一般来说出现这种错误,程序没法再正常执行下去,只能退出程序。
      OutofMemoryError - 堆内存溢出错误
      StackOverflowError - 栈溢出错误

    代码体验:

    非受查异常
    在这里插入图片描述
    受查异常,必须在编译阶段进行异常的处理
    在这里插入图片描述这个抛出的这个异常是受查异常,调用者必须显示处理
    在这里插入图片描述
    这个代码因为没有file文件,将会产生FileNotFoundException异常,由于FileInputStream这个类它抛出了这个异常,交给调用者去处理,我自己写的IOException这个类中的main方法就是调用者,如果我不想处理,那我让main也抛出这个异常就好了。

    显示处理:

    1.进行 try…catch…finally 捕获这个异常
    在这里插入图片描述在这里插入图片描述2.调用者也使用 throws 向上抛出
    在这里插入图片描述在这里插入图片描述

    9.自定义异常

    JDK内部已经帮我们提前定义好了很多的异常类,但是在某些业务场景下,出现的错误需要我们自定义异常类(用户登陆的时候,用户名不对,密码不对等等)
    自定义异常类非常简单,只需要继承相关的两个父类就可以。

    若希望这个异常类必须显示处理 - 继承Exception父类
    若希望这个异常类不需要显示处理 - 继承RuntimeException父类

    package java_exception_test;
    
    import java.net.PasswordAuthentication;
    import java.sql.SQLOutput;
    import java.util.Scanner;
    
    public class MyExceptionTest
    {
        private static final String USER_NAME = "lee";
        private static final String PASSWORD = "12345";
    
    
        public static void main(String[] args)
        {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String userName = sc.nextLine();
            System.out.println("请输入密码:");
            String pass = sc.nextLine();
            if( !USER_NAME.equals(userName) )
            {
                //用户名错误异常
    
                //先创建一个用户名错误的异常类的对象
                UserNameException e = new UserNameException("用户名错误异常");
                //再抛出这个异常对象
                throw e;
            }
            if( !PASSWORD.equals(pass) )
            {
                //密码错误异常
                throw new PassWordException("密码错误异常");
            }
        }
    }
    
    //创建两个异常类,继承RuntimeException
    //非受查异常 - 不需要进行显示处理
    class UserNameException extends RuntimeException
    {
        //构造方法
        public UserNameException(String msg)
        {
            super(msg);
        }
    }
    class PassWordException extends RuntimeException
    {
        //构造方法
        public PassWordException(String msg)
        {
            super(msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
    using的应用
    玩转springboot之springboot配置文件
    等保测评各个级别的详细内容
    [组合计数]Counting Stickmen 2022杭电多校第7场 1003
    MySQL - InnoDB记录结构
    【前端知识之Vue3】defineProperty和proxy的区别
    《Java基础知识》Java ArrayList源码分析2
    [Gcexcel]GrapeCity Documents Excel for Java 5.2.2
    国开现代汉语专题,形考答案形考任务
  • 原文地址:https://blog.csdn.net/lizyviking_/article/details/126319385