12.异常-Exception|Java学习笔记

news2025/2/12 23:47:28

文章目录

  • 异常介绍
  • 异常体系图一览
  • 运行时异常
  • 编译异常
  • 异常处理
    • 异常处理的方式
    • try-catch 异常处理
    • throws 异常处理
      • 注意事项和使用细节
  • 自定义异常
    • 自定义异常的步骤
  • throw和throws的区别

异常介绍

基本概念:Java语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常)。

执行过程中所发生的异常事件可分为两大类

  1. Error(错误): Java虚拟机无法解决的严重问题。如: JVM系统内部错误、资源耗尽等严重情况。比如:StackOverflowError[栈溢出]和OOM(out ofmemory), Error 是严重错误,程序会崩溃。
  2. Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中断等等,
    Exception 分为两大类:
    运行时异常[程序运行时,发生的异常] 和
    编译时异常[编程时,编译器检查出的异常]。

异常体系图一览

下图是异常体系图,【这张图很重要!】
在这里插入图片描述

  1. 异常分为两大类,运行时异常编译时异常
  2. 运行时异常,编译器检查不出来。一般是指编程时的逻辑错误,是程序员应该避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
  3. 对于运行时异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。
  4. 编译时异常,是编译器要求必须处置的异常

运行时异常

常见的 运行时异常 包括

  1. NullPointerException 空指针异常【当应用程序试图在需要对象的地方使用 null 时,抛出该异常】
  2. ArithmeticException 数学运算异常【当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例】
  3. ArrayIndexOutOfBoundsException 数组下标越界异常【用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引】
  4. ClassCastException 类型转换异常【当试图将对象强制转换为不是实例的子类时,抛出该异常】
  5. NumberFormatException 数字格式不正确异常【当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们可以确保输入是满足条件数字.】

编译异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常包括

  • SQLException //操作数据库时,查询表可能发生异常
  • IOException //操作文件时,发生的异常
  • FileNotFoundException //当操作一个不存在的文件时, 发生异常
  • ClassNotFoundException //加载类,而该类不存在时,异常
  • EOFException //操作文件,到文件末尾,发生异常
  • IllegalArguementException //参数异常

异常处理

对异常进行捕获,保证程序可以继续运行。

package com.fwedu.exception_;

public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;

        try {
            int res = num1 / num2;
        } catch (Exception e) {
            System.out.println("出现异常的原因=" + e.getMessage());
        }

        System.out.println("程序继续运行。。。");
    }
}

异常处理的方式

  1. try-catch-finally
    程序员在代码中捕获发生的异常,自行处理。
    在这里插入图片描述

  2. throws
    将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
    在这里插入图片描述

try-catch 异常处理

Java提供try和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try…catch块。

基本语法

public class TryCatchDetail {
    public static void main(String[] args) {
        try {
            // 可疑代码
            // 将异常生成对应的异常对象,传递给catch块
        } catch (NumberFormatException e) {
            System.out.println("异常信息1:" + e.getMessage());	// 对异常的处理
        } catch (Exception e) {
            System.out.println("异常信息2:" + e.getMessage());
        } finally {		// 可以没有finally
            System.out.println("finally代码块被执行。。。");
        }
        System.out.println("程序继续。。。");
    }
}
  1. 如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块。
  2. 如果异常没有发生, 则顺序执行try的代码块,不会进入到catch。
  3. 如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用如下代码- finally{}
  4. 可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NullPointerException 在前),如果发生异常,只会匹配一个catch
  5. 可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉/退出。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

throws 异常处理

  1. 如果个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理
  2. 在方法声明中用throws语包可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
package com.fwedu.throws_;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class Throws01 {
    public static void main(String[] args) {

    }

    public void f2() throws FileNotFoundException, NullPointerException, Exception {
        FileInputStream fis = new FileInputStream("d://a.txt");
    }
}

注意事项和使用细节

  1. 对于编译异常,程序中必须处理,比如try-catch或者throws
  2. 对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
  3. 子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型[举例]
  4. 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws

自定义异常

当程序中出现了某些“错误”,但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该错误信息。

自定义异常的步骤

  1. 定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException
  2. 如果继承Exception,属于编译异常
  3. 如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)
