Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串比较器_Java_Null_Nullpointerexception - Fatal编程技术网

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应该更具体地描述NPE
equals()
在这种情况下返回
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); 
}