Sorting Object with Comparator gives Null Pointer

旧街凉风 提交于 2020-01-14 12:46:26

问题


I am trying sort the ArrayList with 3 Card in it. I am doing this with a Comparator. (Is this overkill)? Card.getRank() returns an integer between 2 and 14. I have absolutely no idea where I am going wrong. I have done this successfully before, and compared with my other code, and it seems the same. I would greatly appreciate if someone could spread some light on this!

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;
    }

}

回答1:


One way you can keep this from happening in the future, is to do a null check. When coding, you want to be sure you handle situations like this. One way might look like:

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");
    }
}



回答2:


One/More cards passed to getHand(Card c1, Card c2, Card c3) are null You can put assertion check in the first line of getHand(Card c1, Card c2, Card c3) like below

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

OR

Execute it in a debugger while having a breakpoint at getHand(Card c1, Card c2, Card c3)



来源:https://stackoverflow.com/questions/18091867/sorting-object-with-comparator-gives-null-pointer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!