package com.fwedu.customexception_;

public class CustomException {
    public static void main(String[] args) {
        int age = 180;
        if (!(age >= 18 && age <= 120)) {
            throw new AgeException("年龄需要在 18~120 之间");
        }
        System.out.println("你的年龄范围正确。");
    }
}

class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }
}

运行的结果如下:

Exception in thread "main" com.fwedu.customexception_.AgeException: 年龄需要在 18~120 之间
	at com.fwedu.customexception_.CustomException.main(CustomException.java:10)

throw和throws的区别

在这里插入图片描述
throws 异常处理中讲到了 throws

抛出单个异常是使用了 throw

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

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

相关文章

【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

经过前面的铺垫&#xff0c;我们已经具备实现并发服务器的基础了&#xff0c;接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧&#xff01; 多任务回声服务器模型 在编写代码前&#xff0c;先让我们大致将多任务&#xff08;回声&#xff09;服务器的模型抽象…

mac下部署和访问 Kubernetes 仪表板(Dashboard)

简介 Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中&#xff0c;也可以对容器应用排错&#xff0c;还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息&#xff0c;也可以创建或者修改 Kub…

技术分享——隐私计算简介

随着数据规模的不断扩大和网络技术的快速发展&#xff0c;数据安全和隐私保护成为了热门的话题。隐私计算作为一种新兴的数据安全和隐私保护技术&#xff0c;为数据安全和隐私泄露问题提供了新的思路和方法。 2020年10月19日&#xff0c;Gartner发布2021年前沿战略科技趋势&am…

VTK源码编译安装记录与教程(VS2019+QT5.15.2+PCL1.12.1+VTK9.1.0配置,超详细)

因为PCL库&#xff08;傻瓜式安装&#xff09;中自动安装的VTK库并不完整&#xff0c;不支持QT环境的UI界面开发&#xff0c;于是&#xff0c;想用QT在VS2019上开发图形界面程序&#xff0c;需要单独自己通过VTK源码编译安装&#xff0c;再进行配置。本人安装时开发环境已经装好…

2023拒绝行业内卷!八年软件测试月薪30K*16薪行业心得 想入行必看

目前工作做软件测试工作8年&#xff0c;属于高级测试员那个级别吧&#xff01;现在看到各行各业的人都在转行学习软件测试&#xff0c;想给大家一些学习建议和忠告。 很多粉丝都跟我说今年行情很差&#xff0c;找不到工资&#xff0c;真的找不到工作了吗&#xff1f; 我们常在网…

simhash原理以及用python3实现simhash算法详解(附python3源码)

1. 为什么需要Simhash? 传统相似度算法:文本相似度的计算,一般使用向量空间模型(VSM),先对文本分词,提取特征,根据特征建立文本向量,把文本之间相似度的计算转化为特征向量距离的计算,如欧式距离、余弦夹角等。 缺点:大数据情况下复杂度会很高。 Simhash应用场景:…

Graph Learning笔记 - 长尾分布问题

Graph Learning笔记 - 长尾分布问题 分享四篇论文入门图神经网络时的学习笔记。 SL-DSGCN 论文&#xff1a;Investigating and Mitigating Degree-Related Biases in Graph Convolutional Networks 来源&#xff1a;2020CIKM 概要 GCN在图的半监督学习上能取得良好表现&a…

lora,固定模特+固定衣服,怎么实现?

在电商行业&#xff0c;经常会有一个需求&#xff0c;就是把固定的衣服让模型穿上&#xff0c;然后拍很多的图片&#xff0c;放在商品主图、详情页、买家秀...... 人工智能发展到现在&#xff0c;最近aigc也挺热门的&#xff0c;有没有办法用“人工智能”算法就实现这个功能&a…

逆向汇编反汇编——函数分析

add esp,8就是把esp调整到函数调用之前的状态&#xff0c;用以平衡堆栈 默认采用的是cdcall&#xff1a;外平栈 stdcall:内平栈 什么是堆栈平衡&#xff1f; 》原来的堆栈是什么样的&#xff0c;函数调用之后堆栈还是什么样的(即&#xff0c;esp和ebp的值保持不变)&#xf…

掌握Scala数据结构(2)MAP、TUPLE、SET

