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

认识Java中的异常(半成品)

1.异常的概念与体系结构

1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如

1.算数异常

public class Main1 {public static void main(String[] args){System.out.println(10/0);}
}
//异常信息为:Exception in thread "main" java.lang.ArithmeticException: / by zero
//	            at Object1.work.error.Main1.main(Main1.java:5)

 2.数组越界异常

public class Main1 {public static void main(String[] args){int[] auto = new int[10];System.out.println(auto[100]);}
}
//异常信息为:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
//	            at Object1.work.error.Main1.main(Main1.java:6)

3.空指针异常 

public class Main1 {public static void main(String[] args){int[] arr = null;System.out.println(arr.length);}
}
//异常信息为:Exception in thread "main" java.lang.NullPointerException
//	          at Object1.work.error.Main1.main(Main1.java:6)

上述过程中我们可以看见Java中不同类型的异常都有,不同的描述方式

1.2异常的体系结构

异常的种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的专门体系结构:

大致可以分为两个大方向

Throwable:异常的主类

Error:是指Java虚拟机无法解决的严重问题

Exception:异常产生后程序员可以通过代码进行处理,是程序继续执行. 

1.3异常的分类

异常可能在编译的时候发生,也可能在程序运行的时候发生,但根据时间的不同,异常可以被分类为:

1.编译时的异常(受检查异常)

2.运行时的异常(非受检查异常)

2.异常处理

2.1防御式编程

1.LBYL:Look Before You Leap.在操作前就做充分的检查

public class Main1 {public static void main(String[] args){boolean ret = false;if(!ret){//处理登录异常的相关代码return;}//登录游戏if(!ret){//处理游戏匹配异常的相关代码return;}//进入游戏}
}

像上述代码就是属于,防御型的异常处理,在我们为了防止异常的出现提前设置好相应异常的处理方式. 这种代码格式会使正常的代码和处理错误的代码混和在一起,显的代码比较混乱

2.EAFP:先操作,遇到问题在处理,即:事后认错型

这种操作的优势在于:正常的流程和错误的流程是分开操作的,我们更加关注正常流程

在java中,异常处理的主要的5个关键字分别是: throw,try,catch,final,throws.

2.2异常的抛出

在编写程序的时候,如果程序出现错误,我们需要把错误信息返回给此信息的调用者

在Java中可以通过throw关键字,抛出一个指定的异常对象,把错误信息告诉调用者

throw new xxxxException("异常产生的原因");

需求:实现一个获取数组中任意位置元素的方法

public class Main2 {public static int getElement(int[] array, int index){if(null == array){throw new NullPointerException("传递的数组为 null");}if(index < 0 || index >=array.length){throw new IndexOutOfBoundsException("数组索引越界");}return array[index];}public static void main(String[] args) {int[] array = {1,2,3,4,5};getElement(array,9);}
}

当array数组为"null"和数组索引越界时都会发生报错报错信息是根据各自抛出的throw中的内容.

注意事项:

1.throw必须写在方法体的内部

2.抛出的对象必须是Exception或者是Exception的子类对象

3.如果抛出的是RunTimeException或者是RunTimeException的子类,我们可以不用处理交给jvm处理就行

4.如果抛出的异常是编译的异常,必须要用户处理,否则无法通过编译

5.异常一旦抛出后面的代码是不会继续执行的

2.3异常的捕获

异常的捕获,也就是异常的具体的处理方式,通常有两种,throws以及try-catch捕获处理

2.31 异常声明throws

当方法中抛出编译异常的时候,用户不想处理该异常,此时可以借助throws将异常抛给方法的调用者来处理,就是说:当前方法不处理异常,提醒方法的调用者来处理该异常.

单独使用throw出现异常会让程序终止

public class Main3 {private static double divide(double a,double b){if(b == 0){throw new ArithmeticException("不能以0为除数");}return a/b;}public static void main(String[] args) {System.out.println(divide(10,0));}
}
// 输出结果:
// Exception in thread "main" java.lang.ArithmeticException: 不能以0为除数
// 	at Object1.work.error.Main3.divide(Main3.java:3)
// 	at Object1.work.error.Main3.main(Main3.java:7)

使用try-catch进行结合处理 

public class Main3 {private static double divide(double a,double b){if(b == 0){throw new ArithmeticException("不能以0为除数");}return a/b;}public static void main(String[] args) {System.out.println("抛出异常");try{//把也能抛出异常的代码放进try块中System.out.println(divide(10,0));}catch(ArithmeticException e){//捕获异常并打印异常信息System.out.println("捕获到的异常信息为:"+e.getMessage());}System.out.println("异常抛出后");}
}
// 输出结果:
// 抛出异常
// 捕获到的异常信息为:不能以0为除数
// 异常抛出后

可以看出程序是正常进行的并没有影响的程序的正常进行,可以理解为,自己抛出的异常被自己给处理掉了.

public class Main3 {private static double divide(double a,double b){if(b == 0){throw new ArithmeticException("不能以0为除数");}return a/b;}private static void func1(){divide(10,0);}private static void func2(){//func2()调用了func1(),如果func1()抛出了异常,func2()也会抛出异常func1();}public static void main(String[] args) {System.out.println("抛出异常");try{//把也能抛出异常的代码放进try块中func2();}catch(ArithmeticException e){//捕获异常并打印异常信息System.out.println("捕获到的异常信息为:"+e.getMessage());}System.out.println("异常抛出后");}
}

也可以通过方法之间进行调用先调用func2()通过func2()在去调用func1() 

 

public class Main4 {public static void main(String[] args) {try{int a = 10/0;}catch(ArithmeticException e){System.out.println("发生算数异常");}catch(NullPointerException e){System.out.println("发生空指针异常");}catch(ArrayIndexOutOfBoundsException e){System.out.println("发生数组越界异常");}}
}

产生的异常如果try下面出现多个catch它会依次进行匹配匹配到相应的错误信息后会打印出相关的错误内容,如果catch中没有相对应的异常时,就会交给jvm处理程序终止.

public class Main5 {public static void main(String[] args) {int[] arr = new int[5];try{System.out.println(arr[6]);}catch(ArithmeticException e){System.out.println("发生算数异常");} catch(NullPointerException e){System.out.println("发生空指针异常");}catch(ArrayIndexOutOfBoundsException e){System.out.println("发生数组越界异常");}catch(Exception e){System.out.println("发生其他异常");}}
}
//输出结果
//发生数组越界异常
public class Main5 {public static void main(String[] args) {int[] arr = new int[5];try{System.out.println(arr[6]);}catch(ArithmeticException e){System.out.println("发生算数异常");} catch(NullPointerException e){System.out.println("发生空指针异常");}catch(Exception e){System.out.println("发生其他异常");}}
}
//输出:
//发生其他异常
public class Main5 {public static void main(String[] args) {int[] arr = new int[5];try{System.out.println(arr[6]);}catch(Exception e){System.out.println("发生其他异常");}catch(ArithmeticException e){System.out.println("发生算数异常");} catch(NullPointerException e){System.out.println("发生空指针异常");}}
}
//发生报错无法正常进行

 

