Сортирането на обект с Comparator дава Null Pointer

Опитвам се да сортирам ArrayList с 3 карти в него. Правя това с Comparator. (Това пресилено ли е)? 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;

    }

}

LOGCAT:

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 Знаех проблема; или поне попитах в по-ранен коментар дали е нула Card. Просто реших, че ще се уверя, че виждате новата информация, преди да започнат да се натрупват гласове против. - person Dennis Meng; 07.08.2013
comment
Мисля, че пропускаш смисъла. Добрият код няма да се срине, когато възникне определена ситуация. Използването на твърдения няма да реши проблема, а ще причини повече. Използването на програма за отстраняване на грешки също не решава проблема, това е нещо като даденост. - person BlackHatSamurai; 07.08.2013