java中的异常,以及出现异常后的处理【try,catch,finally】

一、异常概念

异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

异常机制其实是帮助我们找到程序中的问题,异常的根类是 java.lang.Throwable

 其下有两个子类:

  • java.lang.Error::严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
  • java.lang.Exception :表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要 处理的。好比感冒、阑尾炎。

平常所说的异常指 java.lang.Exception 

Error 和 Exception 区别是什么?

  • Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这 类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;

  • Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。

二、异常分类

我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。 异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?

  • 编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式 化异常)
  • 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报 错)。(如数学异常)

(1)必须处理的异常:

  1. IOException:这是一个通用的输入输出异常,表示在文件或网络操作中发生问题,如文件未找到、文件无法读取、连接中断等。

  2. FileNotFoundException:指示尝试打开一个不存在的文件时引发的异常。

  3. SQLException:用于处理数据库操作中的异常,如连接失败、SQL语法错误等。

  4. ParseException:通常与日期和时间处理相关,表示解析日期或时间字符串时出现问题。

  5. ClassNotFoundException:表示在尝试加载类时找不到该类的异常。

(2)运行时异常【RuntimeException】:

在Java中,RuntimeException及其子类是非受检异常,通常由编程错误、逻辑问题或其他不可预测的情况引发。以下是一些常见的RuntimeException及其子类:

  1. NullPointerException:当尝试访问一个空对象(null)的成员(方法、字段等)时引发的异常。

  2. ArrayIndexOutOfBoundsException:当尝试访问数组元素时超出数组边界时引发的异常。

  3. ArithmeticException:表示在算术操作中发生异常,如除以零。

  4. IllegalArgumentException:用于指示传递给方法的参数不符合预期值的异常。通常由程序员传递无效参数引发。

  5. IllegalStateException:表示对象的状态不适合执行特定操作时引发的异常。通常用于指示对象的状态转换错误。

  6. ConcurrentModificationException:在使用迭代器遍历集合时,如果在迭代期间修改了集合的结构,会引发此异常。

  7. NumberFormatException:通常在字符串转换为数字时出现格式错误时引发,例如使用Integer.parseInt("abc")

  8. ClassCastException:尝试将对象强制类型转换为不兼容的类型时引发的异常。

  9. StackOverflowError:表示应用程序的调用栈溢出,通常是由于递归调用导致的。

  10. OutOfMemoryError:表示应用程序在尝试分配更多内存时已用尽所有可用内存。

  11. UnsupportedOperationException:通常由不支持的操作引发,例如对不可修改的集合调用修改方法。

  12. AssertionError:通常在assert语句的断言条件失败时引发,用于调试和测试。

  13. NoSuchElementException:通常与集合迭代器和枚举相关,表示没有更多元素可供迭代时引发。

这些是Java中一些常见的RuntimeException及其子类。它们通常指示程序出现了问题,需要通过改进代码来避免或处理这些异常,以提高程序的健壮性和稳定性。虽然RuntimeException及其子类不需要显式地捕获或声明,但程序员应该采取措施来避免它们的发生,以减少潜在的错误和问题。

 

 三、异常的处理

 

(1)throw 和 throws 声明处理异常

概述:使用throws关键字将问题标识出来, 表示当前方法不处理异常,而是提醒给调用者, 让调用者来处理....最终会到虚拟机,虚拟机直接结束程序,打印异常信息。

声明处理异常格式

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ // 可以抛出一个,也可以多个}

*使用场景: 声明处理异常一般处理运行的时候不会出现异常的编译异常*

throw 和 throws 的区别是什么?

Java 中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和拋出异常,可以通过 throws 关键字在方法上声明该方法要拋出的异常,或者在方法内部通过 throw 拋出异常对象。 throws 关键字和 throw 关键字在使用上的几点区别如下:

  • throw 关键字用在方法内部,只能用于抛出一种异常,用来抛出方法或代码块中的异常,受查异常 和非受查异常都可以被抛出。

  • throws 关键字用在方法声明上,可以抛出多个异常,用来标识该方法可能抛出的异常列表。

  • 一个方法用 throws 标识了可能抛出的异常列表,调用该方法的方法中必须包含可处理异常的代码,否则也要在方法签名中用 throws 关键字声明相应的异常。

  • throw关键字的作用: 在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。throw用在方法内,用来抛出 一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。

  • throws关键字的作用: 声明处理异常:使用throws关键字将问题标识出来, 表示当前方法不处理异常,而是提醒给调用者, 让调 用者来处理....最终会到虚拟机,虚拟机直接结束程序,打印异常信息。

(2)try-catch-finally 捕获处理异常

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有 些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

finally代码块的语法格式:

