Java Try学习

news2025/4/22 6:05:12

一. 介绍

io.vavr.control.Try 是 Vavr 库的一个类,用于处理可能抛出异常的方法调用;它提供了一种优雅的方式来处理成功和失败的情况,而无需显示地使用 try-catch 块;

简而言之,它可以优雅的实现 try-catch;

下面,我们学习一下它的简单基本使用;

二. 简单使用

简单使用如下:

public static void test01() {
    // 通过 Try.of(CheckedFunction0 supplier) 来创建一个 Try 对象
    Try<Integer> result = Try.of(() -> 1 / 0);

    // 执行结果是否成功
    System.out.println(result.isSuccess());
    System.out.println(result.isFailure());

    // getOrElse(T other)
    Integer orElse = result.getOrElse(-1);
    System.out.println(orElse);

    // finally
    Try<Integer> result1 = Try.of(() -> 1 / 0)
        .andFinallyTry(() -> System.out.println("资源释放"));

    // getOrElseThrow() 抛出其他异常
    result.getOrElseThrow(() -> new ArithmeticException("除数为0"));
}

打印如下:

false
true
-1
资源释放
Exception in thread "main" java.lang.ArithmeticException: 除数为0
	at com.zengqiang.testTry.Test01.lambda$test01$1(Test01.java:26)
	at io.vavr.Value.getOrElseThrow(Value.java:395)
	at com.zengqiang.testTry.Test01.test01(Test01.java:26)
	at com.zengqiang.testTry.Test01.main(Test01.java:8)

三. 类结构

Try 是一个接口,具体实现类是 Success 和 Failure;

  • Try.of() 中如果执行成功,返回结果是 Success,Success 中会保存方法返回值;
  • Try.of() 中如果执行失败,即出现了异常,返回结果是 Failure,Failure 中会保存异常对象;

在这里插入图片描述

了解了 Try 的类结构,我们知道,Try 中定义了一些接口,Success、Failure 中定义了实际实现;

下面来看下几个方法的源码;

四. 源码

1. Try.of()

Try.of(CheckedFunction0<? extends T> supplier) 是一个静态方法,返回一个 Try 对象;

// --------------------------------- Try ------------------------------------
static <T> Try<T> of(CheckedFunction0<? extends T> supplier) {
    try {
        // 1. 执行成功的话创建并返回 Success 对象
        return new Success<>(supplier.apply());
    } catch (Throwable t) {
        // 2. 执行失败,抛出异常的话创建并返回 Failure 对象
        return new Failure<>(t);
    }
}

1.1 Success

Success 的代码非常简短,如下所示;

final class Success<T> implements Try<T>, Serializable {

    private static final long serialVersionUID = 1L;

    private final T value;

    /**
     * 构造创建 Success 对象
     * this.value = value
     *
     */
    private Success(T value) {
        this.value = value;
    }

    /**
     * get() 返回 value 值
     */
    @Override
    public T get() {
        return value;
    }

    @Override
    public Throwable getCause() {
        throw new UnsupportedOperationException("getCause on Success");
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public boolean isFailure() {
        return false;
    }

    @Override
    public boolean isSuccess() {
        return true;
    }

    @Override
    public String stringPrefix() {
        return "Success";
    }

    @Override
    public String toString() {
        return stringPrefix() + "(" + value + ")";
    }
}

1.2 Failure

Failure 的代码非常简短,如下所示;

final class Failure<T> implements Try<T>, Serializable {

    private static final long serialVersionUID = 1L;

    private final Throwable cause;

    /**
     * 构造 Failure 对象
     * this.cause = cause
     */
    private Failure(Throwable cause) {
        Objects.requireNonNull(cause, "cause is null");
        if (isFatal(cause)) {
            sneakyThrow(cause);
        }
        this.cause = cause;
    }

    /**
     * get() 抛出异常 cause
     */
    @Override
    public T get() {
        return sneakyThrow(cause);
    }

    @Override
    public Throwable getCause() {
        return cause;
    }

    @Override
    public boolean isEmpty() {
        return true;
    }

    @Override
    public boolean isFailure() {
        return true;
    }

    @Override
    public boolean isSuccess() {
        return false;
    }

    @Override
    public String stringPrefix() {
        return "Failure";
    }

