关于Java异常机制及finally关键字的详解

异常机制(Exception)

软件程序在运行过程中,非常可能遇到异常问题。常见的异常:
1、用户输入错误
2、设备错误
3、硬件问题,例如打印机关掉、服务器问题
4、物理限制:磁盘满了

Java是采用面向对象的方式来处理异常的

处理过程

抛出异常:在执行一个方法是,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。

捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

JDK中定义了很多异常类,这些类对应了各种各样可能出现的异常时间,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。Error 错误类,不需要程序员管,是一个错误,关键在于Exception,需要我们程序员管。
在这里插入图片描述

Error

Error类层次描述了Java运行时系统内部错误和资源耗尽错误。这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。Error表明系统JVM已经处于不可恢复的崩溃状态中。

Exception

所有异常类的父类,其子类对应了各种各样可能出现的异常事件。
一类特殊的异常,如被0除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)
NullpointException(空指针异常,遇到的最多的异常)
Checked Exception这一类异常,我们必须捕获进行处理

异常的处理方法1(亲自动手捕获):

Try:try语句指定了一段代码,该段代码就是一次捕获并处理的范围。在执行过程中,当任意一条语句产生异常时,就会跳过该段中后面的代码。代码中可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理
一个try语句必须带有至少一个catch语句块或一个finally语句块。注意当异常处理的代码执行结束以后,是不会回到try语句去执行尚未执行的代码。

Catch:每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。Catch捕获异常时的捕获顺序:如果异常类之间由继承关系,在顺序安排上需注意。越是顶层的类,越放在下面。再不然就直接把多余的catch省略掉。

finally关键字

有些语句,不管是否发生了异常,都必须要执行,那么就可以把这样的语句放到finally语句块中。通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。
使用格式:

try{可能出现异常的代码}catch(异常 对象名){处理异常的代码-> 将来开发会将异常信息保存到日志文件中}finally{不管是否有异常,都会执行的代码}

try-catch-finally-return执行顺序

在这里插入图片描述

  1. try中带有return
    当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。但如果finally通过地址改变了变量,还是会影响方法返回值的。

  2. catch中带有return
    catch中return与try中一样,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。

  3. finally中带有return
    当finally中有return的时候,try中的return会失效,在执行完finally的return之后,就不会再执行try中的return。这种写法,编译是可以编译通过的,但是编译器会给予警告,所以不推荐在finally中写return,这会破坏程序的完整性,而且一旦finally里出现异常,会导致catch中的异常被覆盖。

总结:

  1. finally中的代码总会被执行。
  2. 当try、catch中有return时,也会执行finally。return的时候,要注意返回值的类型,是否受到finally中代码的影响。
  3. finally中有return时,会直接在finally中退出,导致try、catch中的return失效。

异常的处理方法2(声明异常:throws子句)

当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去。如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。
方法重写中声明异常原则:子类声明的异常范围不能超过父类声明的范围。即1、父类没有声明异常,子类也不能;2、不可抛出原有方法抛出异常类的父类或上层类

自定义异常

在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类,从Exception类或者它的子类派生一个子类即可。习惯上,定义的类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。

  1. 定义一个类
  2. 如果继承Exception 就是编译时期异常
  3. 如果继承RuntimeException,就是运行时期异常

使用异常机制建议

  1. 要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低下。
  2. 处理异常不可以代替简单测试(只在异常情况下使用异常机制)
  3. 不要进行小粒度的异常处理——应该将整个任务包装在一个Try语句块中
  4. 异常往往在高层处理

打印异常信息的三个方法

这些方法均继承于Throwable类:

  1. String toString() :输出异常类型和设置的异常信息
  2. String getMessage(): 输出设置的异常信息 ,只显示产生异常的原因,但不显示类名。
  3. void printStackTrace():打印异常信息是最全的:包括异常类型,信息,以及出现的行数等,常用来跟踪异常事件发生时堆栈的内容。
