Сортировка объекта с компаратором дает нулевой указатель

Я пытаюсь отсортировать ArrayList с 3 картами. Я делаю это с компаратором. (это перебор)? Card.getRank() возвращает целое число от 2 до 14. Я совершенно не понимаю, где я ошибаюсь. Я успешно делал это раньше и сравнивал с другим моим кодом, и он кажется таким же. Я был бы очень признателен, если бы кто-то мог пролить свет на это!

public int getHand(Card c1, Card c2, Card c3) {

ArrayList<Card> hand = new ArrayList<Card>();
hand.add(c1);
hand.add(c2);
hand.add(c3);

Collections.sort(hand, new SortCards());

    package com.evorlor.threecardpoker;

    import java.util.Comparator;

    public class SortCards implements Comparator<Card> {

    @Override
    public int compare(Card card1, Card card2) {

        if ((card1.getRank() - card2.getRank()) > 0) {
            return 1;
        }
        if ((card1.getRank() - card2.getRank()) < 0) {
            return -1;
        }
        return 0;

    }

}

ЛОГКАТ:

08-06 18:32:56.155: E/AndroidRuntime(4906): FATAL EXCEPTION: main
08-06 18:32:56.155: E/AndroidRuntime(4906): java.lang.IllegalStateException: Could not execute method of the activity
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.view.View$1.onClick(View.java:3599)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.view.View.performClick(View.java:4204)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.view.View$PerformClick.run(View.java:17355)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.os.Handler.handleCallback(Handler.java:725)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.os.Looper.loop(Looper.java:137)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.lang.reflect.Method.invokeNative(Native Method)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.lang.reflect.Method.invoke(Method.java:511)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at dalvik.system.NativeStart.main(Native Method)
08-06 18:32:56.155: E/AndroidRuntime(4906): Caused by: java.lang.reflect.InvocationTargetException
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.lang.reflect.Method.invokeNative(Native Method)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.lang.reflect.Method.invoke(Method.java:511)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at android.view.View$1.onClick(View.java:3594)
08-06 18:32:56.155: E/AndroidRuntime(4906):     ... 11 more
08-06 18:32:56.155: E/AndroidRuntime(4906): Caused by: java.lang.NullPointerException
08-06 18:32:56.155: E/AndroidRuntime(4906):     at com.evorlor.threecardpoker.SortCards.compare(SortCards.java:10)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at com.evorlor.threecardpoker.SortCards.compare(SortCards.java:1)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.util.TimSort.countRunAndMakeAscending(TimSort.java:320)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.util.TimSort.sort(TimSort.java:185)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.util.TimSort.sort(TimSort.java:169)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.util.Arrays.sort(Arrays.java:2038)
08-06 18:32:56.155: E/AndroidRuntime(4906):     at java.util.Collections.sort(Collections.java:1891)

package com.evorlor.threecardpoker;

public class Card {
    private int rank;
    private char suit;

    public Card(int rank, char suit) {
        super();
        this.rank = rank;
        this.suit = suit;
    }

    public int getRank() {
        return rank;
    }

    public char getSuit() {
        return suit;
    }

}

person Evorlor    schedule 06.08.2013    source источник
comment
посмотреть, что является нулевым в компараторе   -  person jmj    schedule 07.08.2013
comment
Можем ли мы увидеть код для Card?   -  person tbodt    schedule 07.08.2013
comment
В таком случае вы уверены, что не передаете null в getHand?   -  person Dennis Meng    schedule 07.08.2013
comment
Ух ты. это смущает. я никогда не создавал (верное слово?) Карту   -  person Evorlor    schedule 07.08.2013
comment
Либо один из ваших объектов Card имеет значение null, либо один из них возвращает значение null из getRank(). Я настоятельно рекомендую вам научиться пользоваться отладчиком.   -  person Dawood ibn Kareem    schedule 07.08.2013
comment
Карта была нулевой. извините за потраченное время на это. не знаю, как я забыл это сделать. опередил себя   -  person Evorlor    schedule 07.08.2013
comment
@Evorlor Пожалуйста, ПРИМИТЕ ответ, если он решил вашу проблему   -  person Jaffar Ramay    schedule 07.08.2013


Ответы (2)


Один из способов предотвратить это в будущем — выполнить нулевую проверку. При программировании вы хотите быть уверены, что справляетесь с такими ситуациями. Один из способов может выглядеть так:

public int getHand(Card c1, Card c2, Card c3) {

    if((c1 != null) && (c2 != null) && (c3 != null)){
        ArrayList<Card> hand = new ArrayList<Card>();
        hand.add(c1);
        hand.add(c2);
        hand.add(c3);

        Collections.sort(hand, new SortCards());
    }else{
        #handle your null card situation here
        System.out.println("One or more card is null");
    }
}
person BlackHatSamurai    schedule 07.08.2013

Одна или несколько карт, переданных getHand(Card c1, Card c2, Card c3), являются нулевыми. Вы можете поместить проверку утверждения в первую строку getHand(Card c1, Card c2, Card c3), как показано ниже.

Assert.notNull(c1, "Card 1 is null");
Assert.notNull(c2, "Card 2 is null");
Assert.notNull(c3, "Card 3 is null");

OR

Выполните его в отладчике, установив точку останова на getHand(Card c1, Card c2, Card c3)

person Jaffar Ramay    schedule 06.08.2013
comment
Возможно, вы захотите отредактировать это, учитывая новую информацию; теперь совершенно ясно, что проблема не в getRank - person Dennis Meng; 07.08.2013
comment
@DennisMeng Спасибо, я отредактировал и улучшил свой ответ. Я надеюсь, что это поможет вам. - person Jaffar Ramay; 07.08.2013
comment
Утвердить - не лучший вариант. Если утверждение неверно, оно убьет приложение. - person BlackHatSamurai; 07.08.2013
comment
@Blaine, вот почему я сказал ИЛИ проверить это в отладчике :) - person Jaffar Ramay; 07.08.2013
comment
@JaffarRamay Я знал проблему; или, по крайней мере, я спросил в предыдущем комментарии, было ли это значение null Card. Я просто решил убедиться, что вы увидели новую информацию до того, как начнут поступать отрицательные голоса. - person Dennis Meng; 07.08.2013
comment
Я думаю, вы упускаете суть. Хороший код не рухнет при возникновении определенной ситуации. Использование утверждений не решит проблему, а вызовет еще больше. Использование отладчика на самом деле тоже не решает проблему, это как бы само собой разумеющееся. - person BlackHatSamurai; 07.08.2013