JavaEE开发重中之重 异常 捕获并抛出异常 自定义异常 2024详解

news2024/11/23 22:28:51

异常就是代表程序可能出现的问题

Error代表系统级别的错误

属于严重问题

Error是给sun公司用的,不是给程序员用的

Exception代表程序可能出现的问题

叫做异常

编译阶段不会出现异常提醒

运行时会出现的异常

编译阶段就会出现的异常

异常体系的最上层父类是Exception

Java在编译时不会运行代码

只会检查语法是否错误

或者做一些性能的优化

编译时异常核心是提醒程序员检查本地信息

运行时异常核心是代码错误导致程序出现的问题

区别

看异常时要从下往上看

作用

异常是用来查询bug的关键参考信息的

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

调用者不知道代码执行的底层逻辑

我们可以用异常去改写,得到异常

throw关键字

抛出异常对象

则可以

JVM默认的处理异常

把异常的名称,异常的原因以及异常出现的位置等信息输出在了控制台

程序停止运行,异常下面的代码就不会再执行了

自己处理(捕获异常)

可以让程序继续往下执行,不会停止

创建异常对象

拿着这个对象到catch的小括号中去对比

看括号中的变量是否可以接受这个对象

如果能被接受,就说明该异常被捕获(抓住)

则执行catch里面的代码

当catch里面的所有代码执行完毕,继续执行try...catch体系下面的其他代码

public class Main {
    public static void main(String[] args) {
        int arr[]=new int[]{1,2,3,4,5};
        try {
            System.out.println(arr[5]);
            //可能出现异常的代码
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组越界");
            //出现异常后的处理
        }
        System.out.println("执行完毕");
    }
}

捕获异常的灵魂四问

如果try中没有遇到问题,会把try中所有的代码都执行完毕。

如果try可能遇到多个问题,会逐个捕获,写多个catch与之对应

出现异常会获得对象

从catch上往下依次进行匹配

如果我们要捕获多个异常,这些异常如果存在父与子关系的时候,那么父类一定要写在下面

在JDK 7以后,同时出现多个异常中间可以用|进行隔开,可以用一个catch同时捕获多个异常

如果try遇到的问题没有被捕获

那么相当于try...catch中的代码白写了,最终还是会交给虚拟机去进行处理

如果try遇到了问题

下面的代码就不会执行

直接跳转到对应的catch中,执行catch里面的语句体

灵魂四问小结

异常中的常见方法

printStackTrace仅仅是打印信息,不会停止虚拟机运行

最为常用

public class Main {
    public static void main(String[] args) {
        int arr[]=new int[]{1,2,3,4,5};
        try {
            System.out.println(arr[5]);
            System.out.println("未出现异常");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("数组越界");
        }
        System.out.println("执行完毕");
    }
}
System.err.println("执行完毕");//打印错误信息(红色字体)

抛出处理

throws关键字

写在方法定义处,表示声明一个异常

告诉调用者,使用本方法可能有哪些异常

编译时异常,必须要写

运行时异常,可以不写

public class Main {
    public static void main(String[] args) {
        int arr[]=null;
        System.out.println(getMax(arr));
    }
    public static int getMax(int arr[]){
        int max=0;
        if(arr==null)
            //手动创建一个异常对象,并把这个异常交给方法调用者去处理
            //此时方法就会结束,下面的代码就不会再执行了
            throw new NullPointerException();
        for(int i :arr)
            if (i>max)
                max=i;
        return max;
    }

}

抛出处理小结

练习

抛出的核心思想是告诉调用者出错了

捕获的核心思想是不让程序停止

可以在JavaBean类里去改写

当找不到运行异常如何描述的时候

可以抛出运行异常的父类对象给调用者

throw new RuntimeException()

在Javabean类里抛出异常,在测试类里接受异常

