Java 空异常错误,是OOP的新错误

Java 空异常错误,是OOP的新错误,java,oop,nullpointerexception,Java,Oop,Nullpointerexception,我正在用java编写一个GoFish游戏,在我编写的take turn方法中,我收到一个空异常错误,我知道这意味着我有一个空对象 当浏览我的代码时,我不明白为什么会出现这种情况。当我向用户询问玩家的号码时,它会创建该号码。那么为什么我会得到一个空的错误呢 if((P.cardsInHand[P.getnumCardsInHand()].getRank()) == rank){ return P; } private Pl

我正在用java编写一个GoFish游戏,在我编写的take turn方法中,我收到一个空异常错误,我知道这意味着我有一个空对象

当浏览我的代码时,我不明白为什么会出现这种情况。当我向用户询问玩家的号码时,它会创建该号码。那么为什么我会得到一个空的错误呢

if((P.cardsInHand[P.getnumCardsInHand()].getRank()) == rank){
                    return P;
                }


private Player[] numPlayers;
int playerName;
int requestedcard;
public void numPlayers(){
        Scanner input = new Scanner(System.in);
        System.out.println("How many players want to play");
        numPlayer = input.nextInt();

        if((numPlayer < 2) || (numPlayer > 6)){
            System.out.println("How many players want to play");
            numPlayer = input.nextInt();
        }
        numPlayers = new Player[numPlayer];

        for (int i = 0; i <  numPlayer; i++){

            System.out.println("Player Number(Start with 0)");
            playerName = input.nextInt();
            numPlayers[i] = new Player(playerName);
        }
        requestedPlayer = numPlayers[0];
    }

     public Player taketurn(Player P){
         previousPlayer = P;
         System.out.println(P);
        //set up scanner
        Scanner input = new Scanner(System.in);
        //declare variables
        int player;
        int rank;
        int numMatches = 0;
        System.out.println("Player " + previousPlayer.getnumplayerNumber() + " turn");
        //Player P ask what player cars it want to sk for
        System.out.println("what Player Do you want to ask");
        player = input.nextInt();
        if(player > numPlayer){
            System.out.println("what Player Do you want to ask");
            player = input.nextInt();
        }
        //data type of Player is set to the player that Play P requested
        requestedPlayer = numPlayers[player];
        //request card
        System.out.println("What rank do you want(2-10 = the corresponding number rank on the card, 11 = jack, 12 = queen, 13 = king, 14 = ace)");
        rank = input.nextInt();


        for(int i = 1; i < (requestedPlayer.getnumCardsInHand()); i++){
            if((requestedPlayer.cardsInHand[i].getRank()) == rank){
                // if requested rank == to the player that was aksed for the card
                //the card will be transfered and removed from hand
                requestedPlayer.cardsInHand[i].test1();
                System.out.println("Card of rank " + rank + " are being transfered");
                //requestedPlayer.cardsInHand[i].test();
                for(int j = 1; j < (requestedPlayer.getnumCardsInHand()); j++){
                    P.transfercard(i, requestedPlayer);
                    requestedPlayer.removeCard(i);
                }


                P.findBooks();
                return P;
            }else{
                //place draw in paremters
                System.out.println("Go Fish");
                P.addCard(d.draw());
                if((P.cardsInHand[P.getnumCardsInHand()].getRank()) == rank){
                    return P;
                }else{
                    System.out.println("Requested Players turn");
                    return (requestedPlayer);
                }
            }
        }  
        return requestedPlayer;
    }
if((P.cardsInHand[P.getnumCardsInHand()].getRank())==rank){
返回P;
}
私人玩家[]个玩家;
int playerName;
int请求卡;
公众人士(){
扫描仪输入=新扫描仪(System.in);
System.out.println(“有多少玩家想要玩”);
numlayer=input.nextInt();
如果((numlayer<2)| |(numlayer>6)){
System.out.println(“有多少玩家想要玩”);
numlayer=input.nextInt();
}
numPlayers=新玩家[numPlayer];
对于(int i=0;i玩家){
System.out.println(“你想问哪个玩家”);
player=input.nextInt();
}
//播放器的数据类型设置为播放P请求的播放器
requestedPlayer=numPlayers[player];
//申请卡
System.out.println(“你想要什么等级(2-10=卡片上对应的数字等级,11=杰克,12=女王,13=国王,14=王牌)”);
rank=input.nextInt();
对于(int i=1;i<(requestedPlayer.getnumCardsInHand());i++){
if((requestedPlayer.cardsInHand[i].getRank())==rank){
//如果要求排名==给获得该卡的玩家
//该卡将被转移并从手中移除
requestedPlayer.cardsInHand[i].test1();
System.out.println(“等级卡”+等级卡+”正在被转移);
//requestedPlayer.cardsInHand[i].test();
对于(int j=1;j<(requestedPlayer.getnumCardsInHand());j++){
P.转让卡(i,请求的玩家);
请求的播放器。移除卡片(i);
}
P.findBooks();
返回P;
}否则{
//在paremters中放置draw
System.out.println(“钓鱼”);
P.addCard(d.draw());
if((P.cardsInHand[P.getnumCardsInHand()].getRank())==rank){
返回P;
}否则{
System.out.println(“请求的玩家回合”);
返回(requestedPlayer);
}
}
}  
返回请求的播放器;
}

如果
p.cardsInHand
是一个包含25个元素的数组,但只使用前5个元素,则元素
p.cardsInHand[0]
p.cardsInHand[1]
P.cardsInHand[4]
将具有值,但
P.cardsInHand[5]
可能为
null
。如果
getnumCardsInHand()
返回5,则数组元素将为
null
,这将导致
NullPointerException
。使用
P.getnumCardsInHand()-1


由于Java(以及C和许多其他语言)中的数组从0开始编制索引,这意味着如果要访问数组的最后一个元素(或者,在您的情况下,最后一个“使用”的元素),则需要从给出元素数的任何值中减去1(例如
a.length
对于数组,
a.size()
用于
阵列列表
,或者在您的情况下
P.getnumCardsInHand()
)。

请提供更多信息。类似于异常发生的那一行。如果((P.cardsInHand[P.getnumCardsInHand()].getRank())==rank){return P;}这是我用来编写代码的程序中的第88行,则会发生异常。你可以附加文档吗?如果我也可以附加player类,可能更容易解释。然后
P
为null或
P.cardsInHand[P.getnumCardsInHand()]
返回null。。或者
P.getnumCardsInHand()
在引发异常时返回null,
P.getnumCardsInHand()的值是多少?
P.cardsInHand[]
中有多少元素?哪个方法调用taketurn方法?感谢它从现在起提供了更多。