【JavaSE】异常 (异常抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 自定义异常)

news2024/11/21 2:38:29

文章目录

  • 异常
    • 概念
    • 异常结构
  • 异常处理
    • 异常抛出
    • 异常的捕获
      • 异常声明throws
      • try-catch捕获并处理
      • finally
    • 自定义异常


异常

概念

在程序运行过程中,可能会存在一些奇怪问题,例如:网络不畅,内存报警等等。所以在java中,将程序执行过程中发生的不正常的行为称为异常。
例如:
1.

public class Test {
    public static void main(String[] args) {
        System.out.println(10/0);
    }
}

在这里插入图片描述
抛出的异常就是一个类:

在这里插入图片描述
2.

public class Test {
    public static void main(String[] args) {
        int[] array = null;
        System.out.println(array.length);
    }
}

在这里插入图片描述
异常的种类非常多,常见的我们罗列出来。
在没有处理异常的时候,抛出异常之后,后面的内容不能打印。

public class Test {
    public static void main(String[] args) {
        int[] array = {1,2,3};
        System.out.println(array[10]);
    }
}

在这里插入图片描述

异常结构

  1. Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception
  2. Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:
    StackOverflowError和OutOfMemoryError,一旦发生回力乏术。
  3. Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说
    的异常就是Exception。
public class Test {
    public static void func(){
        func();
    }
    public static void main(String[] args) {
        func();
    }
}

在这里插入图片描述
异常还分为运行时异常和编译时异常,所有的运行时异常都继承了RuntimeException这个类,对于编译时异常来说,必须把异常处理掉。
在这里插入图片描述

异常处理

  1. LBYL: Look Before You Leap. 在操作之前就做充分的检查。
boolean ret = false;
ret = 进入安全系统();
if (!ret) {
进入安全系统错误;
return;
}

在下一步操作的时候,必须保证上一步操作成功。
缺陷:正常流程和错误处理流程代码混在一起。

  1. EAFP: It’s Easier to Ask Forgiveness than Permission 就是先操作, 遇到问题再处理。
try{
   ...
}catch(){

}catch(){

}

异常处理主要的5个关键字:throw、try、catch、final、throws

异常抛出

手动抛异常:

public class Test {
    public static void test1(int[] a){
        if(a == null){
            throw new NullPointerException();
        }
    }
    public static void main(String[] args) {
        test1(null);
    }
}

在这里插入图片描述
上面提示18和22行出错,18行报错就是最直接抛出异常的地方。一般最上面的是我们需要解决的。当解决这个异常之后,下面的异常就没有问题了。
上面的语法一般用在自己自定义的异常

注意

  1. throw必须写在方法体内部。
  2. 抛出的对象必须是Exception 或者 Exception 的子类对象。
  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理。
  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译。
  5. 异常一旦抛出,其后的代码就不会执行。

异常的捕获

主要有两种:异常声明throws 和 try-catch。

异常声明throws

public class Test {
    public static void test1(int[] a) throws CloneNotSupportedException {
        if(a == null){
            throw new CloneNotSupportedException();
        }
    }
    public static void main(String[] args) throws CloneNotSupportedException {
        test1(null);
    }
}

在这里插入图片描述
当我们再次运行的时候还会报错,而且后面的代码不会执行了。此时不让编译报错了,但是异常没有真正的处理掉,它把异常交给JVM了。
当我们没有解决这个异常的时候,我们就会把这个异常交给JVM处理,一旦交给JVM程序就崩溃了

注意

  1. throws必须跟在方法的参数列表之后。
  2. 声明的异常必须是 Exception 或者 Exception 的子类。
  3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可。

try-catch捕获并处理

public static void main(String[] args){
    try{
        //存放可能抛出异常的代码
        test1(null);
    }catch (CloneNotSupportedException e){

    }
    System.out.println("正常的逻辑");
}

在这里插入图片描述

对于受查异常来说,当try中没有抛出catch这个受查异常的时候,检测不到就会报错,但是运行时去抛出的异常来说不会检测的很严格。所以受查异常或者编译时异常我们在使用的时候要注意。
在这里插入图片描述
注意:Exception作为所有异常的父类,它能捕获所有的异常,如果把它放到catch的第一个,那么后续的异常没有任何作用了!