如果不在测试类里处理异常,就会交给虚拟机处理,会停止程序运行

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String str) {
        //str依次表示流里面的每个数据
        //形参要和抽象方法形参一致
        String arr[]=str.split(",");
        this.name=arr[0];
        this.age=Integer.parseInt(arr[1]);
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public  String toString() {
        return  name + "-" + age ;
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Friend f=new Friend();
        while(true){
            try {
                System.out.println("请录入名称");
                String name=sc.next();
                f.setName(name);
                System.out.println("请录入年龄");
                int age=sc.nextInt();
                f.setAge(age);
                //如果捕获到了异常,会进入catch()
                //如果所有数据都正确,那么会跳出循环
                break;
            } catch (RuntimeException e) {
                System.out.println("输入的年龄不符合规范,请重新输入");
            }
        }
        System.out.println(f);
    }
}

自定义异常

根据不同的情况可以创建不同的异常对象

自己写一个异常类

定义异常类 类名要见名知意

写继承关系

空参构造

带参构造 就是为了让控制台的报错信息更加见名知意 就是为了自定义异常的名字

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

    public NameformatException(String message) {
        super(message);
    }
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Friend f=new Friend();
        while(true){
            try {
                System.out.println("请录入名称");
                String name=sc.next();
                f.setName(name);
                System.out.println("请录入年龄");
                int age=sc.nextInt();
                f.setAge(age);
                //如果捕获到了异常,会进入catch()
                //如果所有数据都正确,那么会跳出循环
                break;
            } catch (NameformatException e) {
                e.printStackTrace();
                System.out.println("输入的年龄不符合规范,请重新输入");
            }
        }
        System.out.println(f);
    }
}
public class Friend {
    private String name;
    private int age;

    public Friend() {
    }

