对象空指针_可选和对象:空指针救星!

对象空指针

没有人喜欢空指针异常 我们有办法摆脱它们吗?
也许 。



这篇文章中讨论了几种技术:

  • 可选类型(Java 8中的新增功能)
  • 对象类(旧的Java 7东西!)

Java 8中的可选类型

它是什么?

  • Java 8中引入的一种新类型(类)
  • 打算充当特定类型的对象或没有对象(空)的方案的“ 包装器

简而言之,它是处理空值的更好替代品警告 :起初可能不是很明显!)

基本用法

它是一种类型(一个类)–那么,如何创建它的实例?

只需在Optional类中使用三个静态方法。

public static Optional<String> stringOptional(String input) {return Optional.of(input);
}

简单明了–创建一个包含值的Optional包装器。 当心–如果值本身为null,将抛出NPE!

public static Optional<String> stringNullableOptional(String input) {if (!new Random().nextBoolean()) {input = null;}return Optional.ofNullable(input);
}

我个人认为好一点。 这里没有NPE的风险–如果输入为空,则将返回空的 Optional。

public static Optional<String> emptyOptional() {return Optional.empty();
}

如果您要有目的地返回“空”值。 'empty'并不意味着null

好了–使用/使用Optional怎么样?

public static void consumingOptional() {Optional<String> wrapped = Optional.of("aString");if (wrapped.isPresent()) {System.out.println("Got string - " + wrapped.get());}else {System.out.println("Gotcha !");}
}

一种简单的方法是检查Optional包装器是否具有实际值(使用isPresent方法)–这将使您想知道它是否比使用if(myObj!= null)好 。 不用担心,我也会解释这一点。

public static void consumingNullableOptional() {String input = null;if (new Random().nextBoolean()) {input = "iCanBeNull";}Optional<String> wrapped = Optional.ofNullable(input);System.out.println(wrapped.orElse("default"));
}

如果包装的值为null,则可以使用orElse来返回默认值,这很明显。 我们避免了在提取实际值之前调用ifPresent的明显冗长。

public static void consumingEmptyOptional() {String input = null;if (new Random().nextBoolean()) {input = "iCanBeNull";}Optional<String> wrapped = Optional.ofNullable(input);System.out.println(wrapped.orElseGet(() -> {return "defaultBySupplier";}));
}

我对此有些困惑。 为什么要使用两种单独的方法来实现相似的目标? orElseorElseGet很可能已被重载 (相同名称,不同参数)。

无论如何,这里唯一明显的区别是参数本身–您可以选择提供一个Lambda表达式来表示Supplier <T> (功能接口)的实例。

与常规的空值检查相比,使用Optional更好吗?

  • 总的来说,使用Optional的主要好处是能够清楚地表达您的意图 -简单地从方法中返回null会使消费者对是否是故意的存有疑问(当实际的NPE出现时)并且需要进一步自省javadocs(如果有)。 借助Optional,其水晶般清晰
  • 有以下几种方式可以完全避免NPE与可选-在上面的例子中所提到的,使用Optional.ofNullable(可选创建过程中)和否则容易orElseGet(可选消费过程中)从NPE上保护我们一起

另一个救星!

(以防您无法使用Java 8)

查看此代码段。

package com.abhirockzz.wordpress.npesaviors;import java.util.Map;
import java.util.Objects;public class UsingObjects {String getVal(Map<String, String> aMap, String key) {return aMap.containsKey(key) ? aMap.get(key) : null;}public static void main(String[] args) {UsingObjects obj = new UsingObjects();obj.getVal(null, "dummy");}
}

什么可能为空?

  • 地图对象
  • 执行搜索所依据的密钥
  • 在其上调用方法的实例

在这种情况下引发NPE时,我们永远无法确定什么是null

输入对象类

package com.abhirockzz.wordpress.npesaviors;import java.util.Map;
import java.util.Objects;public class UsingObjects {String getValSafe(Map<String, String> aMap, String key) {Map<String, String> safeMap = Objects.requireNonNull(aMap,"Map is null");String safeKey = Objects.requireNonNull(key, "Key is null");return safeMap.containsKey(safeKey) ? safeMap.get(safeKey) : null;}public static void main(String[] args) {UsingObjects obj = new UsingObjects();obj.getValSafe(null, "dummy");}
}

requireNonNull方法:

  • 如果其值不为null,则仅返回该值
  • 如果值为null,则将向NPE投掷指定的消息

为什么这比if(myObj!= null)更好

您将看到的堆栈跟踪将明显具有Objects.requireNonNull方法调用。 这以及您的自定义错误消息将帮助您更快地发现错误。 。 .IMO快得多!

