Optional-------NPE

AUTOSAR EcuM模块介绍 AUTOSAR EcuM概述 AUTOSAR EcuM全称是Autosar ECU State Manager,位于Autosar BSW中System Service模块中,是一个独立于硬件的模块。 其主要作用是管理ECU上下电启动的状态,具体为: 初始化启动操作系统所需要的BSW(Basic Software)模块 为睡眠阶段和随后的唤醒完成微控制器的配置准备 管理ECU上的所有唤醒事件(EcuM通过唤醒验证协议验证已发生的唤醒,区分真实的唤醒事件,防止误唤醒) EcuM支持的特性列表 EcuM具有 阅读详情

Optional

对象容器

一定程度上避免了NPE(操作不当仍然会引起NPE)

用于可选值而非空引用的类级别的解决方案

不用Optional之前:只要操作对象,为了防止NPE,必须添加判空语句

构造函数:

  • 构造方法私有,无法通过外部调用

    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    private Optional() {
        this.value = null;
    }
    private Optional(T value) {
            this.value = Objects.requireNonNull(value);
    }
    
  • 通过静态方法构造Optional对象

    //直接构建一个空的Optional对象
    public static<T> Optional<T> empty() {
            @SuppressWarnings("unchecked")
            Optional<T> t = (Optional<T>) EMPTY;
            return t;
    }
    //直接构建一个非空的Optional对象(value为空报NPE)
    public static <T> Optional<T> of(T value) {
            return new Optional<>(value);
    }
    //直接构建一个Optional对象 --可空,可不空
    public static <T> Optional<T> ofNullable(T value) {
            return value == null ? empty() : of(value);
    }
    

相关方法:

get方法:
  • value值为空抛异常

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
    
isPresent
  • 判空(值是否存在)

  • 等同于判断一个对象是否非空

    public boolean isPresent() {
        return value != null;
    }
    
  • 为空返回false,否则返回true

  • Java 11 后还可以通过方法 isEmpty() 判断与 isPresent() 相反的结果。(是否为空)

ifPresent
  • 如果值不为空,执行相关运算(对value)

  • 函数式编程:消费者类型,传参无返回值

    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
    
  • Java 9 后还可以通过方法 ifPresentOrElse(action, emptyAction) 执行两种结果,非空时执行 action,空时执行 emptyAction。

orElse:
  • 可以设置默认值

  • value不为空,返回value,否则返回默认值(默认值可以为空,不报NPE)

    public T orElse(T other) {
        return value != null ? value : other;
    }
    
orElseGet、orElseThrow:
  • 传递一个生产者接口,无参,有返回值

  • orElseGet:value不为空,返回value,否则返回生产者提供的value,但是生产者为空,会报NPE,如果生产者提供的value为空,不报NPE

  • orElseThrow:如果 Optional 存在该值,返回包含的值,否则抛出由 Supplier 继承的异常,生产者为空,会报NPE

    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
            if (value != null) {
                return value;
            } else {
                throw exceptionSupplier.get();
            }
    }
    
  • 总结:

    1. 如果value为空,orElse、orElseGet、orElseThrow都会去默认值方法
    2. 如果value不为空,orElseGet、orElseThrow不会去调用默认值(生产者接口),但是orElse方法,仍会去执行默认值方法
filter方法:过滤
  • 过滤接口,保留条件为true的值,经常结合stream流对集合进行操作

  • 传参为一个断言接口,并且不能为空,否则NPE

    public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }
    
map方法:转换值
  • 传参为一个接口,并且不能为空,否则NPE(接口返回值可以为空)

    public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
            Objects.requireNonNull(mapper);
            if (!isPresent())
                return empty();
            else {
                return Optional.ofNullable(mapper.apply(value));
            }
    }
    
flatMap:转换值
  • 如果值存在,返回基于 Optional 包含的映射方法的值,否则返回一个空的 Optional。

  • 传参为一个接口,不能为空并且返回值不能为空,否则NPE(接口返回值不可以为空)

    public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }
    public static <T> T requireNonNull(T obj) {
            if (obj == null) throw new NullPointerException();
            return obj;
    }
    
