避免的好处是什么!=java中的null?

避免的好处是什么!=java中的null?,java,null,Java,Null,我读过这个主题:但我没有看到它的好处 如果返回空数组,则需要检查“实”数组的位置以及空数组的位置 而不是使用类似于getName()!=null,必须使用getName().length>0。举个例子,我正在进行一个项目,在这个项目中,我需要用几个归档程序压缩一些数据,并决定选择最小大小的压缩数据。如果我从archiver“compress”方法返回null,我需要检查返回的值是否不是null。如果我决定返回一个空数组,那么我还需要检查它是否为空 我说得对吗?空数组有时是一个更自然的返回对象。考

我读过这个主题:但我没有看到它的好处

  • 如果返回空数组,则需要检查“实”数组的位置以及空数组的位置

  • 而不是使用类似于
    getName()!=null
    ,必须使用
    getName().length>0
    。举个例子,我正在进行一个项目,在这个项目中,我需要用几个归档程序压缩一些数据,并决定选择最小大小的压缩数据。如果我从archiver“compress”方法返回null,我需要检查返回的值是否不是null。如果我决定返回一个空数组,那么我还需要检查它是否为空


  • 我说得对吗?

    空数组有时是一个更自然的返回对象。考虑一些这样的代码:

    String [] elements = getElements();
    
    for (String element : elements)
       System.out.println(element);
    

    如果返回空数组(即没有元素),则不会打印任何内容,代码将正确执行。但是,如果getElements()返回null,则会出现null指针异常。为了防止它,你需要添加更多的代码,这会使事情变得更复杂。返回空数组允许在没有额外代码的情况下执行所需的行为。

    使用空集合或“空白”操作而不是null的主要优点是,在大多数情况下,这样的对象仍然可以在代码中工作,无需进一步修改。
    null
    值的核心,由于其性质,更容易出错

    以以下代码为例:

    String[] names = data.getNames();
    if (names != null) {
        for (String name : names) {
            // Do stuff
        }
    }
    
    Action myAction = data.getActionToRun();
    if (myAction != null) {
        myAction.run();
    }
    
    需要检查
    null
    ,否则您将获得NPE。使用标准for循环无法解决此问题。另一方面,如果您知道您总是会得到某种数组,那么您的代码在不进行额外检查的情况下就可以正常工作。如果数组为空,则循环根本不会运行。问题解决了

    对于实现某种形式的操作的代码也是如此。另一个例子:

    String[] names = data.getNames();
    if (names != null) {
        for (String name : names) {
            // Do stuff
        }
    }
    
    Action myAction = data.getActionToRun();
    if (myAction != null) {
        myAction.run();
    }
    
    您需要再次进行
    null
    检查。如果这个动作被保证存在,那么你可以总是调用<代码> Actudio。就这么简单

    在许多情况下,如果修改方法返回的方式,则可以简单地放弃
    null
    检查,从而生成更简单、更易于理解的代码。在某些情况下,返回
    null
    是正确的选择(例如,从键和值的集合中获取对象),因为没有默认的“无操作”值。但是
    null
    表示根本没有值,并且需要接收方进行额外处理。使用空白的、无操作的、非空的对象允许数据对象处理错误。这是很好的封装。这是很好的编程。它只是工作。™


    最后,返回
    null
    肯定不是处理错误的好方法。如果您的代码中出现了一些错误,除非您作为程序员犯了编程错误,否则永远不会出错,请使用
    assert
    s或exceptions。这些都是失败。不要将
    null
    用作失败案例,将其用作一个简单的缺少值的例子。

    我曾经有过这样的想法。 暂时把NPE问题放在一边。我将尝试从面向对象的角度解释我的想法

    假设您编写了一个为Glass实例提供getter的类
    public Glass getGlass()
    。 当我读到这个签名时,我希望看到一个Glass接口的实例,而null不是一个

    您可以考虑下一个方法<代码>公共可选GETGLASE()< <代码> > < /P> 可选类(可以自己编写或使用)包含泛型类实例,同时提供isPresent函数等。 这似乎是多余的,因为“您可以使用

    getGlass()!”null
    而不是客户端代码中的
    getGlass().isPresent()
    。但这里的主要优点是签名简单明了。没有人隐藏任何东西,你也不必猜

    因此,您可以获得以下好处:

  • 避免NPE
  • 直接签名
  • 干净的客户端代码

  • 是的,这是真的,但正如我在我的例子中提到的,这种方法并不总是正确的。我反对完全避免某些事情,除非它被证明是完全不好使用的。在这种情况下,如果空数组/列表和null表示不同的含义,那么应该使用null。如果null和空数组/列表本身没有特殊意义,那么它们可以互换使用,以使代码更干净。我不理解你的第一点。什么是“真实”数组?如果返回的是
    null
    ,则应为实际数组。如果是错误,抛出一个异常。@JakeKing,你读过我的例子吗?我有压缩函数,如果该函数返回空数组,则解压缩函数将失败,因为它的实现需要检查它的第一个字节,因此,我需要检查一下这种情况。问题的答案是+1,不只是在互联网上阅读一种模式,并且不问为什么就把它当作福音来接受。人们可能会对
    null
    @AvershinDmitry这样的事情非常武断,是的,但基本的解决方案是在这种情况下不要返回
    null
    。如果从compress函数接收到
    null
    ,则表明有问题。如果出现错误,则引发异常。非常有用,谢谢。这意味着在我的示例中,当compress函数无法压缩时,最好返回空数组,并在将数据添加到列表之前检查此数据是否为非空以避免NPE@AvershinDmitry这不一定是最好的解决方案。在我看来,除非出现错误,否则该方法永远不应该返回空值(或空数组)。那不是个好主意。如果出现错误,则抛出异常。