Java 字符串比较器
有人知道为什么Java 字符串比较器,java,null,nullpointerexception,Java,Null,Nullpointerexception,有人知道为什么String.compareTo在null参数方面没有被编程为表现得更优雅吗 在我看来,下一个序列应该返回“1”,或者至少javadoc应该更具体地描述NPEequals()在这种情况下返回false,我想equals和compareTo应该是一致的 例如 正在投掷NPE: false Exception in thread "main" java.lang.NullPointerException at java.lang.String.compareTo(String.
String.compareTo
在null
参数方面没有被编程为表现得更优雅吗
在我看来,下一个序列应该返回“1”,或者至少javadoc应该更具体地描述NPEequals()
在这种情况下返回false
,我想equals
和compareTo
应该是一致的
例如
正在投掷NPE:
false
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.compareTo(String.java:1177)
加上。如果要在代码中进行此比较,是否要从
将此字符串与另一个对象进行比较。如果对象是字符串,则此函数的行为类似于compareTo(字符串)。否则,它抛出一个ClassCastException(因为字符串只能与其他字符串进行比较)
唯一的另一个选项是抛出一个ClassCastException
,但是,由于空引用有一个定义良好的异常,因此会抛出NPE
执行以下代码:
void do()
{
String s = null;
System.out.println(s instanceof String);
}
产生错误。因为它是(加上强调):
类C
的自然顺序称为与等于当且仅当e1一致。compareTo(e2)==0
具有与e1相同的布尔值。对于类C
的每个e1
和e2
,等于(e2)
。请注意,null
不是任何类的实例,并且e.compareTo(null)
应该抛出NullPointerException
,即使e.equals(null)
返回false
至于.equals()
对于任何非空参考值x
,x.equals(null)
应返回false
一般认为,Java SE类库文档明确说明null
是有效参数的时间。当没有提到null
是有效参数时,您应该假设它不是,并且可能会立即抛出异常,或者稍后抛出异常
在这种情况下,Comparable
接口的javadoc明确指出null
不是Comparable,compareTo
的有效参数。(你可以从字符串中找到它。通过单击“Specified by”(指定者)链接与javadoc进行比较。)我认为javadoc非常具体。我想没有一个通用的答案,即使你是从“in my Equisition”(我的意见)开始的,所以任何决定都是任意的选择。无论如何,我承认我同意你们的观点,实际规则不是很直观,它不是对称的,但…它是设计的…为什么它应该返回1而不是-1?用null定义排序没有意义。在这种情况下,equals也应该抛出NPE。@mihaisimi不应该这样做,接口的契约明确声明e.equals(null)将产生false。在实现接口和使用其他人编写的代码时,这一点很重要,我认为“null不是任何类的实例”是很弱的。我知道这是故意的,但它与equals()不一致。即使equals()接受一个对象,equalsIgnoreCase()方法也是一致的(并且它接受一个字符串)。@Adriano你不必向我说明你的情况:这句话直接来自JavaDoc。我同意,这不是完全一致的。“阿德里亚诺,我很好奇你认为NULL是什么?”,它将称为int int(String ActoString),但是CLSASSCASTExchange不适用。here@jontro不,它不会,请参阅更新的代码示例以验证声明。在上面的例子中,设置为null的字符串不再是字符串。您是对的(根据Java法则)。但我认为JDK在这里会产生错误,应该简化。@mihaisimi如果您愿意,可以给James Gosling发电子邮件。@Woot4Moo重载是编译时的。instanceof是运行时。将选择compareTo(字符串)。
void do()
{
String s = null;
System.out.println(s instanceof String);
}