您也可以编写用户定义的检查,例如,实施强制执行非空性的简单检查

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;public class RandomGist {public static <T> T requireNonEmpty(T object, Predicate<T> predicate, String msgToCaller){Objects.requireNonNull(object);Objects.requireNonNull(predicate);if (predicate.test(object)){throw new IllegalArgumentException(msgToCaller);}return object;}public static void main(String[] args) {//Usage 1: an empty string (intentional)String s = "";System.out.println(requireNonEmpty(Objects.requireNonNull(s), (s1) -> s1.isEmpty() , "My String is Empty!"));//Usage 2: an empty List (intentional)List list =  Collections.emptyList();System.out.println(requireNonEmpty(Objects.requireNonNull(list), (l) -> l.isEmpty(), "List is Empty!").size());//Usage 3: an empty User (intentional)User user = new User("");System.out.println(requireNonEmpty(Objects.requireNonNull(user), (u) -> u.getName().isEmpty(), "User is Empty!"));
}private static class User {private String name;public User(String name){this.name = name;}public String getName(){return name;}}
}

不要让NPE在错误的地方感到痛苦。 我们拥有一套不错的工具来更好地处理NPE或完全消除它们!

干杯!

翻译自: https://www.javacodegeeks.com/2014/09/optional-and-objects-null-pointer-saviours.html

对象空指针

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

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

相关文章

循环发ajax请求,在循环中发送jquery ajax请求

我在我的Web应用程序的Map中实现了“空间选择”&#xff0c;它选择Streets的数量。选择后&#xff0c;我会为使用“选择处理程序”选择的所有街道获取唯一的街道标识。在循环中发送jquery ajax请求我的下一步是发送Ajax请求到每个街道Id的服务器并获取回应。目前&#xff0c;我…

延迟关机_苹果电脑到底需不需要关机?关机和休眠你选择哪个

刚买了MacBook的朋友&#xff0c;会不会跟小编一样&#xff0c;是格外的珍惜&#xff0c;总想以一种最好的方式使用自己人生中第一个苹果电脑。苹果笔记本需要关机吗&#xff1f;不关机会卡吗&#xff1f;也成了自己关心的话题&#xff01;Mac 到底要不要关机&#xff0c;这个问…

关于高效企业测试的思考(1/6)

企业中的测试仍然不是应有的广泛使用的话题。 编写尤其是维护测试需要花费时间和精力&#xff0c;但是缩短软件测试并不是解决方案。 为了提高测试效率&#xff0c;应该追求哪些范围&#xff0c;方法和测试技术&#xff1f; 我根据许多实际项目&#xff0c;结合了我在企业测试…

电脑开机后显示服务器没有声音,我的电脑音频服务启动不了,没有声音,小扬声器那里是一个红色的小叉叉...

(我系统是W7普通家庭版32位)一、电脑没了声音&#xff0c;小喇叭上有个红叉&#xff0c;鼠标放上去显“音频服务未运行”&#xff0c;进入控制面板&#xff0c;声音里显没有设备。1&#xff0c;确保硬件好的前提下&#xff0c;还是得先检查下你的驱动有没有问题。2&#xff0c;…

10鼎信诺为什么安装不了_鼎信诺审计软件一周常见问题(4.134.17)

今天介绍一下近期咨询较多的两款财务软件在取数后不能显示辅助核算明细的问题&#xff0c;分别是诺诺云和亿企代账&#xff0c;这两款软件都是采用云记账方式&#xff0c;均可以通过其平台中的导出审计数据的功能导出一个备份文件夹&#xff0c;备份文件夹中都是TXT格式的文本文…

Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 如果您已经成为Java开发人员超过15年&#xff0c;那么您可能还记得什么时候有过多的J…

http服务器网站打不开,网站打不开_ostonkin8743的博客__杭州19楼

HTTP 错误 403 - 限制为仅本地主机访问 Internet 服务管理器 (HTML)HTTP 错误 403 403.1 禁止&#xff1a;禁止执行访问如果从并不允许执行程序的目录中执行 CGI、ISAPI 或其他执行程序就可能引起此错误。如果问题依然存在&#xff0c;请与 Web 服务器的管理员联系。HTTP 错误 …

函数传参字典_Python 函数中的 4 种参数类型

作者&#xff1a;小小程序员链接&#xff1a;https://zhuanlan.zhihu.com/p/89538123来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。在调用函数时&#xff0c;通常会传递参数&#xff0c;函数内部的代码保持不变&#x…

gc频繁的暂停启动_减少主要GC暂停的频率

gc频繁的暂停启动这篇文章将讨论一种减少垃圾收集暂停的技术&#xff0c;它会延迟应用程序的延迟。 正如我几年前所写&#xff0c; 在JVM中无法禁用垃圾收集 。 但是&#xff0c;有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知&#xff0c;JVM内部发生了…

