Java学习【认识异常】

Java学习【认识异常】

  • 认识异常
    • 异常的种类
    • 异常的作用
  • 异常的处理方式
    • JVM默认的处理方式
    • 捕获异常
      • finally
    • 多个异常的处理
    • 异常中的方法
    • 抛出异常
  • 自定义异常

在这里插入图片描述

认识异常

在Java中,将程序执行过程中发生的不正常行为称为异常

异常的种类

Error代表的是系统级别的错误,属于严重的问题
Exception叫做异常,代表程序可能出现的问题,通常用Exception和它的子类来封装程序所出现的问题
运行时异常: RuntimeException及其子类,编译阶段不会出现问题,运行时出现异常(例如数组越界异常)
在这里插入图片描述

编译时异常: 编译阶段就会出现异常提醒
例如之前写的克隆接口练习,出现的异常就属于编译时异常,编译阶段必须手动进行处理,
在这里插入图片描述

异常的作用

1.用来查询bug信息

通过异常的类型我们可以很快的发现程序的错误类型
当运行以下代码时:

class Student{
    private String name;
    private int age;
    public Student(String str){
        String[] strs = str.split("-");
        this.name = strs[0];
        this.age = Integer.parseInt(strs[1]);
    }
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public class Text {
    public static void main(String[] args) {
        Student student1 = new Student("张三,20");
        System.out.println(student1);
    }
}

在这里插入图片描述
出现了数组越界的异常,通过这些可以定位到出现异常的位置

String[] strs = str.split("-");//应该改为用","分割

2.可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况

例如当需要获取一个10~20的数字时,如果直接把不符合要求的情况打印在控制台上,这样调用处就无法得到具体的数是什么
在这里插入图片描述
此时就可以通过返回异常来解决:
在这里插入图片描述

异常的处理方式

JVM默认的处理方式

把异常的名称,异常的原因及出现的位置等信息输出在控制台
程序停止,下面的代码不会被执行

System.out.println("哈哈");
System.out.println(2/0);//出现异常
System.out.println("呵呵");

异常后面的内容并没有被执行
在这里插入图片描述

捕获异常

格式:
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}

public static void main(String[] args) {
        int[] arr = {1, 2, 3};

        try {
            System.out.println(arr[5]);/*此处出现了异常,程序在这里就会创建一个 ArrayIndexOutOfBoundsException对象
                                         用这个对象和catch里面比较,看括号中的变量是否可以接收这个对象
                                         如果能接收,就表示异常被捕获,接着执行catch里面的代码
                                         之后再执行catch下面的代码*/
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界异常");
        }
        System.out.println("程序继续执行");
    }

通过捕获异常的方式处理,后续的代码是可以正常执行的
在这里插入图片描述
如果try中没有遇到问题,就会把try里的代码全部执行一遍,catch里面的代码并不会被执行

finally

try {
// 尝试执行的代码块
// 如果这里发生异常,则控制流会立即跳转到相应的catch块
} catch (ExceptionType1 e) {
// 处理ExceptionType1类型的异常的代码块
} finally {
// 无论是否发生异常,都会执行的代码块
// 通常用于执行清理操作,如关闭文件、数据库连接等
}

finally块里的语句,无论是否发生异常,都会执行,使用finally块的一个常见场景是确保资源(如文件句柄、网络连接或数据库连接)在使用后被正确关闭。即使发生异常,这些资源也需要在程序继续之前被释放。通过使用finally块,可以确保无论是否发生异常,这些资源都会被正确管理。
在这里插入图片描述
所以,对于这个方法,最终的返回值是finally里的2

多个异常的处理

当同时存在多个异常的时候,就要写多个catch与之对应

public static void main(String[] args) {
        try {
            String str = null;
            str.split("");
            System.out.println(2/0);
        }catch (NullPointerException e){
            System.out.println("空指针异常");
        }catch (ArithmeticException e){
            System.out.println("算术异常");
        }
        System.out.println("程序继续执行");
    }

注意: 如果异常中存在继承关系,子类要写在父类之前,不然所有的异常都会被父类捕获,程序报错
在这里插入图片描述
把父类写在最下面就可以了:
在这里插入图片描述
如果try中遇到的问题没有被捕获,最终还是会交给虚拟机处理

在这里插入图片描述
之后就会用虚拟机默认的处理方式,打印在控制台上:
在这里插入图片描述

如果try中出现的问题被捕捉到了,那么出现问题的下面就不会继续被执行

try {
            System.out.println(arr[10]);
            System.out.println("这里之后不会执行");
            System.out.println(2/0);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界异常");
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        } catch (ArithmeticException e) {
            System.out.println("算术异常");
        } 

