首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Null检查链与捕获NullPointerException

Null检查链与捕获NullPointerException
EN

Stack Overflow用户
提问于 2016-06-21 22:57:03
回答 19查看 19.1K关注 0票数 124

web服务返回一个巨大的XML,我需要访问它的深度嵌套字段。例如:

代码语言:javascript
运行
AI代码解释
复制
return wsObject.getFoo().getBar().getBaz().getInt()

问题是getFoo()getBar()getBaz()都可能返回null

但是,如果我在所有情况下检查null,代码会变得非常冗长和难以阅读。此外,我可能会错过一些字段的检查。

代码语言:javascript
运行
AI代码解释
复制
if (wsObject.getFoo() == null) return -1;
if (wsObject.getFoo().getBar() == null) return -1;
// maybe also do something with wsObject.getFoo().getBar()
if (wsObject.getFoo().getBar().getBaz() == null) return -1;
return wsObject.getFoo().getBar().getBaz().getInt();

写下来可以接受吗?

代码语言:javascript
运行
AI代码解释
复制
try {
    return wsObject.getFoo().getBar().getBaz().getInt();
} catch (NullPointerException ignored) {
    return -1;
}

那会被认为是反模式吗?

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2016-06-22 00:00:19

捕获NullPointerException的一件很麻烦的事情,因为它们几乎可以在任何地方发生。很容易从一个bug中得到一个,偶然地抓住它,然后继续,就好像一切都是正常的,从而隐藏了一个真正的问题。处理起来太棘手了,所以最好完全避免.(例如,考虑一下空Integer的自动取消装箱)。

我建议您使用Optional类代替。当您想要使用存在或不存在的值时,这通常是最好的方法。

使用它,您可以像这样编写代码:

代码语言:javascript
运行
AI代码解释
复制
public Optional<Integer> m(Ws wsObject) {
    return Optional.ofNullable(wsObject.getFoo()) // Here you get Optional.empty() if the Foo is null
        .map(f -> f.getBar()) // Here you transform the optional or get empty if the Bar is null
        .map(b -> b.getBaz())
        .map(b -> b.getInt());
        // Add this if you want to return null instead of an empty optional if any is null
        // .orElse(null);
        // Or this if you want to throw an exception instead
        // .orElseThrow(SomeApplicationException::new);
}

为什么要选?

对于可能缺少的值,使用Optional而不是null可以使读者清楚地看到这一事实,并且类型系统将确保您不会意外地忘记它。

您还可以访问用于更方便地处理此类值的方法,如maporElse

缺勤有效还是错误?

但是还要考虑一下,对于中间方法来说,返回null是一个有效的结果,还是一个错误的标志。如果它总是一个错误,那么它可能更好地抛出一个异常,而不是返回一个特殊的值,或者中间方法本身抛出一个异常。

也许会有更多的选择?

另一方面,如果中间方法中没有值是有效的,那么您也可以为它们切换到Optional

然后你可以像这样使用它们:

代码语言:javascript
运行
AI代码解释
复制
public Optional<Integer> mo(Ws wsObject) {
    return wsObject.getFoo()
        .flatMap(f -> f.getBar())
        .flatMap(b -> b.getBaz())
        .flatMap(b -> b.getInt());        
}

为什么不选呢?

我能想到的不使用Optional的唯一原因是,如果这是代码的一个真正的性能关键部分,以及垃圾收集开销最终证明是一个问题。这是因为每次执行代码时都会分配一些Optional对象,而VM可能无法优化这些对象。在这种情况下,你最初的如果测试可能会更好。

票数 151
EN

Stack Overflow用户

发布于 2016-06-21 23:13:25

我建议考虑Objects.requireNonNull(T obj, String message)。您可以为每个异常构建包含详细消息的链,如

代码语言:javascript
运行
AI代码解释
复制
requireNonNull(requireNonNull(requireNonNull(
    wsObject, "wsObject is null")
        .getFoo(), "getFoo() is null")
            .getBar(), "getBar() is null");

我建议您不要使用特殊的返回值,比如-1。这不是Java风格。Java设计了异常机制,以避免这种源自C语言的老式方法。

抛出NullPointerException也不是最好的选择。您可以提供您自己的异常(检查它以保证它将由用户处理,或者不检查以更容易的方式处理它),或者使用来自XML解析器的特定异常。

票数 15
EN

Stack Overflow用户

发布于 2016-06-22 18:28:56

假设阶级结构确实超出了我们的控制范围,我认为,按照问题中的建议,抓住NPE确实是一个合理的解决办法,除非业绩是一个主要考虑因素。一个小的改进可能是封装抛/捕捉逻辑以避免混乱:

代码语言:javascript
运行
AI代码解释
复制
static <T> T get(Supplier<T> supplier, T defaultValue) {
    try {
        return supplier.get();
    } catch (NullPointerException e) {
        return defaultValue;
    }
}

现在您可以简单地做:

代码语言:javascript
运行
AI代码解释
复制
return get(() -> wsObject.getFoo().getBar().getBaz().getInt(), -1);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37960674

