String compareTo

时间:2012-06-26 12:52:54

标签: java null nullpointerexception

有人知道为什么String.compareTo没有被编程为对null参数表现得更加优雅吗?

在我看来,下一个序列应该返回“1”,或者至少javadoc应该对NPE更具体。在这种情况下,equals()会返回false,我猜equalscompareTo应该保持一致。

E.g。

String nullString = null;
System.out.println ("test".equals(nullString));
System.out.println ("test".compareTo(nullString));

投掷NPE:

false
Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.compareTo(String.java:1177)

添加到它。如果您要在代码中进行compareTo,那么您是否会验证空值?

3 个答案:

答案 0 :(得分:9)

因为它是documented behavior of compareTo()(强调添加):

  

当且仅当Ce1.compareTo(e2) == 0具有与e1.equals(e2)相同的布尔值时,类e1的自然顺序被称为与等于一致类e2的{​​{1}}和C。请注意, null不是任何类的实例,即使e.compareTo(null)返回NullPointerExceptione.equals(null)也应该抛出false

至于.equals()返回false而非NPEing,再次,它位于the documentation

  

对于任何非空引用值xx.equals(null)应返回false

答案 1 :(得分:3)

来自javadoc

将此String与另一个Object进行比较。如果Object是String,则此函数的行为类似于compareTo(String)。否则,它会抛出ClassCastException(因为Strings只能与其他字符串相媲美)。

唯一的另一个选择是抛出一个ClassCastException,因为有一个明确定义的空引用异常,而是抛出NPE。

执行以下代码:

void do()
{
    String s = null;
    System.out.println(s instanceof String); 
}

产生错误。

答案 2 :(得分:1)

通常可以理解,Java SE类库文档明确说明null何时是有效参数。如果没有提到null是一个有效的参数,你应该假设它不是,并且可能会立即或稍后抛出异常。

在这种情况下,Comparable接口的javadoc明确指出null不是Comparable,compareTo的有效参数。 (您可以通过点击“指定者”链接从String.compareTo javadoc到达那里。)