    @Override
    public String toString() {
        return stringPrefix() + "(" + cause + ")";
    }

}

2. Try.getOrElse()

try.getOrElse() 的逻辑也比较简单易懂;

// --------------------------------- Try ------------------------------------
default T getOrElse(T other) {
    // 1. 如果是 Success
    // isEmpty() == false,get() 返回 value 值
    // 2. 如果是 Failure
    // isEmpty() == true, 返回 other 值
    return isEmpty() ? other : get();
}

3. Try.andFinallyTry()

try.andFinallyTry() 是类比于 try-catch-finally 中的 finally;

// --------------------------------- Try ------------------------------------
default Try<T> andFinallyTry(CheckedRunnable runnable) {
    try {
        // 1. 执行 runnable.run(),并返回 this
        runnable.run();
        return this;
    } catch (Throwable t) {
        // 2. 如果出现了异常,返回 Failure 对象
        return new Failure<>(t);
    }
}

4. Try.getOrElseThrow()

try.getOrElseThrow() 逻辑也比较清晰易懂;

default <X extends Throwable> T getOrElseThrow(Supplier<X> supplier) throws X {
    // 1. 如果是 Failure,isEmpty() == true,执行并抛出 supplire.get()
    // 2. 如果是 Success,isEmpty() == false,执行并返回 get()
    if (isEmpty()) {
        throw supplier.get();
    } else {
        return get();
    }
}

至此,Try 学习完毕,Try 的其他用法我们遇到的时候再举一反三;

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

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

相关文章

链表【4】

目录 链表删除指定值元素 反转链表&#xff08;静态链表型&#xff09; 链表删除指定值元素 错误1&#xff1a;两个if间没有用else&#xff0c;导致两个都执行了 #include<stdio.h> const int N1005; int n,first,firstid; using namespace std; struct node {int da…

【Vue3】作用域插槽

【Vue3】作用域插槽 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文…

UI界面自动化测试-Selenium

Selenium工作原理 SeleniumAPI 定位元素 Selenium操作对象 **send_keys 在对象上模拟按键输入 ** clear 清除对象输入的文本内容 ** click 点击对象(无限制) submit 提交(用于form表单) ** getText() 用于获取元素的文本信息 getAttribute() 用于获取属性的值 quit 关闭…

【奥顺苹果CMS二开泛目录4.X版】PHP站群程序新增首页堆砌关键词新增四套seo模板

演示站&#xff08;赠送四套模板&#xff09;&#xff1a; https://macfan.qdwantong.com https://macfan2.qdwantong.com https://macfan3.qdwantong.com https://macfan4.qdwantong.com 4.X版程序特色功能&#xff1a; 后台除了可以设置干扰码、转码、插入符号和拼音这…

[Bugku] web-CTF-矛盾

1.开启环境 2.根据内容得知&#xff0c;get一个num&#xff0c;若num不是数字&#xff0c;出一次num的值&#xff0c;后若num1出flag&#xff1b;若num为数字则不进行任何操作所以要输出flag&#xff0c;首先要num不是数字&#xff0c;然后又要num1这显然是矛盾的&#xff0c;对…

transform详解

参考&#xff1a;https://zhuanlan.zhihu.com/p/690055241 https://zhuanlan.zhihu.com/p/685724799 https://zhuanlan.zhihu.com/p/609523552 cnn是通过卷积核的方式实现权重偏置的计算&#xff0c;ywkb&#xff0c;激活&#xff0c;前馈神经网络&#xff0c;反向传播。 trans…

P31结构体初阶

结构体的声明 结构体的基础知识 结构是一些值的集合&#xff0c;这些值成为成员变量。结构的每个成员可以是不同类型的变量。 结构体的声明 结构成员的类型 结构的成员可以是标量、数组、指针&#xff0c;甚至是其他结构体 结构体变量的定义和初始化 结构体成员的访问 结构…

AI技能提升学习-免费24年最新甲骨文(OCI)开卷AI证书(有答案)+代码调用OCI生成式AI服务教程

之前好多小伙伴和我反馈错过了24年甲骨文的AI专家级证书免费考试&#xff0c;这次小李哥就给大家带来了24年最新的OCI另外一门AI基础级考试&#xff0c;主要目的是帮助大家提升AI/ML的基础知识和技能&#xff0c;给大家带来免费的学习福利&#xff0c;赶紧关注小李哥不要再错过…

大数据技术原理-spark编程与应用

摘要 本实验总结了在"大数据技术原理"课程中进行的Spark编程实验。实验环境基于Apache Spark&#xff0c;旨在通过实践加深对Spark数据处理能力的理解。实验的主要内容包括开启Spark shell、导入必要的包、读入数据集、数据预处理、聚类模型训练、确定数据模型的中心…

STM32内部Flash存贮数据的应用(STM32F446)

目录 概述 1 STM32内部Flash介绍 1.1 MCU简介 1.2 存储空间 1.3 主要特性 1.4 嵌入式闪存 2 库函数介绍 2.1 编程接口函数 2.2 锁和解锁函数 3 功能实现 3.1 写数据函数&#xff1a;FlashDrv_Write 3.2 读数据函数&#xff1a; FlashDrv_read 3.3 源代码 4 测试…

carla unreal engine源码:如何自定义开发传感器

文章目录 前言一、目标二、代码内容三、工程搭建1、更改点总览2、工程修改1&#xff09;代码文件拷贝至目标路径2&#xff09;SafeDistanceSensor.cpp 修改3&#xff09;SafeDistanceSerializer.h 修改4&#xff09;SafeDistanceEvent.h 修改5&#xff09;Sensor.h 修改6&#…

大数据技术原理-NoSQL数据库的应用

摘要 本实验报告聚焦于"大数据技术原理"课程中的NoSQL数据库实验。实验环境包括MySQL、Redis、MongoDB、Java以及Hadoop。实验内容涉及Redis和MongoDB的安装、配置和基本操作&#xff0c;包括数据的插入、删除和查询。此外&#xff0c;实验还包括使用Java API对Mong…

【统计全为 1 的正方形子矩阵】python刷题记录

R3-分治篇 class Solution:def countSquares(self, matrix: List[List[int]]) -> int:rowlen(matrix)collen(matrix[0])dp[[0]*(col1) for _ in range(row1)]ret0for i in range(row):for j in range(col):if matrix[i][j]1:dp[i1][j1]min(dp[i][j1],dp[i1][j],dp[i][j])1re…

umi-request全局响应拦截器

文章目录 介绍思路实现方法1.直接修改 umi-request方法2.自定义 request 实例&#xff0c;通过 umi-request 库进行配置 介绍 后端设计统一返回比如BaseResponse对象&#xff0c;前端也需要接收这个对象&#xff0c;从data取出想要的返回值。 前端请求比如之前返回的是numbe…

windows子系统wsl完成本地化设置locale,LC_ALL

在 Windows 的子系统 Linux&#xff08;WSL&#xff09;环境中&#xff0c;解决本地化设置问题可以采取以下步骤&#xff1a; 1. **检查本地化设置**&#xff1a; 打开你的 WSL 终端&#xff08;比如 Ubuntu、Debian 等&#xff09;&#xff0c;运行以下命令来查看当前的本…

大数据技术基础编程、实验和案例----大数据课程综合实验案例

一、实验目的 (1&#xff09;熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; (2&#xff09;了解大数据处理的基本流程&#xff1b; (3&#xff09;熟悉数据预处理方法&#xff1b; (4&#xff09;熟悉在不同类型数据库之…

湖南(用户洞察)源点咨询 论用户画像于精准营销之意义作用

湖南源点市场调研咨询认为&#xff0c;精准描摹用户画像是实现有效获客的重要方法。 因为只有通过用户画像&#xff0c;我们才能够持续不断了解用户现阶段的需求&#xff0c;痛点以及偏好。 用户画像不是简单的理解为对人群打标签&#xff0c;而是要通过大量的数据采集和分析…

螺旋文字滚动特效源码解析

如图所示&#xff0c;今天看到一个很炫酷的双文字螺旋滚动特效&#xff0c;两行文字呈螺旋状变化&#xff0c;在网站中这样的效果对用户很有吸引力。本文将基于原网站解析如何实现这个炫酷的效果&#xff0c;基于这个动图可以分析出需要实现的要点&#xff1a; 文字呈螺旋状滚…

管理流创建schema流程源码解析

一、简析 schema是pulsar重要的功能之一&#xff0c;现在就一起从源码的视角看下管理流创建schema时客户端和服务端的表现 客户端 客户端主要经历以下四个步骤 创建Schema实例 根据数据类型创建相对应的实例&#xff0c;例如Avro创建AvroSchema、JSON创建JSONSchema等 获取…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…