 通过上述代码进行比较:我们可以看出我们可以使用Exception来进行处理抛出的异常,但是用Exception是无法准确表达异常信息的一般我们是不建议使用的,还有就是Exception是上面三个异常的父类,而在catch时 Exception是是不能放在它子类前面的否则会发生报错

 

相关文章:

认识Java中的异常(半成品)

1.异常的概念与体系结构 1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如 1.算数异常 public class Main1 {public static void main(String[] args){System.out.println(10/0);} } //异常信息为:Exception in thread "main" java.lang.ArithmeticExc…...

生成SSH秘钥文件

git生成文件命令 # 配置用户名和邮箱 git config --global user.name "你的GitHub用户名" git config --global user.email "你的GitHub邮箱"# 生成ssh-key ssh-keygen -t rsa -C “你的GitHub邮箱" # 验证 ssh -T gitgithub .com 第一步&#xff1a;…...

wsl2子系统ubuntu发行版位置迁移步骤

默认的wsl2发行版是安装在windos的c盘&#xff0c;占用空间较大&#xff0c;有迁移需求&#xff0c;也可以迁移到其他电脑&#xff1b; 查看现有发行版信息 运行以下命令查看现有的 WSL 发行版及其状态&#xff1a; wsl --list --verbose# 输出示例NAME STATE …...

协程设计原理与实现

协程设计原理与汇编实现 同步与异步 对于任何一个事情&#xff0c;都可以划分为不同的步骤。所谓同步&#xff0c;就先做第一个事情&#xff0c;按照这件事的步骤完成这件事之后&#xff0c;再去做第二件事。再去做第三件事&#xff0c;以此类推。 异步就是&#xff0c;可以…...

合并区间C和C++的区别、布尔、整型、浮点、指针类型和0做比较、malloc、calloc、realloc的区别

56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {//先按照每个区间的左元素排序&#xff0c;这样每个区间的左边界就固定了&#xff0c;所以之后考虑相邻的//区间是否是相交的就行 类似与栈的…...

Flutter 图片编辑板(一) 事件路由

一个图片编辑板&#xff0c;有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget&#xff0c;具有缩放偏移的功能。 在图片编辑板上&#xff0c; 会有多个内容相&#xff0c;图片或文字&#xff08;添加文字目前还没做过&#xff09;。 当要编辑其中…...

【Java】—— 图书管理系统

基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标&#xff1a; 1、系统中能够表示多本图书的信息 2、提供两种用户&#xff08;普通用户&#xff0c;管理员&#xff09; 3、普通用户…...

数据库基础入门:从零开始学习数据库的核心概念

数据库是现代软件开发的核心组成部分之一&#xff0c;无论是网站、手机应用还是企业管理系统&#xff0c;都离不开数据库的支持。本文将带你从零开始&#xff0c;逐步了解数据库的基本概念和常见操作。 什么是数据库&#xff1f; 数据库&#xff08;Database&#xff09;是一个…...

Y20030002 微信+Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现 源代码 配置文档 全套资料

问卷调查微信小程序 1.摘要2. 系统开的背景和意义3. 国内外研究现状4. 系统功能5.界面展示6.源码获取 1.摘要 摘 要&#xff1a;本文深入研究并实现了一个基于微信小程序的问卷调查系统。微信小程序问卷调查系统借助于微信小程序的便捷性和普及性&#xff0c;为用户提供了一个…...

ros项目dual_arm_pick-place(urdf文件可视化查看)

前言 一直想写一些项目的讲解&#xff0c;今天&#xff08;2024.12.05&#xff09;可以说正式开始了。 dual_arm_pick-place项目&#xff0c;是关于两个机械臂协同传递物品。 正文 这次的话&#xff0c;给大家讲一下里面的urdf文件。 这篇文章主要来看一下项目中的urdf文件…...

AI-安全-B站

1 需求 百度-林道正-《大模型合规探索》火山引擎-林泽韬-《大模型安全挑战与防护实践》Chamd5-bayuncao-《基于RAG的AI代码审计框架》德国电信咨询有限公司-杨麟-《AI在SOC中的应用发展》360-李亚青-《以模制模&#xff0c;大模型安全的解决之道》金晴云华-富吉祥-《安全大脑在…...

【C#设计模式(19)——备忘录模式(MementoPattern)】

前言 备忘录模式&#xff1a;将想要备份的信息交给备忘录对象来管理。通过设置初始、备份、修改、恢复等状态展示备忘录模式的使用。 代码 //备忘录类 public class Memento {private string state;public string State { get>state;}public Memento(string state){this.st…...

第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 事件处理是 Web 开发中不可或缺的一部分&#xff0c;它允许开发者响应用户的交互行为&#xff08;如点击、键盘输入等&#xff09;或浏览器的行为&#xff08;如页面加载完成&#xff09;。通过事件处理&#xff0c;我们可以使网页更加动态和互动。以下是关于 JavaS…...

工具推荐-js爬取工具

现在测试方向都偏向于从js中的接口来入手找到可以进的点&#xff0c;关于快速扫描js文件来发现敏感接口的工具有很多&#xff0c;下面的jjjjs就是其一 项目地址: GitHub - ttstormxx/jjjjjjjjjjjjjs: 爬网站JS文件&#xff0c;自动fuzz api接口&#xff0c;指定api接口&#x…...

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

ejb组件(rmi) webservice平台(xml)

springboot bean 在 Spring Boot 中&#xff0c;Bean 是 Spring 框架的核心概念之一&#xff0c;表示由 Spring 容器管理的对象。通过 Bean 或其他注解&#xff08;如 Component、Service、Repository 等&#xff09;来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...

【jvm】垃圾回收的重点区域

目录 1. 说明2. 堆&#xff08;Heap&#xff09;3. 方法区&#xff08;Method Area&#xff09; 1. 说明 1.JVM&#xff08;Java Virtual Machine&#xff09;垃圾回收的重点区域主要集中在堆&#xff08;Heap&#xff09;和方法区&#xff08;Method Area&#xff09;。2.堆是…...

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…...

谈谈web3

全面解析 Web3&#xff1a;未来互联网的革命性进程 引言&#xff1a;互联网进化的三部曲 互联网的发展经历了三个重要阶段&#xff0c;每一个阶段都深刻地改变了我们的生活方式&#xff1a; Web1&#xff08;1990-2005&#xff09;&#xff1a;静态互联网时代&#xff0c;人…...

正则表达式实战例子

正则表达式实战例子 1. 验证电子邮件地址 定义一个合理的电子邮件格式&#xff0c;并检查给定的字符串是否符合这个模式。 import redef is_valid_email(email):# 定义电子邮件格式的正则表达式pattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$return bool(re.match(…...

Wwise音频处理完整指南:从游戏音效解包到个性化替换的终极方案

Wwise音频处理完整指南&#xff1a;从游戏音效解包到个性化替换的终极方案 【免费下载链接】wwiseutil Tools for unpacking and modifying Wwise SoundBank and File Package files. 项目地址: https://gitcode.com/gh_mirrors/ww/wwiseutil 还在为游戏音频文件无法编辑…...

别再死记硬背了!用Python模拟LDPC和Polar码的编码过程(附代码)

Python实战&#xff1a;用可视化方法理解LDPC与Polar码的核心原理 在无线通信系统的物理层设计中&#xff0c;信道编码技术如同数据的"防弹衣"&#xff0c;保护信息在充满噪声的传输环境中安全抵达。本文将带你用Python构建两种5G核心编码方案——LDPC码和Polar码的简…...

苹果防线全线血崩,Mythos5天攻破最强硬件,全球20亿台设备危了

太震撼了&#xff0c;苹果花5年数十亿美元造出最强硬件安全防线MIE&#xff0c;三个黑客加一个AI&#xff0c;5天就把它打穿了&#xff01;20亿台苹果设备的安全逻辑正在被改写&#xff0c;人类安全系统正迎来「奥本海默时刻」 。 就在刚刚&#xff0c;苹果这座「永不陷落的堡…...

2025届必备的十大AI写作工具实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为科研从业者、学子以及技术研发人员&#xff0c;在人工智能领域&#xff0c;合规可靠的AI论…...

LunaTranslator终极指南:如何快速实现视觉小说实时翻译与语言学习

LunaTranslator终极指南&#xff1a;如何快速实现视觉小说实时翻译与语言学习 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator是一款开源的视觉小说翻译工…...

ZoneMinder开源监控系统:30分钟打造专业级安防解决方案,支持IP/USB/模拟摄像头全兼容

ZoneMinder开源监控系统&#xff1a;30分钟打造专业级安防解决方案&#xff0c;支持IP/USB/模拟摄像头全兼容 【免费下载链接】zoneminder ZoneMinder is a free, open source Closed-circuit television software application developed for Linux which supports IP, USB and…...

从PI到PR:静止坐标系下永磁同步电机电流控制的新范式

1. 永磁同步电机控制的痛点与变革 每次调试永磁同步电机&#xff08;PMSM&#xff09;时&#xff0c;最让人头疼的就是参数漂移问题。记得去年做伺服系统项目&#xff0c;电机运行半小时后电流波形就开始畸变——电感值因温升变化了15%&#xff0c;导致PI控制器输出的d轴电流出…...

如何轻松获取九大网盘直链下载地址:LinkSwift完整使用指南

如何轻松获取九大网盘直链下载地址&#xff1a;LinkSwift完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...

大模型小白入门指南:3分钟读懂核心逻辑+高性价比产品推荐(建议收藏+转发)

大模型小白入门指南&#xff1a;3分钟读懂核心逻辑高性价比产品推荐&#xff08;建议收藏转发&#xff09; 本文通俗易懂地拆解了大众对大模型的三个常见误区&#xff0c;如“大模型高级聊天机器人”、“大模型会说谎”、“AI会取代人类”。通过比喻方式解释了大语言模型和多模…...

数据工程师技能树:从核心原理到实战项目的体系化成长指南

1. 项目概述&#xff1a;一个面向数据工程师的“技能树”仓库最近在GitHub上看到一个挺有意思的仓库&#xff0c;叫AceDataCloud/Skills。光看名字&#xff0c;你可能会觉得这是一个普通的“技能列表”或者“学习路线图”。但点进去仔细研究后&#xff0c;我发现它的定位非常精…...