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

参数字符串为null时,int compareTo()应该返回什么?

宋原
2023-03-14
问题内容

有人说,当输入参数为null时,compareTo()应该抛出NullPointerException。但是,我正在实现一个类,该类需要将字段与String类型进行比较。这些字段不是必需的。我想知道在这种情况下

1)输入为空时应该返回什么?在字典上,任何非空字符串都应该大于或小于空吗?

2)如果认为这是不良做法,是否有任何支持的论据?我应该强迫用户改用空字符串吗?如果使用空字符串,这不会混淆该字段不适用的情况和该字段为空的情况吗?如果必须抛出异常,那么除了在手册中警告用户外,我还能/应该做什么?

编辑:我可能在这里不能清楚地表达自己,但是在我实现的程序中,可能为null的字符串是所有字段或一个类,不应为null。换句话说,compareTo()使用的对象不能为null,只能是其私有字段。因此,在这种情况下,我相信如果我正确地实现compareTo(),就不会违反传递要求,因为具有空字段的类将始终被视为相同。我是对还是错?

谢谢大家的回答!


问题答案:

是的,允许null实例字段没有问题-
只要确保已定义其排序顺序即可。最自然的做法是将其放在所有真实字符串之前或之后,但是您可以在这里做任何事情,只要始终如一。(例如,您可以排序null"null"。)

这是单个成员的示例实现:

class Example implements Comparable<Example> {

   @Nullable
   private String member;

   // TODO: getter, setter, constructor, ...

   public int compareTo(Example that) {
      if(this.member == null)
         if(that.member == null)
            return 0; //equal
         else
            return -1; // null is before other strings
       else // this.member != null
         if(that.member == null)
            return 1;  // all other strings are after null
         else
            return this.member.compareTo(that.member);
   }
}

请注意,Comparable.compareTo()的规范仅具有一个约束o.compareTo(null)(其行为应类似于- null.compareTo(o),即抛出NullPointerException),而不涉及null字段的处理方式(它根本没有提及字段,因此类可以只要确保反对称性,自反性和可传递性,就可以返回任意值)。



 类似资料:
  • 当某个对象具有装箱类型属性时,该属性的getter返回。但是这应该返回,因为boxed type属性的默认值是。这里有什么问题?

  • 这可能是非常基本的东西,但我很难弄清楚我哪里出错了。 我试图从帖子正文中获取一个字符串,但“jsonString”只显示为null。我还想避免使用模型,但这可能是不可能的。我与PostMan接触到的一段代码是: 也许这是我在postman上做得不正确的地方,但我一直在尝试在body-x-www-form-urlencoded部分的值部分使用“=test”(如在有关此主题的其他问题中看到的),键为j

  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在

  • 问题内容: 我正在开发一个使用JSON进行服务器通信的Android应用,当我尝试解析json文件时遇到了一个奇怪的问题。 这是我来自服务器的json 我通过调用地址Json-object 获得City的价值。对于这种情况,我期望为空(这是optString的意思吗?),但实际上它包含字符串“ null”。因此,进一步的null或isEmpty- checks将返回false,因为String包含

  • 在控制台中获得以下结果: 添加项:null 因此,我希望通过将addedItemName字符串与“null”字符串进行比较来知道何时单击了close按钮。这似乎永远不会奏效,而且让我很沮丧,因为我真的不明白。下面是我做的一些其他测试,以展示我如何尝试各种不同的方法,但仍然不起作用。 假的 假的 因此,基本上,console向我显示,当单击关闭按钮时,addedItemName是“null”,但当我

  • 我正在开发一个使用JSON进行服务器通信的Android应用程序,当我试图解析我的json文件时,我遇到了一个奇怪的问题。 这是来自服务器的json 我通过调用字符串City=address来获取City的值。我的地址Json对象上的optString(“city”,“”)。对于这种情况,我希望城市是空的(这就是optString在这里的目的,不是吗?)但实际上它包含字符串“null”。因此,进一