JAVA头部声明异常_如果你对java的异常处理头皮发麻,那就进来吧

2023-12-04 10:20

本文主要是介绍JAVA头部声明异常_如果你对java的异常处理头皮发麻,那就进来吧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.异常概念

简单说就是不正常运行,最终导致JVM的非正常停止。

异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

异常是不是语法问题,如果是语法错误编译的时候就会报错,根本不会运行。

2.异常架构

(1)基本框架:

136be34314a57ba454d97dfa8ef5d707.png

(2)Throwable:

所在位置:java.lang.Throwable

Throwable 是 Java 语言中所有错误与异常的超类。

Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。

(3)Error(错误)

所在位置java.lang.Error

定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。

特点:此类错误一般表示代码运行时 JVM 出现问题,此类错误发生时,JVM 将终止线程。

这些错误是不受检异常,非代码性错误

(4)Exception

所在位置:java.lang.Exception

程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。

136be34314a57ba454d97dfa8ef5d707.png

3.受检查异常和不受检查异常

(1)受检查异常:

编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。

一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,

其他的 Exception 异常都属于受检异常。编译器会检查此类异常,

也就是说当编译器检查到应用中的某处可能会此类异常时,

将会提示你处理本异常——要么使用try-catch捕获,

要么使用方法签名中用 throws 关键字抛出,否则编译不通过。

(2)不受检查异常:

编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。

该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。

4.异常处理的综合概括

(1)综合图解:

136be34314a57ba454d97dfa8ef5d707.png

(2)抛出异常:

如果你觉得解决不了某些异常问题,且不需要调用者处理,那么你可以抛出异常。

throw关键字作用是在方法内部抛出一个Throwable类型的异常。

任何Java代码都可以通过throw语句抛出异常。

(3)捕获异常:

程序通常在运行之前不报错,但是运行后可能会出现某些未知的错误,但是还不想直接抛出到上级,

那么就需要通过try…catch…的形式进行异常捕获,之后根据不同的异常情况来进行相应的处理。

(4)如何选择解决异常的方式:

136be34314a57ba454d97dfa8ef5d707.png

5. JVM 是如何处理异常的?

在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象包含异常名称,异常描述以及异常发生时应用程序的状态。

创建异常对象并转交给 JVM 的过程称为抛出异常。

可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。

JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。

当 JVM 发现可以处理异常的代码时,会把发生的异常传递给它。

如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。

6.抛出异常,声明异常和捕获异常

(1)抛出异常:throw

throw用在方法内,后面接一个异常对象,使用格式为throw new 异常类名(参数);将这个异常对象传递到调用者处,并结束当前方法的执行,结束调用此方法的方法的执行。

一般的我们用throw抛出一个指定的异常对象,可以有以下两个用途:

创建一个异常对象,然后封装一些提示信息;

将异常对象告知给调用者。

那么怎能理解呢:

136be34314a57ba454d97dfa8ef5d707.png

运行结果:

136be34314a57ba454d97dfa8ef5d707.png

JVM找不到处理异常代码,默认异常处理器打印出异常信息并终止应用程序。

(2)异常声明:throws

关键字throws运用于方法声明之上,throws格式为修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ },用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出的异常)。

将问题标识出来,报告给调用者如果方法内通过throw抛出了编译时异常。

而没有捕获处理(稍后讲解该方式),那么必须通过throws进行声明,让调用者去处理。

这里还有一点注意声明的异常不一定会被抛出,声明的是可能抛出异常的类型。

136be34314a57ba454d97dfa8ef5d707.png

运行结果:

136be34314a57ba454d97dfa8ef5d707.png

JVM找不到处理异常代码,默认异常处理器打印出异常信息并终止应用程序。

(3)捕获异常;try…….catch

我们声明一个异常,并不代表异常被解决了,而是把异常交给方法调用者去处理

如果抛出一个编译时异常后,不进行声明,那么就可以通过捕获异常并处理异常。

捕获异常的格式:

136be34314a57ba454d97dfa8ef5d707.png

他俩不能单独使用

例子:

136be34314a57ba454d97dfa8ef5d707.png

运行结果:

136be34314a57ba454d97dfa8ef5d707.png

这时候异常就被处理了不会再有异常提示。

有时我们会从 catch 中抛出一个异常,目的是为了改变异常的类型,

多用于在多系统集成时,当某个子系统故障,异常类型可能有多种,

可以用统一的异常类型向外暴露,不需暴露太多内部异常细节。

136be34314a57ba454d97dfa8ef5d707.png

当我们多个异常使用捕获我们的处理方式:

136be34314a57ba454d97dfa8ef5d707.png

第一种就不用费力去举例了多个try…catch么

第二种:

136be34314a57ba454d97dfa8ef5d707.png

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

第三种:

136be34314a57ba454d97dfa8ef5d707.png

7.Finally

(1)finally是干嘛用的:

当方法中发生异常,异常处之后的代码不会再执行,如果我们还用必要的代码要执行那么finally就解决

了这个问题 finally中的代码块时一定会执行的

(2)什么代码必须执行:

当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),

我们都得在使用完之后,最终关闭打开的资源。

(3)finally的用法:

try…..catch…..finally

136be34314a57ba454d97dfa8ef5d707.png

运行结果:

136be34314a57ba454d97dfa8ef5d707.png

只用在try和catch中调用退出jvm的相关的方法finally才不会执行否则都会执行.

还有一点那就是try和catch有return语句:

finally语句块将在方法返回之前被执行,另外finally语句中也可以有return语句,那么finally中的return语句就会替换try catch里边的return。

136be34314a57ba454d97dfa8ef5d707.png

运行结果:

136be34314a57ba454d97dfa8ef5d707.png

8.throw和throws的区别

1.throw用在方法体内, throws用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

2.throw是具体向外抛异常的,抛出的是一个异常实例 throws声明了是哪种类型的异常,使它的调用者可以捕获这个异常。

3.throw,如果执行了,那么一定是抛出了某种异常了,但是throws表示可能出现,但不一定。

4.同时出现的时候,throws出现在函数头、throw出现在函数体,两种不会由函数去处理,真正的处理由函数的上层调用处理。

9.异常注意点

1.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

2.如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。

3.finally不能单独使用,try可以和finally连用不带catch但是一定要声明异常。

4.不是只有编译时的检查异常才会被捕获,运行的异常可以被JVM捕获。

10.异常编译规范

编程习惯:

(1)在写程序时,对可能会出现异常的部分通常要用try{…}catch{…}去捕捉它并对它进行处理;

(2)用try{…}catch{…}捕捉了异常之后一定要对在catch{…}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

(3)如果是捕捉IO输入输出流中的异常,一定要在try{…}catch{…}后加finally{…}把输入输出流关闭;

(4)如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。

编辑整理 丨刘蕊

这篇关于JAVA头部声明异常_如果你对java的异常处理头皮发麻,那就进来吧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453107

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt