当前位置: 首页 > 面试题库 >

将null传递给方法[关闭]

汝跃
2023-03-14
问题内容

一个讨论是关于将空值传递给方法。

public class MetricsCalculator {
    public double xProjection(Point p1, Point p2) {
        return (p2.x - p1.x) * 1.5;
    }
}
...
calculator.xProjection(null, new Point(12,13));

它代表了不同的处理方式:

public double xProjection(Point p1, Point p2) {
    if (p1 == null || p2 == null) {
        throw new IllegalArgumentException("Invalid argument for xProjection");
    }
    return (p2.x - p1.x) * 1.5;
}

public double xProjection(Point p1, Point p2) {
    assert p1 != null : "p1 should not be null";
    assert p2 != null : "p2 should not be null";
    return (p2.x - p1.x) * 1.5;
}

我更喜欢断言方法,但是我不喜欢断言默认情况下处于关闭状态的事实。

该书最后指出:

在大多数编程语言中,没有很好的方法来处理调用者意外传递的null。因为是这种情况,所以合理的方法是默认情况下禁止传递null。

它实际上并没有涉及如何实施此限制?

无论哪种方式,您中的任何人都有强烈的意见。


问题答案:

在这里,使用断言和引发异常都是有效的方法。任何一种机制都可以用来指示编程错误,而不是运行时错误,如此处的情况。

  • 断言具有性能优势,因为它们通常在生产系统上被禁用。
  • html" target="_blank">异常具有安全性的优点,因为始终执行检查。

选择实际上取决于项目的开发实践。整个项目需要确定一个断言策略:如果选择在所有开发过程中启用断言,那么我会说使用断言来检查这种无效参数-
在生产系统中,由于以下原因而抛出NullPointerException:无论如何,编程错误都不太可能以有意义的方式捕获和处理,因此它的作用就像断言。

但是实际上,我知道许多开发人员不相信断言会在适当的时候启用,因此选择了抛出NullPointerException的安全性。

当然,如果您不能为代码实施策略(例如,如果您正在创建库,并且这取决于其他开发人员如何运行您的代码),则应该选择对这些代码抛出NullPointerException的安全方法库API的一部分的方法。



 类似资料:
  • 我有以下代码: 我知道对于1和3,它打印“2”,因为调用了最特定的参数类型。但无法理解为什么2打印“2”。

  • 和empdomain.updateemp() 我只是一个新手玩2,jpa持久化,所以我不知道如何修复异常错误,请帮助。

  • 问题内容: 如何将整个数组传递给方法? 如何正确执行此操作? 问题答案: 你做这个: 只需将其作为其他任何变量传递即可。 在Java中,数组是通过引用传递的。

  • 这是我的第一个Java应用程序。我正在尝试创建一个产品(键)和它们的价格(值)的地图。文档上说我不能用doubles换钱,所以我得用bigdecimal。我现在完全不知道如何在我的方法和地图中使用BigDecimal。 寄存器类: 主类:

  • 问题内容: 我梦见一个带有显式关键字args的Python方法: 我想获得仅包含调用者实际上传递给方法的那些参数的字典,就像,但是我不希望调用者能够传递任何旧的随机args,而不是。 那么:有这样的咒语吗?就我而言,我碰巧能够将每个参数与其默认值进行比较,以找到不同的参数,但这有点不雅致,当您有9个参数时会变得乏味。为了获得奖励积分,即使调用者传入分配了默认值的关键字参数,它也可以告诉我: 调皮!

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具