pt100和max31865测室温跳变比较大,会从23.04跳到23.47,23.75反复跳变超过了0.5的误差范围,在VDD和GND之间加上0.1和10的滤波电容也不行,如何解决? 🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。 阅读详情

相关推荐

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5737

合理利用Optional 来避免NPE

在Java中什么异常最容易出现,那肯定是NullPointerException,空指针就像一个定时炸弹,总给我们带来些麻烦,在开发过程中都会碰到需要判断Null值以防止空指针的情况,以往的方式要么是抛异常,要么是if{}else{},直到Optional的出现,你可以更优雅的解决NPE问题。

Stronger的博客 1372

详细解读文字识别工具———Tesseract-OCR

   在尝试破解12306验证码的时候,提前了解了一下应对各种验证码的解决方案,这里主要是学习到了面对文字图片验证码,例如亚马逊、豆瓣等平台的登录时会遇到的情况,效果还不错。 一、工具介绍 ​    Tesseract-OCR 是一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition...

别看我只是一只羊 2万+

JAVA8之妙用Optional解决NPE问题

引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在user为null时,是有可能报NullPointerException异常的。为了解决这个问题,于是采用下面的写法 if(user!=null){ Address address = user.getAddress(.

频道新闻 405

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1947

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

java 利用Optional解决NPE问题

NPE(NullPointerException) 问题,日常开发中很常会遇到,尤其在 OOP,像下图这种 如果我们要获取 User 的 department 信息中的 anthority 信息,我们可以这么写 User user = new User(); // ... Anthority anthority = user.getDepartment().getAnthority(); 一旦 department 为空,就会出现 java.lang.NullPointerException 的异常,此

Samzhu 1406

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

Java8新特性 使用Optional避免NPE

前言 相信每一个Java程序员都碰到过NPE异常,每个避免NPE,往往会在代码中写很多if判断,形成代码污染。为了解决这个问题,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。 Optional类介绍 Optional类存...

克己的博客 1807

【部署】OpenClaw版本降级实操(含全量卸载)

本文详细介绍了OpenClaw工具的降级与卸载方法。主要内容包括:1)通过npm安装指定版本的核心命令及国内镜像加速方案;2)两种卸载路径:CLI工具存在时的简易一键卸载(含交互式与非交互式命令)和手动分步卸载流程;3)CLI已删除但服务仍在运行时,针对macOS(launchd)、Linux(systemd)和Windows(计划任务)系统的具体清理步骤。文章特别强调了卸载前备份的重要性,并提供了不同安装方式(常规安装与源码克隆)的额外说明,确保用户能彻底清理所有组件。

海兰 3176

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 971

java中不太常见的东西(3) - Optional

上一篇博文我们主要介绍了关于Lambda表达式相关的知识,所以在今天的博文中我想把一个同样还不普及的类介绍给大家,Optional这个类是在Jdk1.8的时候引入的,它的主要功能是判断一个值是否为空,伴随着对数据相应的处理。笔者目前整理的一些blog针对面试都是超高频出现的。

brickworkers的博客 3346

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 321

JDK8-Optional类避免NPE

1.需求分析 调用RPC返回结果、包装类转简单类型,拆箱过程最容易出现NPE问题。JDK8之前需要小心翼翼对各种类型进行判空,可通过JKD8-Optional类来预发未知的NPE错误。 2.关于避免NPE的常识 【强制】所有POJO类属性必须使用包装数据类型 【强制】所有RPC方法的返回和参数必须使用包装数据类型 【推荐】所有局部变量使用基本简单数据类型 Ps: POJO类属性没有初值是提醒...

侠客小虎的博客 6829

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

告别 NPE,拥抱优雅代码:Java Optional 的真·高阶用法