复制
相关文章
python3-交互时隐藏输入的密码
# Auther: Aaron Fan #这个脚本请在命令行去执行才可以试出效果,pycharm这里无法测试这个脚本,切记! import getpass _username = "Aaron" _passwd = "abc,123" username = input("请输入你的用户名: ") #getpass这个模块可以帮助你输入密码时把密码隐藏 passwd = getpass.getpass("请输入你的密码: ") if username == _username and passwd == _passwd:    print("你的用户名密码输入正确。") else:    print("你的用户名或者密码错误!")
py3study
2020/01/08
1K0
在 Python 中隐藏和加密密码?
在当前的数字时代,安全至关重要。在我们作为开发人员的工作中,我们经常处理密码等机密数据。必须使用正确的密码加密和隐藏方法来保护这些敏感数据。Python 中许多可访问的技术和模块可以帮助我们实现这一目标。通过对可用实现的基本思想和示例的解释,本文研究了在 Python 中隐藏和加密密码的最佳技术和方法。
很酷的站长
2023/08/11
6440
在 Python 中隐藏和加密密码?
如何在 Python 中隐藏和加密密码?
有多种 Python 模块用于隐藏用户输入的密码,其中一个是**maskpass()模块。在 Python 中,借助maskpass()模块和base64()**模块,我们可以在输入时使用星号(*) 隐藏用户的密码,然后借助 base64() 模块可以对其进行加密。
海拥
2022/04/13
2.2K0
python如何保证输入键入数字
要求:用python写一个要求用户输入数字,如果不是数字就一直循环要求输入,直到输入数字为止的代码 错误打开方式: while True: ten=input('Enter a number:') if type(eval(ten))==type(int):    break 用这个输入字母可以可是输入字母就直接报错中断了 主要出在eval上。 第一个方案: while True: ten=input("x:") try: x=eval(ten)
marsggbo
2018/01/23
1.5K0
Android实现密码隐藏显示
需求:当用户点击提现按钮的时候,弹出输入支付密码的popupwindow,输入密码框后面有显示和隐藏支付密码的切换按钮。
程序员飞飞
2020/02/27
3.5K0
Android实现密码隐藏显示
Python隐藏特性:字符串驻留、常量折叠
>>> id(“some” + “_” + “string”) # 注意两个的id值是相同的.
小小科
2020/07/27
7060
网页标签闪烁 + 显示隐藏密码
感觉标签闪烁蛮有意思的,再加一篇凑一下字数。点击下方阅读原文,查阅文档,里面会有平时的积累。
OBKoro1
2020/10/27
2.6K0
网页标签闪烁 + 显示隐藏密码
Android 密码的隐藏和显示
在Android开发中,需要密码的隐藏和显示,下面就和大家分享一下使用方法: xml代码:
网罗开发
2021/01/29
2.2K0
Android 密码的隐藏和显示
长按键入
你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能被输入1次或多次。
WindRunnerMax
2020/10/26
9540
基于 Hexo 键入搜索功能
安装依赖。 前往博客根目录,打开cmd命令窗口执行npm install hexo-generator-search --save。
唐志远
2022/10/27
1.2K0
基于 Hexo 键入搜索功能
长按键入!
力扣题目链接:https://leetcode-cn.com/problems/long-pressed-name
代码随想录
2021/12/24
6.5K0
长按键入!
Python脚本命令行执行隐藏密码等敏感信息
Linux命令行登录系统,MySQL时,输入的密码看不到的,怎么在执行Python脚本时,密码等敏感信息也不让它出现呢?
酒馆丁老师
2020/09/08
1.8K0
Python脚本命令行执行隐藏密码等敏感信息
如何实现密码的显示和隐藏?
如图所示,我们在登录账号的时候经常会看到密码的显示和隐藏是可以进行切换的,那么到底怎么实现这个功能呢?
用户7656790
2020/12/14
6.2K0
如何实现密码的显示和隐藏?
c++输入隐藏密码的实现
最近在用C++编写一个图书管理系统, 其中需要用户的登录, 原来没有想太多, 就用了普通的cin输入, 但是前两天组里的同学说, 要是输入密码的时候能将其隐藏就好了。以前做网站的时候, 有各种标签属性可以很方便的实现这个功能, 但是现在是控制台…不知道怎么搞了。最后百度谷歌后发现了一个很神奇的函数
零式的天空
2022/03/08
1.9K0
EditText输入密码的显示和隐藏
密码的显示和隐藏是一个很常见的小知识点,主要包括2个部分:小图标的变化和EditText输入密码的显示和隐藏
AntDream
2019/07/15
2.6K0
C#实现登录界面,密码星号显示(隐藏输入密码)
在软件设计时,往往需要设置用户的登录权限。用户在填写密码时,如何实现输入隐藏,或者以“*”号进行隐藏显示?这里需要利用textBox的PasswordChar属性。
全栈程序员站长
2022/09/15
3.8K0
C#实现登录界面,密码星号显示(隐藏输入密码)
(四十二) 初遇python之帐号密码隐藏术
各位读者大大们大家好,今天学习python的帐号密码隐藏术,并记录学习过程欢迎大家一起交流分享。
XXXX-user
2019/07/23
1.8K0
(四十二) 初遇python之帐号密码隐藏术
Python根据字符分组数量判断密码安全强度
标准库itertools.groupby类用来根据指定的规则对序列中的元素进行分类,官方介绍如下:
Python小屋屋主
2019/12/13
1.7K0
Python根据字符分组数量判断密码安全强度
Python在import时遇到的惨案
    最近使用基于python语言的django框架开发web相关的应用,但是在访问页面的时候会不定时的报错,import导入报错
用户9127725
2022/08/08
4550
点击加载更多

相似问题

分布统计距离

10

计算元组上两个分布之间的统计距离

10

斑点密码中加法的微分扩散性质

10

安全距离计算

10

简单分组密码

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档