Java异常讲解

🐵本篇文章将对异常相关知识进行讲解


一、异常的结构

在程序执行的过程中出现的一些问题叫做异常,异常其实是一个一个类,每一种异常都代表一个类

1.1 几种常见的异常

System.out.println(10/0); //算数异常
//Exception in thread "main" java.lang.ArithmeticException: / by zeroint[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10int[] arr = null;
System.out.println(arr[10]); //空指针异常
//Exception in thread "main" java.lang.NullPointerException

1.2 异常的结构

图中的Exception就是我们说的异常,它继承自Throwable类,同时又派生出IOException和RunTimeException类,它们分别是编译时异常(受查异常)和运行时异常(非受查异常)

二、异常的处理

关于异常的处理有5个关键字:throw,throws,try,catch,finally;下面会逐个讲解

2.1 异常的抛出:throw

int[] arr = new int[]{1,2,3,4};
System.out.println(arr[10]); //数组越界异常

在下面的代码中会抛出一个数组越界异常,如下:

这时编译器自己抛出的,在一些特定的环境下,我们也可以自己主动抛异常,来让程序终止,这时就可以用到throw关键字,用法如下:

throw new ...Exception("数组越界异常");

将上面的代码改成下面的:

int pos = 6;
int[] arr = new int[]{1,2,3,4};
if (pos > arr.length) {throw new ArithmeticException("数组越界异常");
}
System.out.println("after");

运行结果如下:

可以看到最后一句打印after并没有执行

throw相关注意事项:

1.throw必须写到方法内部

2.throw只能抛出Exception的对象或Exception子类的对象

3.异常一经抛出,其后的代码将不再执行

2.2 异常的声明:throws

throws在方法的参数列表之后,用法如下:

public static void func() throws ArithmeticException {System.out.println(10/0);
}

其作用是告诉该方法的调用者此方法可能有这个异常,调用者必须处理该异常或继续将该异常告诉它的调用者,如果没有进行上述操作,则:1. 若抛出的编译时异常,则编译报错,2. 若抛出的是运行时异常,则该异常会交给JVM处理,程序会直接终止


public static void func1() throws Exception{}
public static void main(String[] args) throws Exception{func1();
}

上述代码中func1方法声明一个Exception,Exception类派生出IOException和RuntimeException两个类,main方法会将这里当成一个编译时异常处理,那么要想不编译报错,应该在main方法也声明Exception

throws相关注意事项:

1. throws关键字必须在方法的参数列表之后

2. 只能声明Exception或Exception的子类

3. 如果要声明多个异常,则让异常之间用逗号隔开即可,若多个异常具有父子关系,则只声明父类异常即可

2.3 异常的捕获:try-catch

try-catch通常用来处理异常用的,使用方法如下图:

