2015-03-17 5 views
-1

Я не могу обработать эти массивы объектов, я пытаюсь создать список имен игроков с сохраненными значениями, каждый с целым числом и несколькими несколькими строками для каждого.Java - Создание массивов объектов

Это то, над чем я работаю до сих пор, были ли массивы объектов правильными пакетами хранения для этого? Ошибка была в строке 237, когда я пытаюсь добавить игрока в класс addPlayer: player [userCount] .setName (name);

Ошибка: - Исключение в потоке «основной» индекс за пределами границ.

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Scanner; 

public class PlayerKarma { 

    static Scanner input = new Scanner(System.in); 

    static private String[] username = {"name1","name2","test","moretesting","fervor","stackoverflow","imported","quaternion","jetstream"}; 
    static private int[] karma = {1000,800,800,5,15,-4,-403,54,11,210}; 
    static private boolean exit = false; 
    static private int maxKarmaChange = 10; //How much a players karma can change per day. 
    static Player[] userArray = new Player[10000]; 
    //ArrayList<Player> userArray = new ArrayList<Player>(); 
    static private int userCount = 0; 

    public static void main(String[] args) 
    { 
     while (!exit) 
     { 
     System.out.println(""); 
     System.out.println("Select an option"); 
     System.out.println("1: Display a player's karma"); 
     System.out.println("3: Display all player names and karma"); 
     System.out.println("5: Add player"); 

     String command = input.nextLine(); 
     switch(command) 
      { 
      //Display player's karma. 
      case "1": { 
       System.out.println("Enter a player's name: "); 
       String inputString = input.nextLine(); 
       int playerindex = findPlayer(inputString); 

       if (playerindex == -1) 
        { 
        System.out.println("Player doesn't exist"); 
        } 
       else //If the player exists. 
        { 
        System.out.println(userArray[playerindex].getName() + " has a karma of " + karma[userArray[playerindex].getKarma()]); 
        break; 
        } 

       break;} 

      //Display all player names and karma. 
      case "3": {getAllPlayerKarma(); sleep(1500); break;} 

      //Add player. 
      case "5": { 
       System.out.println("Enter a player's name:"); 
       String inputString = input.nextLine(); 

       if (userCount > 0) //If there is at least one user in the database. 
       { 
       int playerindex = findPlayer(inputString); 

       if (playerindex == -1) 
        { 
        addPlayer(inputString,0); 
        } 
       else //If the player exists. 
        { 
        break; 
        } 
       } 
       else //If there's no users. 
       { 
        addPlayer(inputString,0); 
       } 
       break;} 
      } 
     } 
    } 

    //Class creation for players. 
    public class Player 
    { 
     public String name; 
     public int karma; 
     //public String[] notes = new String[5]; 

     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public int getKarma() { 
      return karma; 
     } 
     public void setKarma(int karma) { 
      this.karma = karma; 
     } 
    } 

    private static void getAllPlayerKarma() { 
     System.out.println(""); 
     for (int k = 0; k < userCount; k++) 
     { 
      System.out.println(userArray[k].getName() + " has a karma of " + userArray[k].getKarma()); 
     } 
    } 

    private static void setAllPlayerKarma(String karmaValue) { 
     System.out.println(""); 
     for (int k = 0; k < username.length; k++) 
     { 
      int parseKarma = Integer.parseInt(karmaValue); 
      karma[k] = parseKarma; 
     } 
     System.out.println("All karma has been set to " + karmaValue); 
    } 

    private static void addPlayer(String name, int karma) { 
     //Adds a new user 
     Player[] player = new Player[userCount]; 
     //Player[userCount] = new Player(userCount); 

     player[userCount].setName(name); 
     player[userCount].setKarma(karma); 
     //userArray[userCount].setName(name); 
     //userArray[userCount].setKarma(karma); 
     userCount++; 
    } 

//Returns the index of the player in the database. 
private static int findPlayer(String playerName) { 
    int playerIndex = -1; 

    for (int j = 0; j < userCount; j++) 
    { 
     System.out.println("Testing name: " + playerName + " against " + userArray[j].getName()); 
     if (playerName.equals(userArray[j].getName())) { 
      playerIndex = j; 
      System.out.println("Match"); 
      break; 
     } 
     else 
     { 
      //System.out.println("No match"); 
     } 
    } 
    return playerIndex; 
    } 

private static void sleep(int sleep) { 
    try {Thread.sleep(sleep);} 
    catch(InterruptedException ex) { 
     Thread.currentThread().interrupt();} 
    } 

} 
+1

И ошибка была? – immibis

+0

Что такое ошибка ?? –

+0

Ах, извините, ошибка была: Исключение из потока "main" index out of bounds –

ответ

0

Вы инициализировать UserCount со значением 0 и, следовательно, создать массив с размером 0 Player[] player = new Player[userCount];, это приводит к вашей ошибке.

2

Есть три проблемы с этим кодом:

Player[] player = new Player[userCount]; 
player[userCount].setName(name); 

Во-первых, вы создаете новый массив каждый раз, - я подозреваю, что вы хотите, чтобы заполнить userArray вместо этого.

Во-вторых, вы создаете массив размером userCount, а затем пытаетесь использовать элемент с индексом userCount - это никогда не сработает. Индексы массивов основаны на 0, поэтому элемент с длиной 3 имеет действительные индексы 0, 1 и 2, например.

В-третьих, вы не создаете новый объект Player, поэтому каждый элемент массива имеет значение NULL. Даже если вы зафиксировали индекс, player[x].setKarma(karma) будет кидать NullPointerException.

Я подозреваю, что вы хотите, чтобы способ выглядеть следующим образом:

private static void addPlayer(String name, int karma) { 
    Player player = new Player(); 
    player.setKarma(karma); 
    player.setName(name); 
    userArray[userCount] = player; 
    userCount++; 
} 

Это теперь хорошо, пока количество пользователей не превышает длину вашего массива. В этот момент вы должны начать смотреть на List<E>ArrayList<E> в частности).

+0

Со второй ошибкой я думал, что создаю массив размером 10 000 с: static Player [] userArray = new Player [10000]; Да, я действительно хотел его заполнить. «Игрок игрока = новый игрок (userCount);» не определено после попытки повторного использования вашего кода в качестве руководства, не будет ли здесь userArray, а не userCount? –

+0

@FluidicIce: Да, вы тоже создаете этот массив - но это был не тот, который вы заселяли, - посмотрите на код, который я цитировал. Непонятно, что вы подразумеваете под «не определено». Эта строка вообще не использует массив, она просто создает новый объект и сохраняет ссылку на нее в новой локальной переменной, называемой 'player'. –

+0

@FluidicIce: Ах, я вижу, что случилось. Я копировал вызов конструктора из вашего прокомментированного кода, но оказалось, что он был сломан. У вас нет параметризованного конструктора, поэтому просто вызовите без параметров. –

Смежные вопросы