try{// 可能会出现异常的代码}catch(异常的类型 变量名){// 处理异常的代码或者打印异常的信息}finally{// 无论异常是否发生,都会执行这里的代码(正常情况,都会执行finally中的代码,一般用来释放资源)}

执行步骤:

1.首先执行try中的代码,如果try中的代码出现了异常,那么就直接执行catch()里面的代码,执行完后会执 行finally中的代码,然后程序继续往下执行

2.如果try中的代码没有出现异常,那么就不会执行catch()里面的代码,但是还是会执行finally中的代码,然后程序继续往下执行

注意:

1. try和catch都不能单独使用,必须连用。

2. try中的代码出现了异常,那么出现异常位置后面的代码就不会再执行了

3. 捕获处理异常,如果程序出现了异常,程序会继续往下执行 声明处理异常,如果程序出现了异常,程序就不会继续往下执行

 

(3)获取异常信息

Throwable类中定义了一些查看方法:

  1. public String getMessage() :获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
  2. public String toString() :获取异常的类型和异常描述信息(不用)。
  3. public void printStackTrace() :打印异常的跟踪栈信息并输出到控制台。

包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。 在开发中呢也可以在catch将编译期异常转换成运行期异常处理。

public class Test {public static void main(String[] args) {/*Throwable获取异常信息的方法:- public String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。- public String toString():获取异常的类型和异常描述信息(不用)。- public void printStackTrace():打印异常的跟踪栈信息并输出到控制台。*/System.out.println("开始");try {System.out.println(1/0);// 报异常,产生一个异常对象}catch (ArithmeticException e){/*System.out.println("出现了异常");System.out.println(e.getMessage());System.out.println(e);System.out.println(e.toString());*/e.printStackTrace();}System.out.println("结束");}
}

 

娱乐一下:

四、异常的注意事项

  • 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
  • 如果父类的方法抛出了多个异常,子类覆盖(重写)父类方法时,只能抛出相同的异常或者是他的子集。
  • 父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获 处理,不能声明抛出
  • 声明处理多个异常,可以直接声明这多个异常的父类异常 在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。

多个异常使用捕获又该如何处理呢?

  1. 多个异常分别处理。
  2. 多个异常一次捕获,多次处理。
  3. 多个异常一次捕获一次处理。

当多异常分别处理时,捕获处理,前边的类不能是后边类的父类 一般我们是使用一次捕获多次处理方式,格式如下:

try{编写可能会出现异常的代码}catch(异常类型A e){ 当try中出现A类型异常,就用该catch来捕获.处理异常的代码//记录日志/打印异常信息/继续抛出异常}catch(异常类型B e){ 当try中出现B类型异常,就用该catch来捕获.处理异常的代码//记录日志/打印异常信息/继续抛出异常}

注意:【当多异常分别处理时,捕获处理,前边的类不能是后边类的父类】

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

五、自定义异常【企业中常用的定义】

为什么需要自定义异常类?

我们说了Java中不同的异常类,分别表示着某一种具体的异常情况,那么在开发中总是有些异常情况是 SUN没有定义好的,例如年龄负数问题,考试成绩负数问题.这些异常在JDK中没有定义过,此时我们根据自己业务的异常情况来定义异常类。

什么是自定义异常类:

在开发中根据自己业务的异常情况来定义异常类. 自定义一个业务逻辑异常: BusinessException

。一个注册异常类。

异常类如何定义?

  • 1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。
  • 2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException 。

自定义一个运行时期的异常类:自定义类 并继承于java.lang.RuntimeException。

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

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

相关文章

XSS攻击(3), 实战XSS注入思路

XSS注入, XSS实战思路 一, 可以输入文本或直接在url后面提交参数. 网页源码: <input namekeyword value"">对于这种input标签, 首先可以考虑使用 onclick 等事件来执行js. 先输入 <> , " , onclick() 等等提交, 查看页面源代码. 如果输入的符号没…

Nginx 配置文件解读

一.配置文件解读 nginx配置文件主要分为四个部分&#xff1a; main{ #&#xff08;全局设置&#xff09;http{ #服务器配置upstream{} #&#xff08;负载均衡服务器设置&#xff09;server{ #&#xff08;主机设置&#xff1a;主要用于指定主机和端口&#xff09;location{} …

CUDA学习笔记(十四) Constant Memory

转载至https://www.cnblogs.com/1024incn/tag/CUDA/ CONSTANT MEMORY constant Memory对于device来说只读但是对于host是可读可写。constant Memory和global Memory一样都位于DRAM&#xff0c;并且有一个独立的on-chip cache&#xff0c;比直接从constant Memory读取要快得多…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

数据结构-- 并查集

0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…

【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决

编译时出现的错误&#xff1a; mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2 Makefile:161: recipe for target ‘all’ failed mingw32-make: *** [all] Error 2解决方法&#xff1a; 根据贴吧老哥的解答&#xff0c;发现是mingw版本有问题导…

【JAVA学习笔记】43 - 枚举类

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter11/src/com/yinhai/enum_ 〇、创建时自动填入版权 作者等信息 如何在每个文件创建的时候打入自己的信息以及版权呢 菜单栏-File-setting-Editor-File and Code Templaters -Includes-输入信…

自动化测试07Selenium01

目录 什么是自动化测试 Selenium介绍 Selenium是什么 Selenium特点 工作原理 SeleniumJava环境搭建 Selenium常用的API使用 定位元素findElement CSS选择语法 id选择器&#xff1a;#id 类选择 .class 标签选择器 标签名 后代选择器 父级选择器 自己选择器 xpath …

2.1 向量与线性方程组

一、行图像与列图像 线性代数的中心问题是求解线性方程组。线性的意思是这些方程的未知数是一次的&#xff0c;即每个未知数只会乘数字&#xff0c;而不会出现 x x x 与 y y y 相乘的项。下面是一个由两个未知数组成的方程组&#xff1a; 两个方程 两个未知数 { x − 2 y 1…

关于QTableWidget的it所占内存的释放问题

说起QTableWidget&#xff0c;我们一般都是用QTableWidget进行数据显示或者使用QTableWidget其他控件组合进行设置。 这里主要说说数据展示&#xff0c;我们在进行数据展示时&#xff0c;数据量分为两种有限和无限。不管是QTableWidget中插入的数据有限还是数据无限。在数据多时…

【从0到1设计一个网关】什么是网关?以及为什么需要自研网关?

文章目录 什么是网关&#xff1f;网关类型网关的优缺点目前的网关解决方案有哪些&#xff1f;为什么要自研Gateway网关&#xff1f;自研网关需要注意什么&#xff1f; 注&#xff1a; 这篇文章作为我的网关的第一篇文章&#xff0c;并不涉及任何代码&#xff0c;只是提及了网关…

LeetCode 155. 掷骰子等于目标和的方法数:动态规划

【LetMeFly】1155.掷骰子等于目标和的方法数&#xff1a;动态规划 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-dice-rolls-with-target-sum/ 这里有 n 个一样的骰子&#xff0c;每个骰子上都有 k 个面&#xff0c;分别标号为 1 到 k 。 给定三个整数 …

如何在国际腾讯云服务器上设置IP节点的密码?

跟着云计算技术的发展&#xff0c;越来越多的企业和个人开始运用云服务器来存储和处理数据。腾讯云服务器是一款非常受欢迎的云服务器产品&#xff0c;它提供了高效稳定的计算能力。在运用腾讯云服务器的过程中&#xff0c;咱们可能需求设置IP节点的暗码&#xff0c;以便维护咱…

杂谈:DC对Verilog和SystemVerilog语言的支持

DC对Verilog和SystemVerilog语言的支持 设计语言用哪种&#xff1f;Design Compiler对二者的支持简单的fsm电路测试测试结果对比写在最后 设计语言用哪种&#xff1f; 直接抛出结论&#xff1a;先有电路&#xff0c;后为描述。设计端而言&#xff0c;没有语言的高低好坏&#…

Gin vs Beego: Golang的Web框架之争

前言 Golang作为一门高效且简洁的语言&#xff0c;已经在Web开发领域得到了广泛的应用。Gin和Beego是Golang中两个著名的Web框架&#xff0c;它们都提供了一系列强大的功能&#xff0c;帮助开发者构建高性能的Web应用。本文将对Gin和Beego进行全面的对比&#xff0c;帮助开发者…

SQL SERVER连接oracle数据库几种方法

--1 方式 --查询oracle数据库中的表 SELECT * FROM OPENDATASOURCE( MSDAORA, Data SourceGE160;User IDDAIMIN;PasswordDAIMIN )..DAIMIN.JOBS 举一反三&#xff1a;在查询分析器中输入&#xff1a; SELECT * FROM OPENDATASOURCE( MSDAORA, Data SourceORCL;User…

vite.config.js文件配置代理设置VITE_APP_BASE_API

.env.development文件 ENV development # base api VITE_APP_BASE_API /dev-api.env.production文件 ENV production # base api VITE_APP_BASE_API /apidefine: {process.env: {VITE_APP_BASE_API: https://xxx.com}},server: {hmr: true, // vue3 vite配置热更新不用手动…

妙手ERP功能更新丨Shopee全球产品支持使用定价模板修改价格、Ozon新增SKU模板 、Temu采集箱支持添加货源链接......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在近两周优化了以下多项功能。 01、平台授权模块 TikTok - 支持授权美国跨境店及ACCU店铺&#xff0c;TikTok平台各功能均可使用 02、产品模块优化 全平台 - 支持产品重量单位切换 Sho…

Java架构师内功数据库

目录 1 导学2 数据库基本概念2.1 数据库系统2.2 三级模式-两级映像2.3 数据库设计2.4 数据模型2.4.1 E-R模型2.4.2 关系模型2.5 关系代数3 规范化和并发控制3.1 函数依赖3.2 键与约束3.3 范式3.3.1 第一范式1NF3.3.2 第二范式3.3.3 第三范式3.4 模式分解3.5 并发控制3.6 封锁协…

centos搭建elastic集群

1、环境可以在同一台集群上搭建elastic&#xff0c;也可以在三台机器上搭建&#xff0c;这次演示的是在同一台机器搭建机器。 2、下载elastic &#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 2、​​​​​​ tar -zxvf elasticsearch-xxx-版…