所以后面的算术异常也不会被捕捉到

异常中的方法

通过快捷键ctrl + alt + t 可以快速生成 try-catch语句
在这里插入图片描述

public String getMessage(): 返回throwable的详细信息字符串
在这里插入图片描述
public String toString(): 返回此可抛出的简短描述
在这里插入图片描述
public void printStackTrace(): 把异常的错误信息输出在控制台上
在这里插入图片描述

printStackTrace方法打印的信息包含了getMessage()和toString()的信息,也最为常用

抛出异常

throws: 写在方法定义处,表示声明一个异常,告诉调用者,使用此方法可能会有哪些异常

public void方法名() throws 异常类名1,异常类名2{ ···· }
编译时异常:必须要写
运行时异常:可以不写

throw: 写在方法内,表示结束方法,用来手动抛出异常对象,交给调用者处理,方法中下面的代码不再执行

public void 方法(){
throw new 异常对象();
}

区别:
throwthrow关键字用于在方法中抛出一个异常,throws关键字用于声明一个方法可能会抛出的异常,本身并不抛出异常,它只是一个声明,告诉方法的调用者这个方法在执行过程中可能会抛出哪些异常

自定义异常

创建自定义异常类:
声明一个继承自Exception类或其子类的类,作为自定义异常类。
根据需要添加构造方法和其他方法。例如,可以添加一个带有错误消息的构造方法,以便在抛出异常时提供有关异常的详细信息。

当直接继承Exception类来创建自定义异常时,创建的是一个受检异常。受检异常是那些必须在方法签名中使用throws关键字声明,并且在调用该方法的地方使用try-catch块捕获或继续向上抛出的异常。编译器会强制要求这样做,以确保处理了所有可能的异常情况

public class MyCustomException extends Exception {  
  
    public MyCustomException() {  
        super();  
    }  
  
    // 带字符串消息的构造函数  
    public MyCustomException(String message) {  
        super(message);  
    }  
    
}

继承RuntimeException类,表示的是运行时发生的异常。RuntimeException和其子类被视为未受检异常。未受检异常不需要在方法签名中声明,编译器也不会强制要求你捕获它们。

public class PassWordException extends RuntimeException{
    public PassWordException() {
    }

    public PassWordException(String message) {
        super(message);
    }
}

之后的使用方法和Java中的异常是一样的,这里给出一个登录系统的示例:

public class Login {
    private String username;
    private String password;

    public Login() {
    }

    public Login(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void Loginfo(String username,String password)throws UserNameException,PassWordException{
        if(!this.username.equals(username)){
            throw new UserNameException("用户名不存在");
        }
        if(!this.password.equals(password)){
            throw new PassWordException("密码错误");
        }
        System.out.println("登录成功");
    }

    public static void main(String[] args) {
        Login login = new Login();

        while (true) {
            try {
                System.out.println("请输入用户名");
                String username = new Scanner(System.in).nextLine();
                login.setUsername(username);
                System.out.println("请输入密码");
                String password = new Scanner(System.in).nextLine();
                login.setPassword(password);
                login.Loginfo("admin","123");
                break;
            } catch (UserNameException e) {
                e.printStackTrace();
            } catch (PassWordException e) {
                e.printStackTrace();
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677441.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】详解Stack与Queue(四)

🔒文章目录: 1.❤️❤️前言~🥳🎉🎉🎉 2.用队列实现栈 3.用栈实现队列 4.栈和队列存放null 5.总结 1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友…

Leetcode:整数转罗马数字

题目链接:12. 整数转罗马数字 - 力扣(LeetCode) 普通版本(模拟) 条件分析:罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则还给出了额外的 6 个复…

FIFO读写端口位宽不同时的数据输出

非对称长宽比指的是FIFO的读写端口的数据宽度不同,呈现比例关系;非对称长宽比允许FIFO的输入和输出深度不同,支持如下的写读宽高比:1:8、1:4、1:2、1:1、2:1、4:1、8:1。 只有以下几种FIFO支持非对称长宽比: 对于非对称长宽比&a…

容器化部署fastdfs文件存储

目录 一、软件信息 二、构建fastdfs镜像 三、docker 启动fdfs服务 四、k8s部署fdfs服务 1、fdfs部署文件 五、外部服务访问 一、软件信息 fastdfs版本:fastdfs:V5.11 libfastcommon版本: V1.0.36 fastdfs-nginx-module版本:V1.20 nginx版本&…

自动驾驶---Control之LQR控制

1 前言 在前面的系列博客文章中为读者阐述了很多规划相关的知识(可参考下面专栏),本篇博客带领读者朋友们了解控制相关的知识,后续仍会撰写规控相关文档。 在控制理论的发展过程中,人们逐渐认识到对于线性动态系统的控…

Websocket服务端结合内网穿透发布公网实现远程访问发送信息

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

Audition 2024 for Mac/Win:音频录制与编辑的卓越之选

随着数字媒体的不断发展,音频内容创作已经成为各行各业中不可或缺的一部分。无论是音乐制作、广播节目、播客录制还是影视配音,都需要高品质的音频录制和编辑工具来实现专业水准的作品。在这个充满竞争的时代,要想在音频创作领域脱颖而出&…

如何合理使用群发短信呢?(短信接口JSON实例)

随着时代的发展,越来越多的营销推广也开始有线下转移到了线上,短信也变成了企业与用户之间交流沟通的桥梁,那么这么多的企业选择使用短信平台,到底群发短信好不好用呢?今天乐讯通短信平台就为大家来介绍一下群发短信营…

【C++进阶】深入STL之vector:构建高效C++程序的基石

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模拟实现string 🌹🌹期待您的关注 🌹🌹 ❀STL之vector 📒1.ve…

NLP基础——序列模型(动手学深度学习)

序列模型 定义 序列模型是自然语言处理(NLP)和机器学习领域中一类重要的模型,它们特别适合处理具有时间顺序或序列结构的数据,例如文本、语音信号或时间序列数据。 举个例子:一部电影的评分在不同时间段的评分可能是…

【个数】滑动窗口-1004. 最大连续1的个数 III 1493. 删掉一个元素以后全为 1 的最长子数组

题目链接及描述 1004. 最大连续1的个数 III - 力扣(LeetCode) 题目分析 今日写到这个题目,是滑动窗口的标签,但首先看到后感觉和之前做过的滑动窗口题目有点区别,之前滑动窗口通过给定一个区间长度,随后区…

.NET集成DeveloperSharp实现图片的裁剪、缩放、与加水印

🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面…

第一篇 逻辑门(与门、或门、非门、异或门)

一、实验目的 了解DE1-SOC开发板一些外设。 掌握常用组合逻辑门电路的基本原理。 学习Verilog HDL的基本语法。 学习使用ModelSim工具对设计的电路进行仿真,包括编写Testbench仿真代码,以及ModelSim工具的使用。 熟悉使用Quartus软件从创建Quartus工…

el-tooltip使用记录

记录工作中使用el-toolitp的情况 需求一:列表项内容超出限制时,点击单元格展示Tooltip 需求描述:某列表项内容返回过多,超出最大限制时: 1.点击该单元格再显示tooltip; 2.点击下一行更新tooltip内容&…

《数字图像处理-OpenCV/Python》第15章:图像分割

《数字图像处理-OpenCV/Python》第15章:图像分割 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第15章:图像分割 图像分割是由图像处理到图像分析的关键步骤…

关于gitee上传成功没有绿点

今天上传完代码以后,打开gitee看了一下,但是看到昨天和今天都没有小绿点,仔细思考了一番,是仓库满了?不对啊,如果满了的话,上传就会失败啊,那这是什么问题呢? 原来是因为…

Parallels Desktop for Mac 19.4.0更新了哪些内容?有什么改进?

带来了重新设计的共享 Mac 文件夹版本,这些文件夹现在是符号链接,像指针一样指向您的 Mac 文件夹中的文件,同时仍然显示在 Windows 的本地磁盘上。 修复了由于共享文件夹问题导致 NinjaTrader 无法正常启动的问题。 修复了由于共享文件夹问…

2024中国跨境电商海外营销观察报告

来源:霞光智库 近期历史回顾:战略测量的未来报告 2024影响力系列白皮书(第五册)——绿氢 2024年Z世代与千禧一代调研报告.pdf 2023中国车规级芯片产业白皮书.pdf 2024全球网文应用营销洞察报告.pdf 2024年Q1抖音女性卫生用品行业趋…

操作系统教材第6版——个人笔记1

第一章 计算机操作系统概述 操作系统是计算机系统中最重要的系统软件,它统一管理计算机系统的硬件资源与信息资源,控制与调度上层软件的执行并为其提供易于使用的接口。从资源管理、程序控制、操作控制、人机交互、程序接口、系统结构6个角度深入观察操…

JS冒泡排序案例详解

先看一下案例效果&#xff1a; HTML代码&#xff1a; <input type"text" value"" id"bubble-input"> <button onclick"bubbleSort()">冒泡排序</button> <h4 id"bubbleSort-result"></h4>J…