有人知道为什么String.compareTo没有被编程为对null参数表现得更优雅吗?
在我看来,下一个序列应该返回"1“,或者至少javadoc应该在NPE方面更具体。在这种情况下,equals()返回false,我猜equals和compareTo应该是一致的。
例如。
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,是否会验证是否为空?
发布于 2012-06-26 20:54:47
因为它是documented behavior of compareTo() (强调了一下):
当且仅当e1.compareTo(e2) == 0对于类e1.equals(e2)的每个e1和e2具有与e1.equals(e2)相同的布尔值时,类C的自然排序才被称为与等于一致。请注意,null NullPointerException不是任何类的实例,即使e.equals(null)返回false,也应该抛出类。
至于.equals()返回false而不是NPEing,同样是在the documentation中
对于任何非空的引用值
x,x.equals(null)应返回false。
发布于 2012-06-26 20:54:29
从javadoc
将此字符串与另一个对象进行比较。如果对象是字符串,则此函数的行为类似于compareTo( String )。否则,它会抛出一个ClassCastException (因为String只能与其他String相比较)。
唯一的另一个选择是抛出一个ClassCastException,但是,由于空引用有一个定义良好的异常,所以抛出的是NPE。
执行以下代码:
void do()
{
String s = null;
System.out.println(s instanceof String);
}产生false。
发布于 2012-06-26 20:57:53
通常可以理解,Java类库文档明确规定了null何时是有效参数。当没有提到null是有效参数时,您应该假定它不是有效参数,并且可能立即抛出异常,也可能稍后抛出异常。
在本例中,Comparable接口的javadoc明确指出null不是Comparable,compareTo的有效参数。(您可以通过单击"Specified by“链接从String.compareTo javadoc中找到该链接。)
https://stackoverflow.com/questions/11207739
复制相似问题