首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >String compareTo

String compareTo
EN

Stack Overflow用户
提问于 2012-06-26 20:52:54
回答 3查看 6.5K关注 0票数 4

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

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

例如。

代码语言:javascript
复制
String nullString = null;
System.out.println ("test".equals(nullString));
System.out.println ("test".compareTo(nullString));

正在抛出一个NPE:

代码语言:javascript
复制
false
Exception in thread "main" java.lang.NullPointerException
    at java.lang.String.compareTo(String.java:1177)

添加到它上面。如果您要在代码中创建此compareTo,是否会验证是否为空?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-26 20:54:47

因为它是documented behavior of compareTo() (强调了一下):

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

至于.equals()返回false而不是NPEing,同样是在the documentation

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

票数 11
EN

Stack Overflow用户

发布于 2012-06-26 20:54:29

javadoc

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

唯一的另一个选择是抛出一个ClassCastException,但是,由于空引用有一个定义良好的异常,所以抛出的是NPE。

执行以下代码:

代码语言:javascript
复制
void do()
{
    String s = null;
    System.out.println(s instanceof String); 
}

产生false。

票数 3
EN

Stack Overflow用户

发布于 2012-06-26 20:57:53

通常可以理解,Java类库文档明确规定了null何时是有效参数。当没有提到null是有效参数时,您应该假定它不是有效参数,并且可能立即抛出异常,也可能稍后抛出异常。

在本例中,Comparable接口的javadoc明确指出null不是Comparable,compareTo的有效参数。(您可以通过单击"Specified by“链接从String.compareTo javadoc中找到该链接。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11207739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档