当try当中存在多个异常的时候,从上往下执行,谁先抛出异常就捕获哪个异常。catch中程序的书写不影响异常的捕获。
在这里插入图片描述
在这里插入图片描述
当catch当中没有指定的异常,程序就会交给JVM处理,只要交给JVM处理,程序就会终止。
在这里插入图片描述

finally

有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。

在这里插入图片描述
通过上面的实验我们明白了:不管是否在try中抛出异常,finally里面的代码终将被执行。所以finally一般用于资源的释放。

【异常处理流程总结】
程序先执行 try 中的代码, 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配,如果找到匹配的异常类型, 就会执行 catch 中的代码,如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者,无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行),如果上层调用者也没有处理的了异常, 就继续向上传递,一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止。

自定义异常

PassWordException

public class PassWordException extends RuntimeException{
    public PassWordException(){
        super();
    }
    public PassWordException(String s){
        super(s);
    }
}

UserNameException

public class UserNameException extends RuntimeException {
    public UserNameException(){
        super();
    }
    public UserNameException(String s){
        super(s);
    }
}

自定义异常

public class Test2 {
    public String name ="lkx";
    public String pssword = "123456";
    public  void login(String name,String pssword){
        if(!this.name.equals(name)){
            System.out.println("用户名错误!");
            throw new UserNameException("你的用户名错了");
        }
        if(!this.pssword.equals(pssword)) {
            System.out.println("密码错误!");
            throw new PassWordException("你的密码错了");
        }
    }
    public static void main(String[] args) {
        Test2 test2 = new Test2();
        try{
            test2.login("lk","12345");
        }catch (UserNameException e){
            e.printStackTrace();
            System.out.println("用户名异常!");
        }catch (PassWordException passWordException){
            passWordException.printStackTrace();
            System.out.println("密码异常!");
        }finally {

        }
    }
}
  1. 自定义异常通常会继承自 Exception 或RuntimeException。
  2. 继承自 Exception 的异常默认是受查异常。
  3. 继承自 RuntimeException 的异常默认是非受查异常。

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

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

相关文章

NLP:文本预处理总览

1 用n-gram语言模型过滤低质量内容 使用n-gram语言模型对文本进行评估,从而过滤掉低质量的内容。具体来说,可以通过以下步骤进行: 1 将文本分成n-gram序列,其中n是一个整数。 2 使用已经训练好的n-gram语言模型对每个n-gram序列…

面试4年经验的测试员,开口就要25k,却连基础都不会,还不如招应届生!

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-25k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试…

冒泡排序实现(c++)

目录 冒泡排序简介: 冒泡排序原理: 动图演示: 代码实现: 冒泡排序简介: 冒泡排序,最优时间复杂度O(N),平均时间复杂度O(N^2),最差空间复杂度O(N),平均时间复杂度O(1)…

基于ISIC数据集的皮肤病黑色素瘤分类研究与实现

摘要: 本项目利用残差网络结构对皮肤病图像进行分类,提高了皮肤病诊断的准确度。并结合Flask框架实现一个简单的Web应用,用户可以上传图像文件,经过预处理最后将预测结果显示在界面上。通过该系统,医生和研究人员可以快…

STM32单片机(三)第三节:GPIO输入

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

【计算机网络】 1.4——计算机网络的性能指标(重要!含计算)

计算机网络的性能指标 速率 数据量单位 bit Byte KB(2^10B) MB GB TB 数据量比较特别,使用2进制 kB210B而不是103,注意计算题 比特率/数据率单位 bpskb/s(10^3bps) Mb/s Gb/s Tb/s 带宽 *带宽在模拟信号系统中的意义 信号所包含的各种不同频率成…

WebSocket的那些事(4-Spring中的STOMP支持详解)

目录 一、序言二、Spring对STOMP支持的相关注解三、聊天Demo代码示例1、前端页面chat.html2、相关实体(1) 请求消息参数(2) 响应消息内容(3) 自定义认证用户信息 3、自定义用户认证拦截器4、WebSocket消息代理配置5、ChatController控制器 四、测试用例1、指定用户定时消息推送…

