LoginSignup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CompareTo() メソッドでStringとNullを比較するとどうなりますか?

Q&AClosed

解決したいこと

CompareTo() メソッドでStringとNullを比較するとどうなりますか?
このコードはListIteratorの学習で使われたコードです。
addInOrder()というメソッドがありこのコードでアルファ別置順に旅行先を並び替えながら入力する事ができます。

アルファベット順に並び替えるためにcompareTo()メソッドを使っています。Stringもユニコードで番号を持っていて比較できると言うことまでは理解しました。
ただ、一つ、疑問に思う事があります。
一番初めに旅行先を入力するとき、このコードですと"Sydney"と入力する時Listは空っぽなのでNullと"Sydney"を比べることになると思うのですが、これはどのように処理をされているのでしょうか?

発生している問題・エラー

エラーは特に発生していません。

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;

public class Demo {
    public static void main(String[] args) {
        LinkedList<String> placesToVisit = new LinkedList<String>();

        addInOrder(placesToVisit, "Sydney");
        addInOrder(placesToVisit, "Melbourne");
        addInOrder(placesToVisit, "Brisbane");
        addInOrder(placesToVisit, "Perth");
        addInOrder(placesToVisit, "Adelaide");
        addInOrder(placesToVisit, "Darwin");

        printList(placesToVisit);

        placesToVisit.add(1, "Alice Springs");
        printList(placesToVisit);

        placesToVisit.remove(4);
        printList(placesToVisit);

    }

    private static void printList(LinkedList<String> Liist) {
        Iterator<String> i = Liist.iterator();
        while (i.hasNext()) {
            System.out.println("Now visiting " + i.next());
        }
        System.out.println("=========================");
    }

    private static boolean addInOrder(LinkedList<String> linkedList, String newCity) {
        ListIterator<String> stringListIterator = linkedList.listIterator();

        while (stringListIterator.hasNext()) {
            int comparison = stringListIterator.next().compareTo(newCity);//39行目
            if (comparison == 0) {
                // equal, do not add
                System.out.println(newCity + " is already included as a destination");
                return false;
            } else if (comparison > 0) { //44行目
                //初めは null-newCity , これはどうなるの?
                // new City should appear before this one
                // Brisbane  -> Adelaide
                stringListIterator.previous();
                stringListIterator.add(newCity);
                return true;
            } else if (comparison < 0) {
                // move on next city
            }
        }
        stringListIterator.add(newCity);
        return true;
    }
}

自分でやってみたこと

以下のコードを書いてテストをしてみました。

public class Main {
   public static void main(String[] args) throws Exception {
       String a=null;
       int comparison = a.compareTo("Sydney");
       System.out.println(comparison);
   }
}

エラーが出ました。

Exception in thread "main" java.lang.NullPointerException
at example.Main.main(Main.java:6)

0

3Answer

String#comparwToメソッドは、Comparable<String>インターフェースに準拠します。
ということで、Comparablejavadocを見ると

nullはいずれのクラスのインスタンスでもないため、e.equals(null)がfalseを返す場合でもe.compareTo(null)はNullPointerExceptionをスローすべきです。

と書かれています。
なので、原則NullPointerExceptionが例外として送出されると認識しておけばよいでしょう。

2

Comments

  1. @Choco_Late

    Questioner
    null と Stringは比較できなんですよね。そう認識しておきます。
    ありがとうございました。

リストが空の時 stringListIterator.hasNext() は false を返します。よってリストに "Sydney" を追加するタイミングでは while (stringListIterator.hasNext()) { ... } は一度も実行されず、 null と String を比較することもありません。

もし比較したらどうなるかは @ktz_alias さんの回答の通りです。

1

Comments

  1. @Choco_Late

    Questioner
    はじめの
    "Sydney"が追加される時は、

    stringListIterator.add(newCity); 

    のコードが使われるんだなった今、理解しました。ありがとうございました。

Your answer might help someone💌