当前位置: 首页 > 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;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...