【实用篇】SpringCloud02

文章目录 SpringCloud020.学习目标1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1)添加一个环境共享配置2)在user-service中读取共享配置3)运行两…

TCP通信(复习)

目录 TCP通信实现过程 1、socket函数与通信域 socket函数 参 数 bind函数 与 通信结构体 bind函数 参数 通信地址族与同届结构体 通用地址族结构体 IPV4地址族结构体 listen函数与accept函数 listen函数 accept函数 参 数 作 用 要实现进程间的通信必备&#xff1…

Map、Set和哈希表(数据结构系列14)

目录 前言: 1.搜索树 1.1概念 1.2插入 1.3查找 1.4删除 1.5二叉搜索树整体代码展示 2. Map和Set的讲解 2.1 Map的说明 2.1.1Map的方法 2.2 Set 的说明 2.2.1Set的方法 3.哈希表 3.1哈希表的概念 3.2哈希冲突 3.3冲突的避免 3.4哈希冲突的解决 3.4…

企业物资管理系统的设计与实现(ASP.NET,SQL)

论文阐述了企业物资管理系统的设计与实现,并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户登录,修改密码,物资的基本信息管理,出入库和损坏的管理已经综合查询等功能。 4.1 用户登录模块的实现 …

【滤波】非线性滤波

本文主要翻译自rlabbe/Kalman-and-Bayesian-Filters-in-Python的第9章节09-Nonlinear-Filtering(非线性滤波)。 %matplotlib inline#format the book import book_format book_format.set_style()介绍 我们开发的卡尔曼滤波器使用线性方程组&#xff0…

【C++】类和对象——拷贝构造函数的概念、拷贝构造函数的特征

文章目录 1.拷贝构造函数1.1拷贝构造函数的概念1.2拷贝构造函数的特征 1.拷贝构造函数 在前面我们已经介绍了构造函数和析构函数的作用和使用方法,而拷贝构造函数则是在对象初始化时调用的一种特殊构造函数。拷贝构造函数可以帮助我们创建一个新的对象,该…

互联网中的web3.0和gpt有何联系?

文章目录 ⭐前言⭐web 3.0💖 web1.0-web3.0的概念 ⭐chatgpt💖 gpt的概念 ⭐总结⭐结尾 ⭐前言 大家好,我是yma16,本文分享互联网中的web3.0和gpt的关系。 互联网的发展 第一台计算机的出现 世界上第一台通用计算机“ENIAC”于…

C语言(扫雷)

扫雷 开发过程开发思路菜单界面游戏界面的打印雷的随机产生扫雷以及判断胜利条件代码整合 开发过程 准备工作效果展示 准备工作: game.h 一个头文件–>声明函数 test.c 为主文件 game.c 为功能函数实现文件 效果展示 开发思路 菜单界面 游戏界面打印&…

二、机器人的结构设计

1 、螺丝连接的坚固性 坚固性是机器人能顺利完成指定任务的一个重要条件,无论我们程序设计的如何完美, 如果不能保证机器人具有坚固性和稳定性,就无法保证任务的顺利完成,机器人在运行时如 果发生散架和分裂都会影响其功能的实现…

阿里云的白名单规则如何实现IP限制和访问控制?

阿里云的白名单规则如何实现IP限制和访问控制?   [本文由阿里云代理商[聚搜云]撰写]   随着企业在云计算领域的深入应用,网络安全问题日益凸显。阿里云提供了一种名为“白名单”的规则,帮助用户实现IP限制和访问控制。本文将详细阐述阿里…

“ 最近 ” ,准备跳槽的可以看看

前两天跟朋友感慨,今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在已经12月了,具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说,绝对要从现在开始做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也…

【ROS】ROS2中的概念和名词解释

1、工作空间 workspace ROS以固定的目录结构创建项目工程,项目根目录称为工作空间 1.1 典型工作空间结构 src: 代码空间; build: 编译空间,保存编译过程中产生的中间文件; install:安装空间…

一种在不改变源码的情况下测试看门狗复位的方法

什么是“看门狗”? 看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数。如果程序运行正常,过…