部署war文件到服务器,war包怎么部署到云服务器

war包怎么部署到云服务器 内容精选换一换部署提供可视化、一键式部署服务&#xff0c;支持并行部署和流水线无缝集成&#xff0c;实现部署环境标准化和部署过程自动化。本节通过以下四步介绍如何使用部署服务将归档在软件发布库的软件包部署到云主机上。第一步&#xff1a;准备…

惠普bios硬重置_惠普笔记本电脑按什么样键进入BIOS设置?惠普笔记本BIOS密码忘了咋重置...

F① F② DEL都不行。r是不是的啊&#xff1f;量情拆好&#xff1a;如果您确认无法进入BIOS://stg.www⑧.hp&#xff0c;这个情况很可能是硬件有故障造成的&#xff0c;建议您可以通过以下网址查询距离最近的惠普金牌服务中心.com/cn/zh/support-drivers/esupport/ascpps&…

Java 8中的StringJoiner与String.join的示例

将多个String文字或对象合并为一个是常见的编程要求&#xff0c;并且经常会发现需要为应用程序将String列表或String集合转换为CSV String的情况。 长期以来&#xff0c;JDK API无法将多个String文字或对象连接在一起&#xff0c;这迫使程序员编写诸如遍历所有String对象并使用…

小米4系统定位服务器地址,小米4原装浏览器怎么开启定位系统

手机系统最好是开发版&#xff0c;稳定版必须先root&#xff0c;可以自己root(另找教程)&#xff0c;也可以刷成开发版。我的手机系统是MIUI4.10.31(开发版)&#xff0c;可以在“系统更新”查看&#xff0c;具有root功能。小米4如何开启虚拟键盘方法安装RE管理器和Root Explore…

中如何将方形图片转换成圆形图片_【PS】PS中不可不知的实用技巧!你都掌握了吗?...

今天给大家分享一些在PS中经常用到的实用小技巧&#xff0c;操作简单易上手。01 拉伸图片人物不变形在我们在PS里想要拉伸一些图片时&#xff0c;里面的人物往往会跟着一起变形&#xff0c;那么如何改变图片比例的同时&#xff0c;又不影响人物的形态呢&#xff1f;打开我们需要…

jooq 执行sql_使用jOOQ和Java 8的CompletableFuture进行异步SQL执行

jooq 执行sql响应式编程是一个新的流行词&#xff0c;它实际上仅表示异步编程或消息传递。 事实是&#xff0c;函数语法极大地帮助构建了异步执行链&#xff0c;今天&#xff0c;我们将看到如何使用jOOQ和新的CompletableFuture API在Java 8中做到这一点。 实际上&#xff0c…

python系统状态_python实现系统状态监测和故障转移实例方法

代码如下:#coding: utf-8import socketimport selectimport timeimport osimport threadingdef ser():s socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.bind(("",43244))while 1:infds,outfds,errfds select.select([s],[],[],5)if infds:sms s.recv(1024)if…

ubuntu系统安装socket服务器,Ubuntu上进行socket编程,并且实现通信功能

#include #include #include#include#include #include#include #include #include #include#include #include#include #include #define PERM S_IRUSR|S_IWUSR#define MYPORT 5500 //宏定义&#xff0c;定义通信端口#define BACKLOG 10//宏定义&#xff0c;定义服务程序可以连…

使用JUnit对ADF应用程序进行单元测试

JUnit是Java语言的单元测试软件包&#xff0c;由于ADF构建在J2EE框架之上&#xff0c;因此可以用来测试Oracle ADF应用程序。 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程。 在这里&#xff0c;我将说明如何在JDeveloper 12.2.1.3中设置和使用JUnit来…

libgo高性能网络服务器,【开源】gnet: 一个轻量级且高性能的 Golang 网络库

![](https://ask.qcloudimg.com/http-save/1303222/sipe2g9n9h.png)# Github 主页[https://github.com/panjf2000/gnet](https://github.com/panjf2000/gnet)欢迎大家围观~~&#xff0c;目前还在持续更新&#xff0c;感兴趣的话可以 star 一下暗中观察哦。# 原文博客[gnet: 一个…

拆分js文件_2021入门Webpack,看这篇就够了:Webpack.config.js 解析

这是优妈成长记的第63篇原创这是一个webpack配置说明本文是发布在github上webpack-demo的README文件内容。主要对webpack.config.js每一条的注释说明。github项目地址&#xff1a;https://github.com/hourong88/webpack-demo可以点击文章最下方【阅读原文】跳转github链接查看&…