不只是避免 NPE 的工具,更是一种编写优雅代码的哲学。它的设计初衷在于提升代码的语义化和可读性,但滥用会适得其反。是一个对象包装器,在性能敏感的场景(如高频调用)可能引入额外开销,需谨慎评估。编写优雅代码,就像用最简单的语言讲述一个复杂的故事——清晰明了,却回味无穷。作为类的字段会增加不必要的复杂性,并且可能导致序列化问题。是一个容器类,表示可能包含值或不包含值。不仅仅是一个值,它更像是一个埋伏在代码中的“幽灵”。:异常和空值语义不同,混用会降低代码的可读性。的优势在于明确表达“这里可能为空”的意图。

龚小帅的博客 2593

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

善用Optional,告别NPE

为了应对NPE问题,Java 8引入了Optional类,它是一个容器对象,可以包含或不包含非null的值。通过Optional,开发者可以显式地表示一个值是可选的,从而强制进行null检查,减少NPE的发生。通过合理使用Java 8的Optional类,我们开发者可以有效减少NullPointerException的发生,提高代码的健壮性和可维护性。然而,Optional并非万能,需结合具体场景合理使用。

京东科技开发者 635

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java - NPE(NullPointerException);Optional

空指针异常。

MinggeQingchun的博客 880

巧用 Java 8 的 Optional 优雅的规避 NPE

先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。

qq_66627105的博客 1298

java中npe问题是什么_JAVA8如何妙用Optional解决NPE问题详解

引言NPE(NullPointerException)是调试程序最常见的异常。google一下有很多关于方法到底应该返回null还是new一个空对象的讨论。在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示在这种情况下,有如下代码user.getAddress().getProvince();...

weixin_42376589的博客 1323

Java 8 Optional:优雅地避免 NPE

优雅地避免 NPE

coolcooldeteng的博客 538

解决NPE:Java8的Optional 类

一、简述 Optional 的完整路径是 java.util.Optional,使用它是为了避免代码中的if (null != obj) { }这样范式的代码,可以采用链式编程的风格。而且通过 Optional 中提供的 filter 方法可以判断对象是否符合条件,在符合条件的情况下才会返回,map 方法可以在返回对象前修改对象中的属性。 本质上,Optional 是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并

ChineseSoftware的博客 489

java8利用optional解决NPE

optional 问题: String isocode = user.getAddress().getCountry().getIsocode().toUpperCase(); 可能有NPE出现,必须加上判断 if (user != null) { Address address = user.getAddress(); if (address != null) { ...

Xjzzon的博客 342

用了 Optional,结果生产环境直接 NPE?这锅你得背!

永远不要直接调用Optional.get()- 这是NPE的定时炸弹💣使用orElse/orElseGet/orElseThrow等方法处理空值情况优先使用函数式风格(map, flatMap, filter)处理OptionalOptional不是银弹,要合理使用,不要滥用在与JPA等框架集成时要特别注意Optional的使用Optional的正确使用可以显著提高代码的可读性和健壮性,但错误使用反而会带来更多问题!希望这篇文章能帮助你避免在生产环境中踩坑。🚀。

龚小帅的博客 830

JAVA8如何妙用Optional解决NPE问题详解

JAVA8如何妙用Optional解决NPE问题详解 在Java中,null代表一个不存在的对象,如果对它进行操作就会抛出java.lang.NullPointerException异常,下面这篇文章主要给大家介绍了关于JAVA8如何妙用Optional解决NPE问题的相关资料,需要的朋友可以参考下 引言 NPE(NullPointerException)是调试程序最常见的异常。go...

songxiugongwang的博客 562

optional用法_【分享吧】使用Optional优雅地解决NPE问题

使用Optional优雅地解决NPE问题01JDK8中的Optional类 空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。...

weixin_39583029的博客 227

JavaSE——Optional类的正确用法,终于搞定NPE问题!

最近真的被NPE问题烦死了,于是准备学习Optional大杀器解决这个问题! 当我们有两个POJO并且有这样的关联时 public class User{ private Address address; } class Address{ private String province; } 我们可能有这样的代码 if(user != null){ Address address = us...

Stay Hungry Stay Foolish 502
上一篇: UUID介绍
下一篇: volatile
ADCQprogrammer
博客等级 码龄7年 4粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值