认识 Java 中的异常 看这篇

2023-11-02

目录

1. 初始异常

2. 防御式编程

3. 异常的基本用法

3.1 基本语法

3.2 为什么要处理异常

3.3 关于异常的处理方式

3.4 异常处理流程

3.5 捕获异常的注意点

3.6 抛出异常

3.7 关于finally

4. Java 异常体系

4.1 Java 内置的异常类之间的继承关系图

4.2 受查异常和非受查异常的区别

5. 自定义异常类


1. 初始异常

异常指的是程序在运行时出现错误时通知调用者的一种机制。

“运行时”指的是程序已经编译通过得到 class 文件了,再由 JVM 执行过程中出现的错误。而有些错误是编译过程中就会出错,这是“编译期”出错。

2. 防御式编程

错误在代码中是客观存在的,要让程序出现问题的时候及时通知程序员,有两种方式。

  • LBYL: Look Before You Leap. 在操作之前就做充分的检查。
  • EAFP: It's Easier to Ask Forgiveness than Permission. "事后获取原谅比事前获取许可更容易". 也就是先操作, 遇到问题再处理。异常的核心就是 EAFP.

3. 异常的基本用法

3.1 基本语法

try{
    有可能出现异常的语句 ;
} catch (异常类型 异常对象) {
    ... 
} finally {
    异常的出口
}

其中:

try 代码块中放的是可能出现异常的代码。
catch 代码块中放的是出现异常后的处理行为。
finally 代码块中的代码用于处理善后工作, 会在最后执行。
其中 catch 和 finally 都可以根据情况选择加或者不加。

3.2 为什么要处理异常

程序中如果一旦出现异常,不处理异常,程序就终止了,异常之后的代码段就不会执行。

比如:

但如果进行异常处理,一旦 try 中出现异常,那么 try 代码块中的程序就不会继续执行,而是交给 catch 中的代码来执行。catch 中的代码执行完毕后会继续执行,程序不会停止。这样就有利于程序的执行效率。 

 关于 "调用栈"
方法之间是存在相互调用关系的, 这种调用关系我们可以用 "调用栈" 来描述。 在 JVM 中有一块内存空间称为 "虚拟机栈" 专门存储方法之间的调用关系。当代码中出现异常的时候, 我们就可以使用 e.printStackTrace(); 的方式查看出现异常代码的调用栈。

3.3 关于异常的处理方式

异常的种类有很多, 我们要根据不同的业务场景来决定。
1. 对于比较严重的问题(例如和算钱相关的场景), 应该让程序直接崩溃, 防止造成更严重的后果。
2. 对于不太严重的问题(大多数场景), 可以记录错误日志, 并通过监控报警程序及时通知程序员。
3. 对于可能会恢复的问题(和网络相关的场景), 可以尝试进行重试。
在我们当前的代码中采取的是经过简化的第二种方式。我们记录的错误日志是出现异常的方法调用信息, 能很快速的让我们找到出现异常的位置.。以后在实际工作中我们会采取更完备的方式来记录异常信息。

3.4 异常处理流程

1. 程序先执行 try 中的代码。
2. 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配。
3. 如果找到匹配的异常类型, 就会执行 catch 中的代码。
4. 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者。
5. 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)。
6. 如果上层调用者也没有处理的了异常, 就继续向上传递。一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止。

3.5 捕获异常的注意点

1. 一段代码可能会抛出多种不同的异常,不同的异常有不同的处理方式,因此可以搭配有多个 catch 代码块;

2. 也可以用一个 catch 捕获所有异常(这种方式不推荐);

Exception 类是所有异常类的父类,因此可以用这个类型表示捕捉所有异常,如上面代码出现的NullPointerException 异常都是 Exception 的子类。 

3. 无论是否存在异常,finally 中的代码一定会执行的,保证最终一定会执行到 Scanner 的 close 方法。  

4.  如果本方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递。

 如果 func 方法中没有合适的处理异常方式,就会沿着调用栈向上传递到 main 方法中,如果 main 方法中也没有合适的处理异常方式,就会一直向上传递,如果向上一直传递都没有合适的方法处理异常, 最终就会交给 JVM 处理, 程序就会异常终止(和我们最开始未使用 try catch 时是一样的)。

3.6 抛出异常

throw 和 throws 的区别

throw:用在方法内部,手动抛出异常,必须要人工产生一个异常对象。

throws:用在方法声明,表示当前方法可能会出现的异常并且不处理继续向调用者抛出。

3.7 关于finally

