【问题标题】:How to avoid NullPointerExceptions when calling getter-methods on a nested class在嵌套类上调用 getter 方法时如何避免 NullPointerExceptions
【发布时间】:2021-05-30 11:01:26
【问题描述】:

希望您能帮助我解决我的问题。实际上我知道有解决方案(例如 nullchecking),但我正在寻找一个超级优雅的解决方案!在最好的情况下,单线。希望你能帮助我。

现在我将通过简单的例子来描述这个问题。

情况描述

我有一个 Java 对象,它包含其他简单成员变量旁边的其他 Java 对象(嵌套 Java 对象)。

类商店:

  • 字符串名称
  • 字符串城市
  • 员工员工

班级员工:

  • 字符串名称
  • 整数年龄
  • 银行账户银行账户

...等等。

可以看到 Store 对象 -> 包含:Employee 对象 -> 包含:BankAccount 对象。

问题

要从 Store 对象中调用 Employee 的年龄,我会这样做:

Store.getEmployee().getAge();

或者如果我想要银行账户 IBAN,我必须这样做

Store.getEmployee().getBankAccount().getIban();

但是,如果商店有没有员工,.getEmployee() 将导致NullPointerException。 银行账户也一样。

当然可以

if(Store.getEmployee() != null) {
    if(Store.getEmployee().getBankAccount() != null) {
        System.out.println(Store.getEmployee().getBankAccount().getIban();
    }
}

但这太烦人了。

有没有更简单的解决方案?

注意:选项也不起作用,因为

Optional.ofNullable(Store.getEmployee().getBankAccount().getIban().orElse("");

当 Store.getEmployee() 已经导致异常时不起作用。

编辑 请注意,对象本身不应成为解决方案的一部分。当然,您可以修改对象以便返回一个可选的或自己进行空值检查。 这背后的原因是您只是获取对象并处理它们,但不允许配置它们。

【问题讨论】:

  • 让 getEmployee 返回一个可选项。
  • @ThorbjørnRavnAndersen hm,如果对象定义由另一个部门处理并且我不允许更改它们?
  • 那么不要做一个衬垫。每次检查。这需要您捕获变量中的值。正确执行此操作。你现在越小心,你的软件就会越健壮。
  • 如您所见,您的 Optional 方法不起作用。如果你想使用 Optional,你应该使用类似:Optional.ofNullable(Store.getEmployee()).map(Employee::getBankAccount).map(BankAccount::getIban).orElse("").
  • 您好,欢迎您! :-) 这(不)回答你的问题:stackoverflow.com/q/10391406/592355 ?? ..xD

标签: java nullpointerexception optional getter-setter


【解决方案1】:

您可以使用以下内容:

Optional.ofNullable(store.getEmployee())
        .map(Employee::getBankAccount)
        .map(BankAccount::getIban)
        .orElse("")

您还应该考虑定义返回类型为Optional<Employee>getEmployee 方法,在这种情况下您可以将其更改为:

store.getEmployee()
        .map(Employee::getBankAccount)
        .map(BankAccount::getIban)
        .orElse("")

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多