-3

我正在做分解练习。这是情况。我有一个由多个部门组成的联盟,而这些部门又由许多由球员组成的团队组成。我有一个类 LeagueStatistics ,它有一个方法 getAveAgeOfTeam ,其中团队的名称作为参数中的字符串传递。我遇到的问题是我为 Test 类中的对象设置的值在 LeagueStatistics 类中没有被识别,即使它们已在它所组成的相关类中设置。它返回的值是 0。我认为这是因为我在 LeagueStatistics 类中创建了联赛、分区等对象的新实例,但是如果我不在这里创建新实例,那么我会得到一个空指针异常。我不知道为什么它不工作,所以任何帮助表示赞赏!

public class LeagueStatistics {

private static LeagueStatistics instance;
private int numDivisions;
private int numTeams;
private double aveGoalsForDivision;
private double aveGoalsForTeam;
private double aveAgeOfTeam;

private League league=new League();
private Division division=new Division();
private Team team=new Team();
private Player player=new Player();

public LeagueStatistics() {
}

public static LeagueStatistics getInstance(){
    if (instance==null){
        instance=new LeagueStatistics();
    }
    return instance;
}

public double getAveAgeOfTeam(String teamName){
    ArrayList<Team> myList = new ArrayList<Team>();

    *************************************************   
    for (int i=0; i<division.getNumTeams();i++){
        team=division.getTeamList().get(i);
        if (team.equals(teamName)){
        myList.add(team);
        }   

        ArrayList<Player> myPlayerList=new ArrayList<Player>();

        for (int j=0; j<myList.size(); j++){
            player=team.getPlayerList().get(j);
            myPlayerList.add(player);
        }

        int age=0;
        for(int k=0; k<myPlayerList.size(); k++){
            int playerAge=myPlayerList.get(k).getAge();
            age+=playerAge;
        }

        aveAgeOfTeam=(age/myPlayerList.size());
    }
    return aveAgeOfTeam;

}

public class Tester {

public static void main(String[] args) {

    Player player1=new Player();
    player1.setAge(15);
    player1.setGoals(12);

    Player player2=new Player();
    player2.setAge(19);
    player2.setGoals(6);

    Player player3=new Player();
    player3.setAge(17);
    player3.setGoals(9);

    Player player4=new Player();
    player4.setAge(10);
    player4.setGoals(19);


    Team team1=new Team();
    team1.setTeamName("Team1");
    team1.setTrophies(2);

    Team team2=new Team();
    team2.setTeamName("Team2");
    team2.setTrophies(3);

    Team team3=new Team();
    team3.setTeamName("Team3");
    team3.setTrophies(1);

    ArrayList<Player> ListOfPlayers=new ArrayList<Player>();
    ListOfPlayers.add(player1);
    ListOfPlayers.add(player2);
    team1.setPlayerList(ListOfPlayers);

    ArrayList<Player> ListOfPlayers2=new ArrayList<Player>();
    ListOfPlayers2.add(player3);
    team2.setPlayerList(ListOfPlayers2);

    ArrayList<Player> ListOfPlayers3=new ArrayList<Player>();
    ListOfPlayers3.add(player4);
    team3.setPlayerList(ListOfPlayers3);

    Division division1=new Division();
    division1.setDivisionName("Division1");

    Division division2=new Division();
    division2.setDivisionName("Division2");

    ArrayList<Team> ListOfTeams=new ArrayList<Team>();
    ListOfTeams.add(team1);
    ListOfTeams.add(team2);
    division1.setTeamList(ListOfTeams);

    ArrayList<Team> ListOfTeams2=new ArrayList<Team>();
    ListOfTeams2.add(team3);
    division2.setTeamList(ListOfTeams2);

    League league=new League();
    league.setLeagueName("Premier");

    ArrayList<Division> ListOfDivisions=new ArrayList<Division>();
    ListOfDivisions.add(division1);
    ListOfDivisions.add(division2);

    league.setDivisionList(ListOfDivisions);

    Double avgAge=LeagueStatistics.getInstance().getAveAgeOfTeam("Team1");
    System.out.println(avgAge); 


}

   }
4

2 回答 2

1

假设 NPE 发生在这一行(我认为是)

    for (int i=0; i<division.getNumTeams();i++){

它正在发生,因为divisionnull。这是此时抛出 NPE 的唯一可能原因。

而我对你的代码的阅读是你没有初始化它,所以它应该null.

请注意,main创建 2 个Division对象的代码不会初始化division实例变量。仔细看代码。

于 2014-03-22T02:17:13.603 回答
0

条线抛出 NPE?这不仅仅是“for循环”,它是一个特定的行,而且那行非常重要。我猜这是 for 循环的第一行,这是因为除法变量从未初始化。如果是这样,请在使用前对其进行初始化。


更重要的是,您需要了解如何调试 NPE (NullPointerException) 的一般概念。您应该仔细检查抛出它的行,找出哪个变量为空,然后回溯到您的代码以查看原因。你会一次又一次地遇到这些,相信我。

于 2014-03-22T02:13:12.157 回答