finally 执行的时机是在方法返回之前( try 或者 catch 中如果有 return 会在这个 return 之前执行 finally)。但是如果 finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 会覆盖掉 try 或 catch 中的 return。一般不建议在 finally 中写 return。

4. Java 异常体系

4.1 Java 内置的异常类之间的继承关系图

  • 顶层类 Throwable 派生出两个重要的子类, Error 和 Exception
  • 其中 Error 指的是 Java 运行时内部错误和资源耗尽错误。比如栈溢出 StackOverFlowError 、内存溢出 OutofMemoryError 等错误。应用程序不抛出此类异常。这种内部错误一旦出现,除了告知用户并使程序终止之外, 再无能无力。
  • Exception 是我们程序猿所使用的异常类的父类。其中 Exception 有一个子类称为 RuntimeException , 这里面又派生出很多我们常见的异常类 NullPointerException , IndexOutOfBoundsException 等。这种称为非受查异常。

Java 语言将 Error 类、RuntimeException 类及其子类的所有异常称为非受查异常,其他的类 IOException 类及其子类、ClassNotFoundException 类、CloneNotSupportedException 类都是受查异常

4.2 受查异常和非受查异常的区别

受查异常:程序必须显示 try ... catch 异常处理 或者 throws 向上抛出。

非受查异常:属于非受查异常可以不用显示处理该异常。

5. 自定义异常类

当开发中遇到某些与业务相关的出错情况时,需要自定义异常。

比如用户登录功能,此时处理用户名和密码错误的时候就可能抛出两种异常,基于已有的异常类 Exception 进行继承,创建出和业务相关的异常类。

class UserError extends Exception {
    public UserError(String message) {
        super(message);
    }
}

class PasswordError extends Exception {
    public PasswordError(String message) {
        super(message);
    }
}

此时相关业务代码就是:

/**
 * 自定义异常
 */
class UserError extends Exception {
    public UserError(String message) {
        super(message);
    }
}

class PasswordError extends Exception {
    public PasswordError(String message) {
        super(message);
    }
}

public class Demo6 {
    private static String userName = "admin";
    private static String password = "123456";
    public static void main(String[] args) {
        try {
            login("admin", "12456");
        } catch (UserError userError) {
            userError.printStackTrace();
        } catch (PasswordError passwordError) {
            passwordError.printStackTrace();
        }
    }

    public static void login(String userName, String password) throws UserError,
            PasswordError {
        if (!Demo6.userName.equals(userName)) {
            throw new UserError("用户名错误");
        }
        if (!Demo6.password.equals(password)) {
            throw new PasswordError("密码错误");
        }
        System.out.println("登陆成功");
    }
}

 如果密码或者用户名错误就会抛出错误:

 

自定义异常通常会继承自 Exception 或者 RuntimeException,继承自 Exception 的异常默认是受查异常,继承自 RuntimeException 的异常默认是非受查异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

