关于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(); //打印异常类型,信息,以及出现的行数
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哈希表——C语言

哈希表(Hash Table)是一种高效的数据结构,能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数,哈希函数是一个将输入数据(通常称为“键”或“key”)转换为固定长度的整数的函数…

使用vue3-treeselect问题

1.当vue3-treeselect是单选时,使用watch监听绑定value,无法监听到值清空 对照后将:value改为v-model,如图 2.使用vue3-treeselect全部清空按钮如何置空select的值,使用watch监听 多选:pageInfo.officeName(val) {// …

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致(Inconsistent)状态 2.2.日志式文件系统(Journaling filesystem) 3.Linux文件系统的运行 4、文件的删…

Java--方法重写

1.方法的重写首先需要有继承关系,且为子类重写父类的方法 2.方法名必须相同 3.参数列表必须相同 4.修饰符的范围可以扩大但不能缩小,public>protected>default>private,即父类的属性可以从private改为public,但不能反过来 5.抛出…

python爬虫入门(四)之Beautiful Soup库

一、什么是Beautiful Soup库 1、Beautiful Soup库是用来做HTML解析的库 Beautiful Soup把看起来复杂的HTML内容,解析成树状结构,让搜索和修改HTML结构变得更容易 2、第三方库,先安装 终端输入pip install bs4 from bs4 import Beautiful…

Cyber Weekly #14:WAIC 2024

赛博新闻 1、WAIC2024开幕:一半机器人,一半大模型 7月4日,AI界春晚——2024世界人工智能大会(WAIC 2024)在上海开幕,大会展示了500家企业的1500项展品,突出了机器人和大模型技术。国产机器人和…

【排序算法】—— 快速排序

快速排序的原理是交换排序,其中qsort函数用的排序原理就是快速排序,它是一种效率较高的不稳定函数,时间复杂度为O(N*longN),接下来就来学习一下快速排序。 一、快速排序思路 1.整体思路 以升序排序为例: (1)、首先随…

学生管理系统(通过顺序表,获取连续堆区空间实现)

将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 : 1】顺序表的创建, 2】判满、 3】判空、 4】往顺序表里增加学生信息、 5】遍历学生信息 6】任意位置插入学生信息 7】任意位置删除学生信…

【大模型LLM面试合集】大语言模型基础_llm概念

1.llm概念 1.目前 主流的开源模型体系 有哪些? 目前主流的开源LLM(语言模型)模型体系包括以下几个: GPT(Generative Pre-trained Transformer)系列:由OpenAI发布的一系列基于Transformer架构…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 基于Dify的QA数据集构建(附代码)Qwen-2-7B和GLM-4-9B&#x…

Android OpenGL ES 离屏幕渲染1——EGL环境的创建,以及基础概念的理解

创建EGL上下文、配置EGL环境、创建EGL DISPLAY 什么是EGL: 由于OpenGL ES并不负责窗口管理以及上下文管理,该职责由各个平台自行完成;在Android平台下OpenGL ES的上下文环境是依赖EGL的API进行搭建的。 对于EGL这个框架,谷歌已经提…

WAWA鱼曲折的大学四年回忆录

声明:本文内容纯属个人主观臆断,如与事实不符,请参考事实 前言: 早想写一下大学四年的总结了,但总是感觉无从下手,不知道从哪里开始写,通过这篇文章主要想做一个记录,并从现在的认…

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇,面试中关于 MySQL 都需要了解哪些基础?一文带你详细了解,欢迎收藏! WhyMysql? NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

【Gin】项目搭建 一

环境准备 首先确保自己电脑安装了Golang 开始项目 1、初始化项目 mkdir gin-hello; # 创建文件夹 cd gin-hello; # 需要到刚创建的文件夹里操作 go mod init goserver; # 初始化项目,项目名称:goserver go get -u github.com/gin-gonic/gin; # 下载…

C++入门7——string类详解

目录 1.什么是string类? 2.string类对象的常见构造 2.1 string(); 2.2 string (const char* s); 2.3 string (const string& str); 2.4 string (const string& str, size_t pos, size_t len npos); 2.5 string (const char* s, size_t n); 2.7 验证…

模块一SpringBoot(一)

maven记得配置本地路径和镜像 IJ搭建 SpringIntiallizer--》将https://start.spring.io改成https://start.aliyun.com/ 项目结构 Spring有默认配置, application.properties会覆盖默认信息: 如覆盖端口号server.port8888

一个最简单的comsol斜坡稳定性分析例子——详细步骤

一个最简单的comsol斜坡稳定性分析例子——详细步骤 标准模型例子—详细步骤 线弹性模型下的地应力平衡预应力与预应变、土壤塑性和安全系数求解的辅助扫描

【深入理解JVM】关于Object o = new Object()

1. 解释一下对象的创建过程 “半初始化”状态通常指的是对象在内存分配后、但在完全初始化之前的一种状态。在Java中,虽然JVM的规范和设计努力避免对象处于这种不稳定的状态,但在多线程环境下,由于指令重排序等并发问题,仍有可能…

通义千问 2,大模型应用开发时的新选择

我在进行 AI 相关的开发中,最常用的模型是通义千问。本地开发的时候,使用 Ollama 来运行 qwen 模型。集成测试和线上环境,使用阿里云模型服务灵积上的通义千问模型。使用阿里云的好处是:模型服务的获取方便,稳定性好&a…

无人机5公里WiFi低延迟图传模组,抗干扰、长距离、低延迟,飞睿智能无线通信新标杆

在科技日新月异的今天,我们见证了无数通信技术的飞跃。从开始的电报、电话,到如今的4G、5G网络,再到WiFi的广泛应用,每一次技术的革新都极大地改变了人们的生活方式。飞睿智能5公里WiFi低延迟图传模组,它以其独特的优势…