    public Friend(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
        if(name.length()>3)
            throw new NameformatException("名称长度不符合规范");
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Friend{name = " + name + ", age = " + age + "}";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DLRover 如何拯救算力浪费?10 分钟自动定位故障机,1 秒内保存 Checkpoint!

欢迎大家在 GitHub 上 Star 我们: 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

flink cdc,读取datetime类型

:flink cdc,读取datetime类型,全都变成了时间戳 Flink CDC读取MySQL的datetime类型时会转换为时间戳的问题,可以通过在Flink CDC任务中添加相应的转换器来解决。具体来说,可以在MySQL数据源的debezium.source.converter配置项中指…

欢乐钓鱼大师攻略大全,稀有鱼介绍!

在《欢乐钓鱼大师》的广袤海域中,隐藏着无数神秘的鱼类,等待玩家们的探索。这不仅仅是一场钓鱼的冒险,更是一次心灵的洗礼。每一次挥杆都可能揭开一个新的秘密,让我们一起踏上这场奇妙的钓鱼之旅。 寻觅海域明珠:星光闪…

综合模型及应用(图论学习总结部分内容)

文章目录 前言六、综合模型及应用(以题目总结为主)分层图思想(包括拆点建图) e g 1 : 通信线路 eg1:通信线路 eg1:通信线路​​​[A-Telephone Lines](https://ac.nowcoder.com/acm/contest/1055/A)(蓝书例题) e g 2 : 小雨坐地铁 eg2:小雨坐地铁 eg2:小雨坐地铁​ [1012-小雨坐…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

疯狂为你省钱 - Al一键虚拟试衣整合包

在今天的数字时代,中小服装商家以及各种带货人,面临着各种挑战,其中之一就是模特拍摄的高成本。为此,一个名为OMS-Diffusion的新开源项目应运而生,旨在帮助大家通过虚拟试衣来降低成本。使用这个工具,只需要…

PSFR-GAN复现

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言快速开始安装依赖权重下载及复原 训练网络数据集训练脚本 代码详解训练BaseOptio…

【GD32F470紫藤派使用手册】第五讲 PMU-低功耗实验

5.1 实验内容 通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作; 5.2 实验原理 5.2.1 PMU结构原理 PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32F4xx系列MCU具有三个电源域…

软件设计师笔记(三)-设计模式和算法设计

本文内容来自笔者学习zst 留下的笔记,都是零碎的要点,查缺补漏,希望大家都能通过,记得加上免费的关注!谢谢!本章主要以下午题出现形式为主! 文章编辑于:2024-5-13 13:43:47 目录 1…

聚焦光量子应用开发!Quandela 发布新版量子计算云服务

内容来源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨沛贤 深度好文:1200字丨5分钟阅读 摘要:法国光量子计算公司 Quandela宣布推出新版量子计算云服务 Quandela Cloud 2.0,通过创新技术确保量…

C++初阶:8.list

list 一.list的介绍及使用 1. list的介绍 list的文档介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中…

AXI Interconnect IP核的连接模式简介

AXI Interconnect IP核内部包含一个 Crossbar IP核,用于在 Slave Interfaces(SI)和 Master Interfaces(MI)之间路由传输。在连接 SI 或 MI 到 Crossbar 的每条路径上,可以选择性地添加一系列 AXI Infrastru…

3389端口报SSL_TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】漏洞

1、win+R运行,输入gpedit.msc进入本地计算机策略 2、本地计算机组策略——>计算机配置——>管理模板——>网络——>ssl配置设置 3、打开ssl密码套件顺序 4、点击已开启,把密码套件替换为下一步中的套件内容。 套件内容 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_…

韵搜坊(全栈开发)-- 项目介绍

文章目录 项目介绍技术栈前端后端 业务流程 后端地址: https://github.com/IMZHEYA/zhesou-backend 前端地址: https://github.com/IMZHEYA/zhesou-frontend 图标设计(AI生成): 项目介绍 一个聚合搜素平台&#xff…

火山引擎A/B测试平台的实验管理重构与DDD实践

本次分享的主题是火山引擎数智平台VeDI旗下的A/B测试平台 DataTester 实验管理架构升级与DDD实践。这里说明的一点是,代码的第一目标肯定是满足产品需求,能够满足产品需求的代码都是好代码。而本文中对代码的好坏的评价完全是从架构的视角,结…

机器人增量学习研究综述

源自:控制与决策 作者:马旭淼 徐德 “人工智能技术与咨询” 发布 摘 要 机器人的应用场景正在不断更新换代,数据量也在日益增长.传统的机器学习方法难以适应动态的环境,而增量学习技术能够模拟人类的学习过程,使机器人能利用旧知识来加快新任务的…

维护祖传项目Tomcat部署war包

文章目录 1. 安装tomcat2. 解决Tomcat启动日志乱码3. idea配置启动war包 1. 安装tomcat 选择免安装版本,只需要在系统变量里面配置一下。 新增系统变量 CATALINA_HOME D:\Users\common\tomcat\apache-tomcat-8.5.97-windows-x64\apache-tomcat-8.5.97 编辑追加Path…

ROS2入门21讲__第03讲__ROS2安装方法

目录 前言 Linux系统简介 Ubuntu系统简介 Ubuntu虚拟机安装 1. 下载系统镜像 2. 在虚拟机中创建系统 3. 设置虚拟机硬盘大小 4. 设置Ubuntu镜像路径 5. 启动虚拟机 6. 设置用户名和密码 7. 等待系统安装 8. 完成安装 ROS2系统安装 1. 设置编码 2. 添加源 3. 安装…

利用香港多IP服务器进行大数据分析的潜在优势?

利用香港多IP服务器进行大数据分析的潜在优势? 在当今数据驱动的时代,大数据分析已经成为企业获取竞争优势的不二选择。而香港作为一个拥有世界级通信基础设施的城市,提供了理想的环境来部署多IP服务器,从而为大数据分析提供了独特的优势。…

文档解析与向量化技术加速多模态大模型训练与应用

前言 随着人工智能技术的不断发展,多模态大模型作为一种新型的机器学习技术,逐渐成为人工智能领域的热点话题。多模态大模型能够处理多种媒体数据,如文本、图像、音频和视频等,并通过学习不同模态之间的关联,实现更加…