下面举个实例:

    public static void main(String[] args) {int[] arr = {1, 2, 3};try {System.out.println(arr[100]);System.out.println("after"); //由于上面那行代码抛出了异常,所以这行代码不会执行} catch (ArrayIndexOutOfBoundsException e) { //异常被这个catch捕获System.out.println("这是个数组下标越界异常");e.printStackTrace(); //打印红字} catch (NullPointerException e) {System.out.println("这是个空指针异常");e.printStackTrace();}System.out.println("after try catch");}

打印结果:

2.4 finally

finally一般放在try-catch结构的最后,

finally中的代码一定会被执行,所以通常在其中进行一些资源清理的扫尾工作

    public static int getData() {Scanner scanner = new Scanner(System.in);try {int data = scanner.nextInt();return data; //data被返回后,finally中的代码仍然会执行} catch (InputMismatchException e) {e.printStackTrace();System.out.println("输入异常错误");} finally {System.out.println("执行finally中的代码");scanner.close();}System.out.println("try-catch-finally之后的代码"); //这里的代码不会被执行return 0;}

三、自定义异常

前面说过异常是一个类,自定义一个异常类必须继承Exception或RuntimeException,继承自Exception的异常默认为编译时异常,继承自RuntimeException的异常默认为运行时异常 

//自定义用户名错误异常
public class UserNameException extends RuntimeException{public UserNameException() {super();}public UserNameException(String s) {super(s);}
}//自定义密码错误异常
public class PassWordException extends RuntimeException {public PassWordException() {super();}public PassWordException(String s) {super(s);}
}class Test {private String admin = "admin";private String passWord = "123456";public void login(String admin, String passWord) {if (!this.admin.equals(admin)) {throw new UserNameException("用户名错误!");} else if (!this.passWord.equals(passWord)) {throw new PassWordException("密码错误!");}}public static void main(String[] args) {//int a = getData();Test test = new Test();test.login("admin1", "123456");}
}

下面是空指针异常的源码,我们上面自定义异常的内容是仿照此来写的

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

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

相关文章

LDAP协议和AD活动目录的讲解

目录 LDAP协议 LDAP基本概念 LDAP目录的数据结构 LDAP交互过程以及相关报文 AD(Active Directory) AD基本概念 AD域与工作组、本地组的区别 AD DS(AD域服务) 信任关系 组策略和安全组 LDAP协议 LDAP基本概念 LDAP&…

2024年程序员面对经济下行的解决方式竟然是……

近些年大环境不好,经济下行的压力给到了我们每一个普通人的身上:降薪是潮流,裁员是趋势,找不到工作是常态。 在这样的环境下,我们曾一天三份工,只为家人温饱; 我们也曾一周七天连轴转&#xf…

ProEasy机器人:快速上手使用机器人软件与编程(干货满满,好学不费脑)

一、安装机械手软件 如图所示,安装顺序为:先安装第一个,再安装第二个 二、快速认识学习掌握机械手软件重要功能 1.连接机械手 机械手默认出厂的ip为:“192.168.1.1”,在初次连接机械手前,必须把使用连接的…

k8s官方镜像代理加速

背景 大家可能在云原生领域需要部署周边的一些生态组件时,在国内遇到无法正常拉取镜像,显得就有点苦恼,不过没关系,常见的${{ registry_name }} 例如 “gcr.io”,“registry.k8s.io” Failed to pull image “registry…

AI Pika 生成进击的巨人动漫分镜案例

背景介绍 Pika 是一个使用 AI 生成和编辑视频的平台。它致力于通过 AI 技术使视频制作变得简单和无障碍。 Pika 1.0 是 Pika 的一个重大产品升级,包含了一个新的 AI 模型,可以在各种风格下生成和编辑视频,如 3D 动画,动漫,卡通和电影风格。…

springboot 整合 Spring Security+JWT 实现token 认证和校验

1.大概是这个样子 JWT 是什么? Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明…

【ArcGIS微课1000例】0078:创建点、线、面数据的最小几何边界

本实例为专栏系统文章:讲述在ArcMap10.6中创建点数据最小几何边界(范围),配套案例数据,持续同步更新! 文章目录 一、工具介绍二、实战演练三、注意事项一、工具介绍 创建包含若干面的要素类,用以表示封闭单个输入要素或成组的输入要素指定的最小边界几何。 工具位于:数…

Park Unpark

文章目录 当先调用park时:如果_counter0,这时候该线程阻塞,进入_cond阻塞,之后Unpark设置_counter为1后停止阻塞 当先调用Unpark时:此时先将_counter设置为1,当后面出现park时一判断_counter为1&#xff0c…

IO多路复用(新)

1.前景回顾 无论是阻塞IO还是非阻塞IO,用户应用在一阶段都需要调用recvfrom来获取数据,差别在于无数据时的处理方案: 如果调用recvfrom时,恰好内核没有数据,那么阻塞IO会使用户进程阻塞,非阻塞IO使CPU进行空…

CMMI5大成熟度等级和4大过程域

CMMI(Capability Maturity Model Integration,能力成熟度模型集成)模型系列是帮助组织改进其过程的最佳实践的集合。这些模型由来自产业界、政府以及软件工程研究所(Software Engineering Institute, SEI)的…

AI跨界学习,不再是梦!

大家好!今天给大家推荐的 GPTs 是【行业知识脉络】,帮助大家快速了解某个领域的脉络,并提供足够的学习资料和建议。 在AI时代,从小白到专家的1万小时定律即将失效,用少于1千小时掌握行业知识树和其核心概念是如何学习的…

Vis.js教程(二):基础关系图实现

首先引用所需要的css和js文件 <link href"https://cdn.bootcdn.net/ajax/libs/vis-network/9.1.6/dist/dist/vis-network.min.css" rel"stylesheet"> <script src"https://cdn.bootcdn.net/ajax/libs/vis-network/9.1.6/standalone/umd/vis-…

Java微服务框架 HP-SOA 1.0.5 — 完整支持 Spring Cloud 和 Dubbo

HP-SOA 功能完备&#xff0c;简单易用&#xff0c;高度可扩展的Java微服务框架。 项目主页 : https://www.oschina.net/p/hp-soa下载地址 : https://github.com/ldcsaa/hp-soa开发文档 : https://gitee.com/ldcsaa/hp-soa/blob/master/README.mdQQ Group: 44636872, 66390394…

IDEA解决Git冲突详解

目录 前言&#xff1a; 何为冲突 冲突演示 IDEA冲突解决 小结&#xff1a; 前言&#xff1a; 相信大家多多少少都有了解和使用过Git&#xff0c;作为Java程序员idea可谓是无敌的存在了&#xff0c;那么如何使用idea解决Git冲突呢&#xff1f;不瞒大家前段时间在公司把同事…

Spatial Data Analysis(四):空间自相关示例

Spatial Data Analysis&#xff08;四&#xff09;&#xff1a;空间自相关示例 空间自相关是地理信息科学&#xff08;GIS&#xff09;和空间统计学中的重要概念之一&#xff0c;用于研究地理空间上的数据变异性和相关性。空间自相关分析的目标是探讨地理空间中的现象是否呈现…

Dubbo(二)dubbo调用关系

节点角色说明Provider暴漏服务的额提供方&#xff08;洗浴中心&#xff09;Consumer调用远程服务的消费方&#xff08;客人&#xff09;Registry服务注册与发现的注册中心&#xff08;便民服务中心&#xff0c;所有的饭店娱乐场所都在本中心注册&#xff09;Monitor监控统计服务…

仓库管理应该用ERP系统还是WMS仓储管理系统

WMS仓储管理系统和ERP企业管理系统中的仓储管理模块在功能上具有相似性&#xff0c;但在实际应用中却存在着明显的区别。这些区别对于想要全面构建信息化体系的企业来说&#xff0c;尤其是仓库的系统化管理方面&#xff0c;具有重要的影响。 WMS是一种专注于仓库管理的系统&am…

德迅云安全的日常网站安全性措施、以及更多网站安全工具的推荐与使用。

要确保网站的安全性&#xff0c;可以采取以下措施&#xff1a; 更新和维护&#xff1a;定期更新网站的操作系统、应用程序和插件&#xff0c;确保使用的是最新版本&#xff0c;以修复已知的安全漏洞。 强密码策略&#xff1a;使用强密码&#xff0c;包含字母、数字和特殊字符的…

navicat premium 历史版本下载地址

navicat贴心地给大家准备了一致的下载地址&#xff1a; 只是没有把旧版本的链接放出来而已。 链接的格式 &#xff1a; 前缀版本类型语言位数 前缀&#xff1a;http:/download.navicat.com/download/navicat 版本&#xff1a;三位数&#xff0c;前两位是大版本&#xff0c;后…

使用Pytoch实现Opencv warpAffine方法

随着深度学习的不断发展&#xff0c;GPU/NPU的算力也越来越强&#xff0c;对于一些传统CV计算也希望能够直接在GPU/NPU上进行&#xff0c;例如Opencv的warpAffine方法。Opencv的warpAffine的功能主要是做仿射变换&#xff0c;如果不了解仿射变换的请自行了解。由于Pytorch的图像…