我最近发布了一个有关在每次调用对象数组时获取NullPointerException的问题。我将问题追溯到提供数据的主要方法与接收数据的相关方法(Team.sortPlayers())之间存在某种脱节的情况。

public class Project3 {


public static void main(String[] args) {
Input3 input = new Input3();
Team teams[] = new Team[input.NUMBER_OF_TEAMS];
Player players[] = new Player[input.NUMBER_OF_PLAYERS];
String playas[] = new String[input.NUMBER_OF_PLAYERS];
String temp;
String name;

for ( int i=0 ; i<input.NUMBER_OF_TEAMS ; i++ ) {
    name = input.getNextString();
    System.out.println(name);
    for ( int j=0 ; j<input.NUMBER_OF_PLAYERS ; j++ )
    {playas[j] = input.getNextString();
        System.out.println(playas[j]);}
    teams[i] = new Team(name, playas); //THIS LINE SENDS OVER THE DATA TO THE QUESTIONABLE METHOD
    teams[i].sortPlayers();
    System.out.println(teams[i]);
    }
}
}

//------------------------------
//
//------------------------------

class Player {

public String[] name;

public Player(String inputname) {

    name = inputname.split(" ");

}
public String[] getName() {
    return name;
}

public String getFirstName() {
    return name[0];
}

public String getLastName() {
    String last = name[1];
    return last;
}
}

//-----------------------
//
//-----------------------

class Team {
private String teamname;
public Player players[];
public Player temp;

public Team(String inputname, String plays[]) { //THIS METHOD RECEIVES A NULL FOR 'INPUTNAME' AND WHAT APPEARS TO BE A JIBBERISH (ex: Player@5bdf59bd, maybe a memory address?) FOR 'PLAYS[]'

    inputname = teamname;
    System.out.println(teamname);
    players = new Player [plays.length];
    for( int k=0 ; k<plays.length ; k++ )
    {   System.out.println(inputname);
        this.players[k] = new Player(plays[k]);
    System.out.println(players[k]);
    }

}

public void sortPlayers() {
    int n = players.length;

    for (int pass=1; pass < n; pass++){
        for (int i=0; i < n-pass; i++) {
            String playerName = players[i].getLastName();
            String nextPlayerName = players[i+1].getLastName();
            if(playerName.compareTo(nextPlayerName) > 0)
            temp = players[i];
        players[i] = players[i+1];
        players[i+1] =  temp;
        }
    }
}
}


如果有人可以帮助我弄清楚这里发生了什么,我将非常感谢!我已经用注释标记了这两个有问题的语句,可以在下面找到这两个语句的PasteBin:
http://pastebin.com/QGALKbP6

最佳答案

“ temp”不应是成员变量,它应该是sort方法中if块的局部变量。并且,因为如果范围扩大了,由于“ if”块缺少一些花括号,您无意中清除了播放器数组的某些成员。

        if(playerName.compareTo(nextPlayerName) > 0) {
          Player temp = players[i];
          players[i] = players[i+1];
          players[i+1] =  temp;
        }


通常,即使在某些情况下花括号是可选的,您也应始终使用它们以避免此类细微的错误。

10-02 06:41
查看更多