4

有谁知道为什么String.compareTo没有编程为在参数方面表现得更优雅null

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

例如

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,你会验证空值吗?

4

3 回答 3

11

因为它是(强调添加)的记录行为:compareTo()

当且仅当具有与类的每个and相同的布尔值时,类的自然排序C被称为与 equals 一致。请注意,它不是任何类的实例,即使返回,也应该抛出一个e1.compareTo(e2) == 0e1.equals(e2)e1e2Cnulle.compareTo(null)NullPointerExceptione.equals(null)false

至于.equals()返回false而不是 NPEing,再次,它在文档中:

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

于 2012-06-26T12:54:46.533 回答
3

来自javadoc

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

然而,唯一的其他选择是抛出一个ClassCastException,因为空引用有一个定义明确的异常,所以会抛出 NPE。

执行以下代码:

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

产生错误。

于 2012-06-26T12:54:28.970 回答
1

一般认为,Java SE 类库文档明确说明 whennull是有效参数。当没有提到null是有效参数时,您应该假设它不是,并且可能会立即抛出异常,或者稍后抛出异常。

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

于 2012-06-26T12:57:52.953 回答