2017-02-28 40 views
1

每當我嘗試使用MainApp類中的userNames列表時,我都會收到IndexOutOfBoundsException。但是,我確定這些名稱是從ServerController類添加到列表中的,因此我不明白爲什麼在另一個類中調用該列表時爲空。爲什麼ArrayList保持爲空而將另一個類中的對象添加到列表中?

我想這可能是一個實例檢查類似問題的SO問題,我一直試圖解決很長一段時間,但我根本無法做到這一點。我真的很感激任何建議,TIA。

這是我的用戶類,其唯一目的是存儲用戶數據,即名稱和ID。

public class User { 

public User() { 
} 

public ArrayList<String> userNames = new ArrayList<>(); 

public ArrayList<String> getUserNames() { 
    return this.userNames; 
    } 
} 

這是我的服務器類:將名稱添加到userNames列表工作正常。

public class ServerController { 

    private final Server server; 
    private final User user; 
    private final GameConfig gameConfig; 

    public ServerController(GameConfig gameConfig) { 
    this.gameConfig = gameConfig; 
    this.server = new Server(); 
    this.user = new User(); 
    } 

    public User getUser() { 
     return user; 
    } 
    private class ServerListener extends Listener { 
    //this is where I add the names to the userNames list 
    @Override 
    public void received(Connection connection, Object obj) { 
     server.sendToAllExceptTCP(connection.getID(), obj); 
     if (obj instanceof String) { 
      final String jp = (String) obj; 
      user.userNames.add(jp); 
     } 
} 

這是我的MainApp:我嘗試訪問存儲在userNames中的用戶的名稱。只要收到的連接正常工作,ServerController就會將名稱添加到列表中,但我在createPlayer方法中遇到了異常。

public class MainApp { 
public User user = new User(); 

public Game createPlayer(){ 

if (("Mitspieler".equals(client1)) && ("Mitspieler".equals(client2)) && ("Mitspieler".equals(bot1))) { 
     for (int i = 0; i < clients.length; i++) { 
    //this is the source of the exception 
      players[i + 1] = createHumanPlayer(user.getUserNames().get(i), i, restColors[i]); 
     } 
} 
    //.... 
} 

堆棧跟蹤:

Exception in thread "JavaFX Application Thread" 
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
at java.util.ArrayList.rangeCheck(ArrayList.java:653) 
at java.util.ArrayList.get(ArrayList.java:429) 
at client.MainApp.createPlayer(MainApp.java:265) 
+2

看起來你有2個不同的'在'ServerController' User'情況下,你的'MainApp'類 – esin88

+0

您的列表'userNames'必須用一些數據調用'createPlayer' – Abubakkar

+0

哪裏是''在之前ServerController'人口MainApp'? – niceman

回答

1

您創建兩個實例。

public class MainApp { 
    public User user = new User(); // Instance 1 
} 

public class ServerController { 
    private User user; 

    public ServerController(GameConfig gameConfig) { 
     this.user = new User(); // Instance 2 
     ... 
    } 
} 

實例1和實例2不共享任何數據。實例1保存您添加的名稱,實例2不包含。

如果您不打算爲你的控制器的多個實例,你可以做類似

public class User { 
    private static User USER; 

    public static User getInstance() { 
     if(null == USER) { 
      USER = new User(); 
     } 
     return USER; 
    } 
} 

public class MainApp { 
    public Game createPlayer() { 
     User user = User.getInstance(); 
     List<String> userNames = user.getUserNames(); 
    } 
} 

User那麼將是一個Singleton。但請注意:如果您有多個ServerController實例,則所有用戶都將使用相同的用戶列表。如果這不是你想要的,你需要初始化ServerControllerMainAppUser相同的實例。

+0

我將如何在MainApp中聲明用戶? 公共用戶用戶; ? 你也介意解釋爲什麼你將這個方法移到ServerController或者它是一個錯誤? – InfoGirl

+0

你是對的,ServerController是一個錯誤。我還澄清了如何訪問單身人士。請按照提供的鏈接瞭解單身人士的做法以及限制條件。 爲什麼你想創建一個類'用戶'?奇怪的是,它擁有多個用戶名。這是所有不同的名字還是同一個用戶的名字?如果它存儲所有名稱,您可以將公共'ArrayList userNames = new ArrayList <>();'移到'MainApp'並刪除'User'。 – cmoetzing

+0

感謝您的鏈接!但有幾個問題: 1.當我嘗試私有靜態最終用戶用戶;我收到錯誤消息,我沒有在默認的構造函數中初始化它,我將如何初始化而不創建另一個實例? 2.我不能從另一個類調用getInstance()方法 - 這是因爲1嗎? – InfoGirl

0

您在兩個地方創建一個User對象。在ServerController中創建併成功將用戶名添加到數組中。然後在MainApp中創建一個User對象,並且它永遠不會有任何用戶名。

相關問題