有人知道为什么String.compareTo
没有被编程为对null
参数表现得更加优雅吗?
在我看来,下一个序列应该返回“1”,或者至少javadoc应该对NPE更具体。在这种情况下,equals()
会返回false
,我猜equals
和compareTo
应该保持一致。
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,那么您是否会验证空值?
答案 0 :(得分:9)
因为它是documented behavior of compareTo()
(强调添加):
当且仅当
C
与e1.compareTo(e2) == 0
具有与e1.equals(e2)
相同的布尔值时,类e1
的自然顺序被称为与等于一致类e2
的{{1}}和C
。请注意,null
不是任何类的实例,即使e.compareTo(null)
返回NullPointerException
,e.equals(null)
也应该抛出false
。
至于.equals()
返回false
而非NPEing,再次,它位于the documentation:
对于任何非空引用值
x
,x.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到达那里。)