public class Exception {public static void main(String[] args) {//1.定义一个用户名,代表已经注册的用户String username = "root";//2.创建Scanner对象,录入用户名Scanner sc = new Scanner(System.in);System.out.println("请您输入要登录的用户名:");String name = sc.next();//3.判断用户名是否和已经存在的用户名一致if (name.equals(username)) {System.out.println("登录成功了");} else {try {throw new LoginUserException("登录失败了,用户名或者密码有问题");}catch (Exception e){System.out.println(e.toString()); //输出异常类型和设置的异常信息System.out.println(e.getMessage()); //输出设置的异常信息 ,只显示产生异常的原因,但不显示类名。e.printStackTrace(); //打印异常类型,信息,以及出现的行数}}}
}

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

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

相关文章

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展,水果在线销售已逐渐演变为一种极为便捷的购物方式,日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台,致力于为用户提供优质、…

Xcode简介

Xcode 是苹果公司为 macOS 平台开发的一款集成开发环境(Integrated Development Environment,IDE),主要用于开发 iOS、iPadOS、macOS、watchOS 和 tvOS 的应用程序。Xcode 包含了一系列的软件开发工具,涵盖了从编写代码…

【植物大战僵尸杂交版】获取+存档插件

文章目录 一、还记得《植物大战僵尸》吗?二、在哪下载,怎么安装?三、杂交版如何进行存档功能概述 一、还记得《植物大战僵尸》吗? 最近,一款曾经在15年前风靡一时的经典游戏《植物大战僵尸》似乎迎来了它的"文艺复…

渐开线花键测量学习笔记分享

大家好,继续渐开线花键的相关内容,本期是渐开线花键测量相关的学习笔记分享: 花键检测项目有花键大径和小径检验;内花键齿槽宽和外花键齿厚,以及渐开线终止圆 和起始圆直径检测;齿距累计误差 、齿形误差 、…

排序算法简述(第八jiang)

目录 排序 选择排序 O(n2) 不稳定:48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化: 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

Mysql-常用函数及其用法总结

1、字符串函数 测试用例如下: 1.1 CONCAT() 将多个字符串连接成一个字符串。 SELECT CONCAT(first_name, , last_name) AS full_name FROM users; -- 期望结果:John Doe, Jane Smith, Michael Johnson 1.2 SUBSTRING() 提取子字符串 SELECT SUBSTR…

STM32-PWR和WDG看门狗

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. PWR1.1 PWR简介1.2 电源框图1.3 上电复位和掉电复位1.4 可编程电压监测器1.5 低功耗模式1.6 模式选择1.7 睡眠模式1.8 停止模式1.9 待机模式1.10 库函数 2. WDG看门狗2.1 WDG简介2.2 IWDG框图2.3 IWDG键寄存器2.4 …

13 学习总结:指针 · 其一

目录 一、内存和地址 (一)内存 (二)内存单元 (三)地址 (四)拓展:CPU与内存的联系 二、指针变量和地址 (一)创建变量的本质 (二…

Ansible常用模块

华子目录 Ansible四个命令模块1.组成2.特点3.区别3.1command、shell模块3.2raw模块 4.command模块4.1参数表4.2free_form参数 5.shell模块5.1作用5.2例如 6.script模块6.1示例 7.raw模块7.1参数7.2示例 文件操作模块1.file模块1.1参数1.2示例 2.copy模块2.1参数 Ansible四个命令…

用4个方法检查家里的灯是否伤孩子的眼睛

为什么小孩子带眼镜的越来越多?      现在的孩子都在楼上玩手机看电视,当然它就伤眼睛了      除了这些电子产品伤眼睛,还有一处隐形的因素被忽略了      你主要看4个标准      1,你看看灯的照度,有些…

ASRock Creator系列GPU:为AI推理及多GPU系统打造,采用16针电源接口的Radeon RX 7900系列显卡

ASRock 正在筹备推出专为人工智能推理和多GPU系统设计的AMD GPU——Creator系列显卡。这一系列显卡采用双槽位、吹风式设计,并配备16针电源连接器,首发产品包括基于Navi 31架构的AMD Radeon RX 7900XTX和RX 7900 XT型号。这些原属于WS系列的显卡最初在20…

2024年华为OD机试真题-小朋友来自多少小区-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。我们将这些数量汇总到数组garden中。 请根据这些小朋友给出的信息,计算班级小朋…

机器学习与现代医疗设备的结合:革新医疗健康的未来

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 随着技术的不断进步,机器学习(Machine Learning, ML)在现代医疗设备中的应用正在改变着…

python基础语法 006 内置函数

1 内置函数 材料参考:内置函数 — Python 3.12.4 文档 Python 解释器内置了很多函数和类型,任何时候都能直接使用 内置函数有无返回值,是python自己定义,不能以偏概全说都有返回值 以下为较为常用的内置函数,欢迎补充…

【华为OD题目0008-双十一】

华为OD题目0008-双十一 华为OD题目0008-双十一 华为OD题目0008-双十一 题目描述 双十一众多商品进行打折销售,小明想购买一些自己心仪的商品, 但由于受购买资金限制,所以他决定从众多心意商品中购买3件, 而且想尽可能的花完资金&…

什么是CTO?如何成为一名优秀的CTO?

一、什么是CTO? 首席技术官(CTO)是一位负责领导和管理企业技术战略的高级职务。CTO的主要职责包括规划技术战略、监督研发活动、领导技术团队等。 二、CTO的主要职责 首席技术官,即CTO,是企业中负责技术和研发的高级管…

Redies基础篇(一)

Redis 是一个高性能的key-value数据库。Redies支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的&#xff…

【ETABS】【RHINO】案例:Swallow to ETABS

文章目录 01. Swallow Overview总览1 LOAD:Defination of LoadCase、Response Combo2 SectionArea Section and Area Load(面截面定义与指定,面荷载指定)Frame Section with rebarattr and linear load(带钢筋属性框架…

下载,连接mysql数据库驱动(最详细)

前言 本篇博客,我讲讲如何连接数据库?我使用mysql数据库举例。 目录 下载对应的数据库jar 包 百度网盘 存有8.4.0版本压缩包:链接:https://pan.baidu.com/s/13uZtXRmuewHRbXaaCU0Xsw?pwduipy 提取码:uipy 复制这…

STM32-TIM定时器

本内容基于江协科技STM32视频内容,整理而得。 文章目录 1. TIM1.1 TIM定时器1.2 定时器类型1.3 基本定时器1.4 通用定时器1.4 高级定时器1.5 定时中断基本结构1.6 预分频器时序1.7 计数器时序1.8 计数器无预装时序1.9 计数器有预装时序1.10 RCC时钟树 2. TIM库函数…