当前位置: 首页 > news >正文

Java-Exception

目录

    • 异常
    • 概念
      • Error
      • Exception
    • 体系图
    • 常见运行时异常
      • NullPointerException
      • ArithmeticException
      • ArrayIndexOutOfBoundException
      • ClassCastException
      • NumberFormatException
    • 常见的编译异常
    • 异常处理机制
    • 自定义异常
    • throw和throws对比

异常是Java编程中的常见问题,了解如何处理异常至关重要。本文将介绍Java中异常的基本概念,以及如何捕获和处理它们,以构建健壮的应用程序。

异常

异常是在程序运行过程中发生的错误或意外情况,它可以中断正常的程序流程并引发错误处理机制。

Code

// 尝试执行可能引发异常的代码
public void divide(){int num1=10;int nums2=0;			int result = num1 / num2;   // 10/0 直接抛出异常
}

但是在真实的业务中,如果因为一个异常导致整个程序无法继续进行,说明这个程序的健壮性很差,

为了保证程序能够进行,可以使用trye-catch异常处理机制来解决

Code

public void divide(){try {int num1=10;int nums2=0;			int result = num1 / num2;   // 10/0 直接抛出异常} catch (ArithmeticException e) {// 捕捉并处理异常System.err.println("发生了算术异常:" + e.getMessage());} // 无论是否发生异常,都会执行的代码块System.out.println("程序执行结束");
}

如果进程异常处理,那么即使程序出现了异常,程序也可以继续进行。

概念

将程序执行中发生不正常的情况成为“异常”(开发过程中出现的语法错误等不是异常)

在执行过程中所发生的异常可以分为两大类:

Error

Jvm无法解决的严重问题,如:

  1. JVM系统内部出现错误、资源消耗
  2. StackOverFlow(栈溢出)、OOM(out of memory)等严重错误

Exception

Exception可以分为

  1. 运行时异常:程序运行过程中,发生异常(空指针、读取不到文件等)
  2. 编程时异常:编译器检测出来的异常

体系图

Untitled.png

常见运行时异常

NullPointerException

空指针异常,通常在尝试访问或操作尚未初始化或已设置为**null**的对象时发生。

Code

String myString = null;
System.out.println(myString.length()); // 这将引发NullPointerException

ArithmeticException

算数异常,它在进行算术运算(例如除以零)产生无效结果时发生。

Code:

int result = 5 / 0; // 这将引发ArithmeticException(算术异常)

这段代码中,尝试5除以0,从数学上来说是未定义计算公式,因此会引发ArithmeticException异常。

ArrayIndexOutOfBoundException

数组索引越界异常,通常在访问数组中不存在的索引位置而抛出。

Code

int nums={1,2,3,4};
int value=nums[10];   

数组nums有5个元素,索引范围是0~4,但是我们试图访问索引10的元素,这个索引超出了数组的最大范围,

因此抛出ArrayIndexOutOfBoundException异常。

ClassCastException

类型转换异常,通常在一种类型转为不兼容的类型时抛出。

Code

class Animal {// ...
}class Dog extends Animal {// ...
}class Cat extends Animal {// ...
}public class Main {public static void main(String[] args) {Animal animal = new Dog();Cat cat = (Cat) animal; // 这将引发ClassCastException(类转换异常)}
}

创建了Animal类和两个子类Dog、Cat,我们试图将Dog对象的引用转为Cat类型,这是一种不兼容的类型,

因此抛出ClassCastException异常。

NumberFormatException

数字格式异常,通常在字符串转为数字类型时发生格式错误时抛出

Code

String invalidNumber = "abc123";
int number = Integer.parseInt(invalidNumber); // 这将引发NumberFormatException(数字格式异常)

我们试图将包含字母字符的字符串"abc123" 转换为整数,这是不合法的数字格式,

因此会引发NumberFormatException(数字格式异常)。

常见的编译异常

  1. SQLException:(SQL异常)它表示在执行SQL语句或与数据库交互的过程中发生了问题或错误。
  2. IOException:(输入/输出异常)它表示在读取或写入文件、网络操作或其他I/O相关操作期间发生了问题或错误。
  3. FileNotFoundException:(文件未找到异常)FileNotFoundExceptionIOException的一种子类,表示尝试打开或读取一个不存在的文件时引发的异常。
  4. ClassNotFoundException:(类未找到异常)表示在尝试加载类时找不到类定义的情况

异常处理机制

在Java中,异常处理是通过一系列的关键字和机制来实现的。

  1. try-catch块:使用 try 和 catch 关键字来捕获和处理异常。异常可能会在 try 块中的代码中抛出,而 catch 块则用于捕获异常并执行相应的处理代码。

    try {// 可能会引发异常的代码
    } catch (ExceptionType e) {// 处理异常的代码
    }
    
  2. 多重catch两块:一个try块可以有多个catch块,用于捕获不同类型的异常,这样可以根据不同的类型异常执行不同的逻辑。

    try {// 可能会引发异常的代码
    } catch (ExceptionType1 e1) {// 处理 ExceptionType1 类型的异常
    } catch (ExceptionType2 e2) {// 处理 ExceptionType2 类型的异常
    }
    
  3. finally块:finally块用于包含try-catch块之后,它包含的代码无论是否发生异常都会执行。

    try {// 可能会引发异常的代码
    } catch (ExceptionType e) {// 处理异常的代码
    } finally {// 无论是否发生异常都会执行的代码
    }
    
  4. throws关键字:throw关键字可以用于在方法中主动引发异常,并不能像try-catch块一样有处理异常的逻辑,通常用于自定义异常或在特定条件下引发异常。

    public void someMethod() throws ExceptionType {// 可能会引发异常的代码
    }
    

自定义异常

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

自定义异常步骤

  1. 自定义异常类;如果继承Exception,属于编译类型异常;如果继承RuntimeException,属于运行时异常(通过继承RuntimeException)

    public class MyCustomException extends Exception {public MyCustomException() {super();}public MyCustomException(String message) {super(message);}public MyCustomException(String message, Throwable cause) {super(message, cause);}
    }
    

    通过自定义异常类提供多个构造函数,以便能够传递异常消息和可能的原因(Throwable)。这样可以让您的异常提供更多信息,以便于调试和理解问题。

  2. 使用自定义类异常,在代码中如果符合自定义异常的条件时,使用throw关键字抛出自定义异常;

    public void someMethod() throws MyCustomException {// 某些条件导致自定义异常情况if (someCondition) {throw new MyCustomException("自定义异常消息");}// 其他代码
    }
    
  3. 捕获和处理自定义异常:在应用程序的其他部分,也可以使用 try-catch 块来捕获和处理自定义异常

    try {someMethod();
    } catch (MyCustomException e) {// 处理自定义异常System.out.println("捕获自定义异常:" + e.getMessage());
    }
    

throw和throws对比

意义位置后面根的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象
  1. throw:在代码中显示地抛出异常对象,用于指定条件下的异常,throw 后面通常跟着一个异常对象的实例化或引用;

    public void someMethod() {if (someCondition) {throw new SomeException("Custom error message");}
    }
    
  2. throws:用于在方法声明中指定该方法可能会抛出的异常类型。

public void someMethod() throws ExceptionType {// 可能会引发异常的代码
}

通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java异常的使用。希望这次的修改对您有所帮助!如果需要进一步的修改或补充,请随时提出。

相关文章:

Java-Exception

目录 异常概念ErrorException 体系图常见运行时异常NullPointerExceptionArithmeticExceptionArrayIndexOutOfBoundExceptionClassCastExceptionNumberFormatException 常见的编译异常异常处理机制自定义异常throw和throws对比 异常是Java编程中的常见问题,了解如何…...

C++并发与多线程(2) | 线程运行开始和结束的基本方式

当程序运行起来,生成一个进程,该进程所属的主线程开始自动运行。当主线程从main()函数返回,则整个进程执行完毕。 主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,就代表着我们这个线程运行结束。 整个进…...

vue3前端开发-flex布局篇

文章目录 1.传统布局与flex布局优缺点传统布局flex布局建议 2. flex布局原理2.1 布局原理 3. flex常见属性3.1 父项常见属性3.2 子项常见属性 4.案例实战(携程网首页) 1.传统布局与flex布局优缺点 传统布局 兼容性好布局繁琐局限性,不能再移动端很好的布局 flex布…...

网络是什么?(网络零基础入门篇)

1.如何理解局域网和广域网? 2.路由器和交换机是怎么样工作的? 3.三层交换机能不能代替路由器? -- 局域网 广域网 -- 企业网架构,运营商架构,数据中心架构 -- 局域网 通过 交换机连接的 转发 相同的ip地址…...

【JavaEE】线程安全的集合类

文章目录 前言多线程环境使用 ArrayList多线程环境使用队列多线程环境使用哈希表1. HashTable2. ConcurrentHashMap 前言 前面我们学习了很多的Java集合类,像什么ArrayList、Queue、HashTable、HashMap等等一些常用的集合类,之前使用这些都是在单线程中…...

【C++算法】is_partitioned、partition_copy和partition_point

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、is_partitioned函数:1.1 is_partitioned是什么?1.2 函数原型1.3 示例代码1.4 更多示例代码 二、partition_copy函数2.1 概念2.2 函数…...

MyBatis(JavaEE进阶系列4)

目录 前言: 1.MyBatis是什么 2.为什么要学习MyBatis框架 3.MyBatis框架的搭建 3.1添加MyBatis框架 3.2设置MyBatis配置 4.根据MyBatis写法完成数据库的操作 5.MyBatis里面的增删改查操作 5.1插入语句 5.2修改语句 5.3delete语句 5.4查询语句 5.5like查…...

『力扣每日一题15』:买卖股票的最佳时机

一、题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的…...

Java中栈实现怎么选?Stack、Deque、ArrayDeque、LinkedList(含常用Api积累)

目录 Java中的Stack类 不用Stack有以下两点原因 1、从性能上来说应该使用Deque代替Stack。 2、Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。 该用ArrayDeque还是LinkedList? ArrayDeque与LinkList区别&#xff1…...

雷达分辨率单元、单向/双向雷达方程、天气雷达方程简介

一、点状目标 如果两个点状目标在一个分辨率单元中,经典脉冲雷达只能看到一个目标。 点状目标 二、雷达距离分辨率 对于简单的键控开/关脉冲调制: 对于使用脉冲内调制的雷达,距离分辨率取决于压缩脉冲的脉冲持续时间。脉冲压缩比(PCR)取决于传输带宽BWtx,即距离分辨率取…...

RabbitMQ之Fanout(扇形) Exchange解读

目录 基本介绍 适用场景 springboot代码演示 演示架构 工程概述 RabbitConfig配置类:创建队列及交换机并进行绑定 MessageService业务类:发送消息及接收消息 主启动类RabbitMq01Application:实现ApplicationRunner接口 基本介绍 Fa…...

Redisson—分布式集合详述

7.1. 映射(Map) 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是,RMap保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数…...

开发做前端好还是后端好?这是个问题!

前言 随着互联网的快速发展,越来越多的人选择从事Web开发行业,而Web开发涉及到前端和后端两个方面,相信许多人都曾经对这两个方面进行过探究。而且编程世界就像一座大城市,前端开发和后端开发就像城市的两个不同街区。作为初学者&…...

运行huggingface Kosmos2报错 nameerror: name ‘kosmos2tokenizer‘ is not defined

尝试运行huggingface上的Kosmos,https://huggingface.co/ydshieh/kosmos-2-patch14-224失败,报错: nameerror: name kosmos2tokenizer is not defined查看报错代码: vi /root/.cache/huggingface/modules/transformers_modules/ydshieh/kosmos-2-patch14-224/48e3edebaeb…...

吃鸡玩家必备神器!一站式提升战斗力、分享干货!

大家好,我是吃鸡玩家。在这个视频中,我要分享一个让你瞬间提高战斗力的神器,同时让你享受到顶级游戏作战干货的盛宴!让我们一起来了解吧! 首先,我们推荐绝地求生作图工具。通过这款工具,你可以轻…...

【maven】idea中基于maven-webapp骨架创建的web.xml问题

IDEA中基于maven-webapp骨架创建的web工程&#xff0c;默认的web.xml是这样的。 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name…...

【算法题】2034. 股票价格波动

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一支股票价格的数据流。数据流…...

APSIM模型】作物模型应用案例

APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和Next Generation两个系列模型&#xff0c;能模拟几十种农作物、牧草和树木的土壤-植物-大气过程&#xff0c;被广泛应用于精细农业、水肥管理、气候变化、粮食安…...

io_uring之liburing库安装

手动编译和安装 liburing&#xff1a; 1.首先&#xff0c;从 liburing 的 GitHub 仓库中获取源代码。您可以使用以下命令克隆仓库&#xff1a; git clone https://github.com/axboe/liburing.git2.进入 liburing 目录&#xff1a; cd liburing3.运行configure ./configure …...

Python WebSocket自动化测试:构建高效接口测试框架!

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…...

MySQL数据库——SQL优化(1)-介绍、插入数据、主键优化

目录 介绍 插入数据 Insert 大批量插入数据 主键优化 数据组织方式 页分裂 页合并 索引设计原则 介绍 SQL优化将分为下面几个部分进行学习&#xff1a; 插入数据主键优化order by优化group by优化limit优化count优化update优化 首先就先来看第一方面&#xff0c; 插…...

Flink---10、处理函数(基本处理函数、按键分区处理函数、窗口处理函数、应用案例TopN、侧输出流)

星光下的赶路人star的个人主页 我的敌手就是我自己&#xff0c;我要他美好到能使我满意的程度 文章目录 1、处理函数1.1 基本处理函数&#xff08;ProcessFunction&#xff09;1.1.1 处理函数的功能和使用1.1.2 ProcessFunction解析1.1.3 处理函数的分类 1.2 按键分区处理函数&…...

多种方案教你彻底解决mac npm install -g后仍然不行怎么办sudo: xxx: command not found

问题概述 某些时候我们成功执行了npm install -g xxx&#xff0c;但是执行完成以后&#xff0c;使用我们全局新安装的包依然不行&#xff0c;如何解决呢&#xff1f; 解决方案1&#xff1a; step1: 查看npm 全局文件安装地址 XXXCN_CXXXMD6M ~ % npm list -g …...

斐波那契数列 JS

问题&#xff1a; 给出一个数字&#xff0c;找出它是斐波那契数列中的第几个数 斐波那契数列 [1, 1, 2, 3, 5, 8, 13, ...]&#xff0c;后一个数字是前两个数字之和 输入的数字大于等于 2 如果输入数字不存于斐波那契数列中&#xff0c;返回 -1 function demo(num) {//初始数据…...

IP 地址的分类

IP地址是用于标识计算机或设备在互联网上的位置的一种地址。IP地址通常根据其范围和用途分为不同的分类&#xff0c;主要包括以下几种&#xff1a; IPv4地址&#xff08;Internet Protocol version 4&#xff09;&#xff1a; IPv4地址是32位二进制数&#xff0c;通常以点分十…...

CDN网络基础入门:CDN原理及架构

背景 互联网业务的繁荣让各类门户网站、短视频、剧集观看、在线教育等内容生态快速发展&#xff0c;互联网流量呈现爆发式增长&#xff0c;自然也面临着海量内容分发效率上的挑战&#xff0c;那么作为终端用户&#xff0c;我们获取资源的体验是否有提升呢&#xff1f; 答案是…...

李沐深度学习记录2:10多层感知机

一.简要知识记录 x.numel()&#xff1a;看向量或矩阵里元素个数 A.sum()&#xff1a;向量或矩阵求和&#xff0c;axis参数可对某维度求和&#xff0c;keepdims参数设置是否保持维度不变 A.cumsum&#xff1a;axis参数设置沿某一维度计算矩阵累计和x*y:向量的按元素乘法 torch.…...

Python标准库中内置装饰器@staticmethod@classmethod

装饰器是Python中强大而灵活的功能&#xff0c;用于修改或增强函数或方法的行为。装饰器本质上是一个函数&#xff0c;它接受另一个函数作为参数&#xff0c;并返回一个新的函数&#xff0c;通常用于在不修改原始函数代码的情况下添加额外的功能或行为。这种技术称为元编程&…...

MySQL8 间隙锁在11种情况下的锁持有情况分析

测试环境及相关必要知识 测试环境为mysql 8 版本 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;用于锁定索引范围之间的间隙&#xff0c;防止其他事务在此间隙中插入新记录。间隙锁主要用于防止幻读问题。 在可重复读的隔离级别下默认打开该锁机制&#xff0c;解决幻…...

C# 图片按比例进行压缩

1、对图片进行压缩&#xff0c;保存在本地 对于一个200k的png文件按0.6的缩放比例进行压缩&#xff0c;压缩后的大小为20k左右 对于一个80k的jpg文件按0.6的缩放比例压缩&#xff0c;压缩后为13k左右 public void imageZoom(string name, Double zoomScale){Bitmap btImage …...

国学大师网站谁做的/网络公司网络推广服务

Im Shendi,之前使用到JavaFX,感觉... ....(使用 java 自带的 swing 和 awt 比较多 并且已经熟悉) 所以我找了找Eclipse有没有Java自带的swing或者awt的 可视化插件, 进行桌面开发当然是可视化开发更简单,效率更高. 使用Eclipse的WindowBuilder插件可以让我们进行可视化开发.…...

四川学校网站建设/qq推广官网

2019独角兽企业重金招聘Python工程师标准>>> VPPDropDown 是一个 iOS 组件&#xff0c;通过 UITableView 实现了类似下拉列表的菜单。 转载:http://www.adobex.com/ios/source/details/00000701.htm 转载于:https://my.oschina.net/u/868244/blog/105977...

网站开发的热门博客/网络营销案例题

1. 问题描述&#xff1a; 给你二叉树的根节点 root 和一个整数 distance 。 如果二叉树中两个叶节点之间的最短路径长度小于或者等于 distance &#xff0c;那它们就可以构成一组好叶子节点对 。 返回树中好叶子节点对的数量 。 示例 1&#xff1a; 输入&#xff1a;root [1…...

网站扩展性/aso优化技巧大aso技巧

最近面试问道rem的问题&#xff0c;按照原来的工作经验解答&#xff0c;然后回来从网上搜索了一些关于rem的解释和原理&#xff0c;发现跟本都不是自己想找的那种&#xff0c;就根据自己的理解写了这一边文章&#xff0c;以此记录一下&#xff0c;方便自己查找。如有大神觉得我…...

网站开发主要学些什么/微信推广平台收费标准

1 什么是TIFF&#xff1f; TIFF是Tagged Image File Format的缩写。在现在的标准中&#xff0c;只有TIFF存在&#xff0c; 其他的提法已经舍弃不用了。做为一种标记语言&#xff0c;TIFF与其他文件格式最大的不同在于除了图像数据&#xff0c;它还可以记录很多图像的其他信息。…...

国际近期新闻/优化大师客服

我有一张包含价格信息的表格.我需要选择每三行的最大值.例&#xff1a;Table daily_high____ _______| ID | HIGH || 1 | 24.65 || 2 | 24.93 || 3 | 26.02 || 4 | 25.33 || 5 | 25.16 || 6 | 25.91 || 7 | 26.05 || 8 | 28.13 || 9 | 27.07 ||____|_______|Desired output to …...