认识 Java 中的异常 看这篇 的相关文章

  • 有多少人被Java子串内存问题困扰过? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我最近发现 java lang St
  • Java 中字符串的最大长度 - 调用 length() 方法

    In Java 最大尺寸 a 是多少String对象可能有 指的是length 方法调用 我知道length 返回 a 的大小String as a char 考虑到String http docs oracle com javase 7
  • Java 的 RSA 算法库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想为我的应用程序提供基于 RSA 算法的简单许可机制 有免费的 RSA 库吗 只需使用javax crypto and java sec
  • 如何在gradle中执行jar文件?

    当我使用 ant 构建我的 android 项目时 我需要这样的任务
  • 合并两个 Jasper 报告

    我有一个带有下拉菜单的网络应用程序 用户可以从中选择报告可视化的类型 报告 1 报告 2 报告 3 等 根据所选的报告 Jasper 报告将在服务器上编译并以 PDF 格式的弹出窗口打开 在服务器端 我使用下面的代码以单独的方法实现每个报告
  • String.split() 的 ArrayIndexOutOfBoundsException

    这是从文件中读取输入的代码 该文件包含表单中的学生详细信息roll name age street city zipcode 其中很少有值可以null even 对于以下代码 我得到java lang ArrayIndexOutOfBoun
  • 颜色资源 ID 返回错误值

    我试图在 onCreate 期间以编程方式从颜色资源设置文本颜色 但得到了一些奇怪的结果 我在 res colors xml 中定义了一个颜色资源
  • 使用 Netbeans 导出 JAR

    如何使用Netbeans将java项目导出到JAR 我找不到像 Eclipse 那样的选项 您需要启用该选项 Project Properties gt Build gt Packaging gt Build JAR after compi
  • android listviews:页眉和页脚视图

    在我的 ListActivity 中 我需要页眉和页脚视图 位于列表的顶部和底部 分别用作列表上的上一页和下一页按钮 因为我只想一次仅显示 20 个项目 我通过执行以下操作来设置头视图和脚视图 getListView addHeaderVi
  • 异步方法的默认 EJB 事务模式?

    当我有一个 AsynchronousEJB 中的方法 并且我没有指定 TransactionAttribute 那么容器到底是如何处理事务边界的呢 显然 它不能使用调用线程的事务 那么它是做什么的呢 同样的问题 但涉及由 TimerServ
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • Axis2 不返回自己的对象

    我编写了一些网络服务 其中一些返回一个简单的字符串 这个可以工作 另一些返回一个对象列表 不 axis2 1 5 1 无法处理集合类型 所以我将返回类型更改为Object 但我仍然收到这个异常 ERROR java lang Runtime
  • Hibernate添加带有子实体id的实体

    我的对象 状态 java Entity Table name STATE public class State Id GeneratedValue strategy GenerationType AUTO private Long id C
  • Gradle:找不到受信任的证书

    我正在尝试使用 Gradle 在 Ubuntu 服务器上构建我的 Android 项目 在我的 Windows 10 PC 上使用 Android Studio 构建工作正常 但使用 gradlew build or gradlew cle
  • 使用三十、LocalDate 获取每月的第一天和最后一天

    我有一个 LocalDate 需要获取该月的第一天和最后一天 我怎么做 eg 13 2 2014我需要得到1 2 2014 and 28 2 2014 in 本地日期 https docs oracle com javase 8 docs
  • 在Java中解析包含multipart/form-data请求体的字符串

    问题陈述 我认为标题说明了一切 我正在寻找解析 a 的方法String包含 multipart form data HTTP 请求的正文部分 IE 字符串的内容看起来像这样 xyzseparator blah Content Disposi
  • jdbcAuthentication() 而不是 inMemoryAuthentication() 不提供访问权限 - Spring Security 和 Spring Data JPA

    我只是使用 spring mvc gradle spring security spring data jpa 创建简单的应用程序 现在我想测试 spring security 是如何工作的 但是我有一个问题 首先我向您展示一些代码 然后我
  • JavaFX - 当文本字段具有焦点时加速器不工作

    在我的应用程序中 我有一个使用加速器的屏幕 我正在使用功能键 F3 在我的应用程序中执行操作 它每次都工作正常 但是当我单击此屏幕上的任何文本字段时 功能键不会执行 这是我设置加速器的代码 scene getAccelerators put
  • SnakeYaml“无法找到属性错误”

    这是我的 config yml 的一部分 Authenctication AuthenticationConfig AuthencticationType LDAP LDAPConfig LDAPUrl ldap localhost 389
  • 整个程序可以是不可变的吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我熟悉不可变性并且可以设计不可变类 但我主要拥有学术知识 缺乏实践经验 请参考上面的链接图片 尚不允许嵌入 从下往上看 学生需要新地址

