4

パラメータString.compareToに関してより優雅に動作するようにプログラムされていない理由を知っている人はいますか?null

私の意見では、次のシーケンスは「1」を返すか、少なくとも javadoc が NPE に関してより具体的である必要があります。equals()この場合は戻りますが、一貫しているとfalse思います。equalscompareTo

例えば

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 にする場合、null を検証する必要がありますか?

4

3 に答える 3

11

これは文書化された動作であるcompareTo()ため(強調を追加):

クラスの自然な順序付けは、クラスのすべてのおよびのと同じブール値を持つ場合にのみ、等号と一致するCと言われます。はどのクラスのインスタンスでもないことに注意してくださいe1.compareTo(e2) == 0e1.equals(e2)e1e2Cnulle.compareTo(null)NullPointerExceptione.equals(null)false

NPEing の代わりに戻ることについては、.equals()ドキュメントに記載されています。false

null 以外の参照値の場合xx.equals(null)を返す必要がありfalseます。

于 2012-06-26T12:54:46.533 に答える
3

javadocから

この文字列を別のオブジェクトと比較します。オブジェクトが文字列の場合、この関数は compareTo(String) のように動作します。それ以外の場合は、ClassCastException がスローされます (文字列は他の文字列とのみ比較可能であるため)。

ClassCastExceptionただし、null 参照には適切に定義された例外があるため、代わりに NPE がスローされます。

次のコードを実行します。

void do()
{
    String s = null;
    System.out.println(s instanceof String); 
}

false を返します。

于 2012-06-26T12:54:28.970 に答える
1

一般に、Java SE クラス ライブラリのドキュメントにnullは、 が有効なパラメータである場合が明示的に記載されていると理解されています。有効な引数であると言及nullされていない場合、有効な引数ではないこと、および例外がすぐにスローされるか、後でスローされる可能性があると想定する必要があります。

この場合、Comparableインターフェースの javadoc は、nullが の有効なパラメーターではないことを明確に示していますComparable,compareTo。( String.compareTo「Specified by」リンクをクリックすると、javadoc からアクセスできます。)

于 2012-06-26T12:57:52.953 に答える