一、映射 (Map) &#xff08;一&#xff09;不可变映射 1、创建不可变映射 创建不可变映射mp&#xff0c;用键->值的形式 创建不可变映射mp&#xff0c;用(键, 值)的形式 注意&#xff1a;Map是特质&#xff08;Scala里的trait&#xff0c;相当于Java里的interface&#…

git选择指定分支中的指定目录进行合并

指定路径合并 先进入branch A &#xff1a; git checkout branchA 将dir2中的变更转移至branchA&#xff1a; git checkout branchB dir2 所有变更将出现在branchA中的dir2中&#xff0c;检查后提交即可。 git commit -m "sync branchB dir2 to branchA" 也可以…

读财报丨第二增长曲线渐显,但涂鸦智能的未来还看PaaS业务?

2022年以来&#xff0c;全球物联网行业持续低迷&#xff0c;赛道内不少玩家出现业绩下滑&#xff0c;而且陆续传出巨头企业关停相关业务板块的消息。这背后是消费电子行业库存积压&#xff0c;客户需求难以释放等宏观因素&#xff0c;导致IoT领域面临一定的经营困境。 近日&am…

STM32——07-STM32定时器Timer

定时器介绍 软件定时 缺点&#xff1a;不精确、占用 CPU 资源 void Delay500ms () //11.0592MHz { unsigned char i , j , k ; _nop_ (); i 4 ; j 129 ; k 119 ; do { do { while ( -- k ); } while ( -- j ); } while ( -- i ); } 定时器工…

108-Spring的底层原理(下篇)

这里续写上一章博客&#xff08;107章博客&#xff09;&#xff1a; Spring 声明式事务的支持&#xff1a; 编程式事务&#xff1a;在业务代码中添加事务控制代码&#xff0c;这样的事务控制机制就叫做编程式事务 声明式事务&#xff1a;通过xml或者注解配置的方式达到事务…

【Linux】进程间通信(管道)

文章目录 进程通信的目的进程间通信发展进程间通信分类管道System V IPCPOSIX IPC 管道什么是管道管道的读写规则管道的特点&#xff1a;匿名管道处理退出问题命名管道创建一个命名管道匿名管道与命名管道的区别命名管道的打开规则 进程通信的目的 数据传输&#xff1a;一个进程…

应用层协议 —— websocket

websocket介绍 websocket是从HTML5开始支持的一种网页端和服务端保持长连接的消息推送机制。 传统的web程序都是属于“一问一答”的形式&#xff0c;即客户端给服务器发送了一个HTTP请求&#xff0c;服务器给客户端返回一个HTTP响应。这种情况下服务器属于被动的一方&#xff…

前端食堂技术周刊第 86 期:Remix 拥抱 RSC、2023 React 生态系统、从 0 实现 RSC、字节跳动 Mobile DevOps 工程实践

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;椰子水 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 Remix 拥抱 RSCWebContainers 原生支持 npm、yarn 和 pnpm2023 React 生态系…

MySQL InnoDB集群部署及管理全教程

MySQL InnoDB 集群提供完整的高可用性 MySQL 的解决方案。通过使用MySQL Shell附带的AdminAPI&#xff0c;您可以轻松 配置和管理至少三个MySQL服务器的组 实例以充当 InnoDB 集群。 InnoDB 集群中的每个 MySQL 服务器实例都运行 MySQL 组复制&#xff0c;提供复制机制 InnoDB…

LoadRunner 2023 下载和安装

下载 LoadRunner目前最新的版本是2023版&#xff0c;需要到Micro Focus公司的官网注册账号然后申请下载&#xff0c;比较麻烦&#xff0c;这里我把大家常用的社区版本&#xff0c;搬运到阿里云盘上&#xff0c;供下载&#xff1a; https://www.aliyundrive.com/s/WtHSzD4MrXw …

面试了十几家软件测试公司谈谈我最近面试的总结

由于互联网裁员&#xff0c;最近在 bosss 上投了些简历&#xff0c;测试开发岗&#xff0c;看看目前市场情况。 虽然都在说大环境不好&#xff0c;失业的人很多&#xff0c;我最近约面试的还是比较多的&#xff0c;说说最近的体会吧&#xff0c;希望能给大家提供价值。 1、20K…