认识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 第一步:…...
wsl2子系统ubuntu发行版位置迁移步骤
默认的wsl2发行版是安装在windos的c盘,占用空间较大,有迁移需求,也可以迁移到其他电脑; 查看现有发行版信息 运行以下命令查看现有的 WSL 发行版及其状态: wsl --list --verbose# 输出示例NAME STATE …...
协程设计原理与实现
协程设计原理与汇编实现 同步与异步 对于任何一个事情,都可以划分为不同的步骤。所谓同步,就先做第一个事情,按照这件事的步骤完成这件事之后,再去做第二件事。再去做第三件事,以此类推。 异步就是,可以…...
合并区间C和C++的区别、布尔、整型、浮点、指针类型和0做比较、malloc、calloc、realloc的区别
56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {//先按照每个区间的左元素排序,这样每个区间的左边界就固定了,所以之后考虑相邻的//区间是否是相交的就行 类似与栈的…...
Flutter 图片编辑板(一) 事件路由
一个图片编辑板,有两部分组成。编辑板和内容项。每一个内容项是被InteractiveViewer修饰的widget,具有缩放偏移的功能。 在图片编辑板上, 会有多个内容相,图片或文字(添加文字目前还没做过)。 当要编辑其中…...
【Java】—— 图书管理系统
基于往期学习的类和对象、继承、多态、抽象类和接口来完成一个控制台版本的 “图书管理系统” 在控制台界面中实现用户与程序交互 任务目标: 1、系统中能够表示多本图书的信息 2、提供两种用户(普通用户,管理员) 3、普通用户…...
数据库基础入门:从零开始学习数据库的核心概念
数据库是现代软件开发的核心组成部分之一,无论是网站、手机应用还是企业管理系统,都离不开数据库的支持。本文将带你从零开始,逐步了解数据库的基本概念和常见操作。 什么是数据库? 数据库(Database)是一个…...
Y20030002 微信+Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现 源代码 配置文档 全套资料
问卷调查微信小程序 1.摘要2. 系统开的背景和意义3. 国内外研究现状4. 系统功能5.界面展示6.源码获取 1.摘要 摘 要:本文深入研究并实现了一个基于微信小程序的问卷调查系统。微信小程序问卷调查系统借助于微信小程序的便捷性和普及性,为用户提供了一个…...
ros项目dual_arm_pick-place(urdf文件可视化查看)
前言 一直想写一些项目的讲解,今天(2024.12.05)可以说正式开始了。 dual_arm_pick-place项目,是关于两个机械臂协同传递物品。 正文 这次的话,给大家讲一下里面的urdf文件。 这篇文章主要来看一下项目中的urdf文件…...
AI-安全-B站
1 需求 百度-林道正-《大模型合规探索》火山引擎-林泽韬-《大模型安全挑战与防护实践》Chamd5-bayuncao-《基于RAG的AI代码审计框架》德国电信咨询有限公司-杨麟-《AI在SOC中的应用发展》360-李亚青-《以模制模,大模型安全的解决之道》金晴云华-富吉祥-《安全大脑在…...
【C#设计模式(19)——备忘录模式(MementoPattern)】
前言 备忘录模式:将想要备份的信息交给备忘录对象来管理。通过设置初始、备份、修改、恢复等状态展示备忘录模式的使用。 代码 //备忘录类 public class Memento {private string state;public string State { get>state;}public Memento(string state){this.st…...
第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]
JavaScript 事件处理是 Web 开发中不可或缺的一部分,它允许开发者响应用户的交互行为(如点击、键盘输入等)或浏览器的行为(如页面加载完成)。通过事件处理,我们可以使网页更加动态和互动。以下是关于 JavaS…...
工具推荐-js爬取工具
现在测试方向都偏向于从js中的接口来入手找到可以进的点,关于快速扫描js文件来发现敏感接口的工具有很多,下面的jjjjs就是其一 项目地址: GitHub - ttstormxx/jjjjjjjjjjjjjs: 爬网站JS文件,自动fuzz api接口,指定api接口&#x…...
Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了…...
ejb组件(rmi) webservice平台(xml)
springboot bean 在 Spring Boot 中,Bean 是 Spring 框架的核心概念之一,表示由 Spring 容器管理的对象。通过 Bean 或其他注解(如 Component、Service、Repository 等)来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...
【jvm】垃圾回收的重点区域
目录 1. 说明2. 堆(Heap)3. 方法区(Method Area) 1. 说明 1.JVM(Java Virtual Machine)垃圾回收的重点区域主要集中在堆(Heap)和方法区(Method Area)。2.堆是…...
PyQt信号槽实现页面的登录与跳转 #页面进一步优化
将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…...
谈谈web3
全面解析 Web3:未来互联网的革命性进程 引言:互联网进化的三部曲 互联网的发展经历了三个重要阶段,每一个阶段都深刻地改变了我们的生活方式: Web1(1990-2005):静态互联网时代,人…...
正则表达式实战例子
正则表达式实战例子 1. 验证电子邮件地址 定义一个合理的电子邮件格式,并检查给定的字符串是否符合这个模式。 import redef is_valid_email(email):# 定义电子邮件格式的正则表达式pattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$return bool(re.match(…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