随机推荐

  • JPA学习笔记 - 关联关系

    OneToMany 指定 1对多 的映射关系 可通过fetch的属性设置加载方式 JoinColmn 指定外键的列名 外键存在于 多 的一方表中 单向 n 1 先保存n的一端时 会多出update语句 因为插入n端时并未知道外键的值 插入1
  • java8 新特性stream流学习

    简介 java 8 API添加了一个新的抽象称为流Stream 可以让你以一种声明的方式处理数据 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象 Stream API可以
  • 离散数学-二元关系

    目录 序偶与有序n元组 集合的笛卡尔积 关系的基本概念 关系的表示方法 特殊关系 关系的性质 自反性 反自反性 对称性 反对称性 传递性 关系的复合运算 1 基本概念 2 计算方法 2 1 有向图法 2 2 枚举法 2 3 谓词公式法 3
  • 微信小程序实现文字随机颜色

    1 实现效果 2 实现思路 从颜色列表中随机取一个颜色 赋值给数组的每一项 Math floor Math random colorArr length 3 实现代码
  • python爬虫需要哪些基础知识-【PYTHON】【爬虫】关于python爬虫的一些基础知识

    基础知识 HTTP协议 我们浏览网页的浏览器和手机应用客户端与服务器通信几乎都是基于HTTP协议 而爬虫可以看作是一个另类的客户端 它把自己伪装成浏览器或者手机应用客户端 按照自己的逻辑贪婪的向服务器索取数据 如何向服务器索取数据 所以了解
  • android开启安装权限管理,Android6.0权限——安装时默认开启app全部权限

    1 默认开启app全部权限 Android6 0之后推出动态申请权限 所有敏感权限默认都是没有开启的状态 这两天偶然间看到其他app安装后所有权限 包括敏感权限 默认都是开启的状态 6 0之后敏感权限都需要申请的 怎么可能跨过用户的 好奇心
  • 5种常用格式的数据输出,手把手教你用Pandas实现

    导读 任何原始格式的数据载入DataFrame后 都可以使用类似DataFrame to csv 的方法输出到相应格式的文件或者目标系统里 本文将介绍一些常用的数据输出目标格式 01 CSV DataFrame to csv方法可以将Dat
  • webcomponents安装了没有用_Web Components基本概念及实例教程

    谷歌公司由于掌握了 Chrome 浏览器 一直在推动浏览器的原生组件 即 Web Components API 相比第三方框架 原生组件简单直接 符合直觉 不用加载任何外部模块 代码量小 目前 它还在不断发展 但已经可用于生产环境 基本概念
  • 如何使用 Javadoc 工具生成文档

    Javadoc 是一个由 Java 语言编写的工具 用于从 Java 代码中提取注释并生成 HTML 格式的文档 以下是使用 Javadoc 工具生成文档的一般步骤 编写代码并添加注释 在你的 Java 代码中添加注释是生成文档的关键 Ja
  • pycharm连接ssh debug卡住 解决方案

    修改dataloder中的worker 修改pycharm setting
  • 2021经典优秀计算机单片机毕业设计题目

    可追溯农产品电商管理系统的设计与实现 农产品用户商城系统设计与实现 基于OpenGL的全局光照算法的设计与实现 分布式存储系统分析与设计 基于机器学习的数据库融合技术研究 基于知识图谱的对话系统设计与实现 具有日志的虚拟WEB攻防系统设计与
  • 蓝桥杯省赛模拟题 信号覆盖

    题目大意 小蓝负责一块区域的信号塔安装 整块区域是一个长方形区域 建立坐标轴后 西南角坐标为 0 0 0 0 0 0 东南角坐标为
  • 计算机恢复语言文件格式,txt文件乱码怎么恢复正常

    txt是最常见的一种文件格式 几乎所有的文本编辑器都可以打开和编辑TXT文件 不过有网友在打开该文件时却遇到了乱码的情况 这是怎么回事呢 我们该如何操作才能使之恢复正常呢 用户可能不是很了解 所以今天本文为大家分享的就是电脑打开txt文档乱
  • ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(二)

    ChatGPT Stable Diffusion 百度AI MoviePy 实现文字生成视频 小说转视频 自媒体神器 二 前言 最近大模型频出 但是对于我们普通人来说 如何使用这些AI工具来辅助我们的工作呢 或者参与进入我们的生活 就着现在
  • Effective STL

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img qcpwxQhi 1585901574462 C Users w00448203 AppData Roaming Typora typora user images
  • WPF DataGrid添加自定义操作列

    WPF页面有个DataGrid列表 需要为在最后加一列操作列从而实现对每一行记录的自定义操作 页面xaml内容 样式组件引用的是metro mahapps
  • 一次不规范HTTP请求引发的nginx响应400问题分析与解决

    背景 最近分析数据偶然发现nginx log中有一批用户所有的HTTP POST log上报请求均返回400 没有任何200成功记录 由于只占整体请求的不到0 5 所以之前也一直没有触发监控报警 而且很奇怪的是只对于log上报的POST接口
  • 动态时间规整算法(dynamic time warping)

    动态时间规整 DT W 动态 时间 规整 DTW dynamic time warping 曾经是语音识 别的一种主流方法 其 思想是 由于 语音信号是一种具有相当大随机性的信 号 即使相同说话者对相同的词 每一次发音的结果 都是不同的 也
  • 游戏开发unity插件MessagePack:基本介绍(附带messagepack、protobuf、json的压缩的大小和性能对比)

    参考 https www cnblogs com Leo wl p 8143259 html https github com neuecc MessagePack CSharp 官方github https github com neue
  • 认识 Java 中的异常 看这篇

    目录 1 初始异常 2 防御式编程 3 异常的基本用法 3 1 基本语法 3 2 为什么要处理异常 3 3 关于异常的处理方式 3 4 异常处理流程 3 5 捕获异常的注意点 3 6 抛出异常 3 7 关于finally 4 Java 异常