2013-04-05 45 views
0

擺脫IndexOutOfBoundsException異常,當我開始我的服務器和客戶端連接到它,我得到這個錯誤:如何從ArrayList中

Waiting for clients ... 
Client connected from: Driton PC 
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 

我不太明白爲什麼會這樣,當我陸續從都遵循互聯網和他的榜樣工程和我的不

public class ChatServer { 

public static ArrayList<Socket> ConnectionArray = new ArrayList<Socket>(); 

public static ArrayList<String> CurrentUsers = new ArrayList<String>(); 

public static void main(String[] args) throws IOException{ 
    try 
    { 
     final int PORT = 444; 
     ServerSocket SERVER = new ServerSocket(PORT); 
     System.out.println("Waiting for clients..."); 

     while(true) 
     { 
      Socket SOCK = SERVER.accept(); 
      ConnectionArray.add(SOCK); 
      System.out.println("Client connected from: "+ SOCK.getLocalAddress().getHostName()); 
      AddUserName(SOCK); 
      Chat_Server_Return CHAT = new Chat_Server_Return(SOCK); 
      Thread x = new Thread(CHAT); 
      x.start(); 
     } 
    } 
     catch(Exception x){System.out.println(x);} 
} 

public static void AddUserName(Socket X) throws IOException 
{ 
    Scanner INPUT = new Scanner(X.getInputStream()); 
    String UserName = INPUT.nextLine(); 
    CurrentUsers.add(UserName); 
    for(int i = 1; 1 <= ChatServer.ConnectionArray.size(); i++){ 
     Socket TEMP_SOCK = (Socket) ChatServer.ConnectionArray.get(i-1); 
     PrintWriter OUT = new PrintWriter(TEMP_SOCK.getOutputStream()); 
     OUT.println("#?!"+ CurrentUsers); 
     OUT.flush(); 

    } 
} 

它運行for循環兩次。

+1

'i'需要在0開始,不是1,for條件應該是'i 2013-04-05 18:18:12

+0

@SotiriosDelimanolis - 但是,在循環內部,OP使用'i-1'來索引ArrayList。 – 2013-04-05 18:22:53

+0

@SotiriosDelimanolis - 改變循環條件爲'我<= ...'而不是'1 <= ...'修復問題。我的評論是關於從0開始到'i <...'結束的。這是不必要的,因爲OP在循環中使用'i-1'。如果你在不改變get(i-1)到get(i)'的情況下改變循環限制,你將在第一次迭代中得到一個索引錯誤。 – 2013-04-05 18:27:08

回答

0

輕鬆執行數組長度檢查。

java.lang.IndexOutOfBoundsException訪問集合而非數組時實際拋出。

這種異常有一種已知的ArrayIndexOutOfBoundsException這是相似的,但解決相同的目的只是使用檢查集合的大小,以確保你沒有脫離它的賞金。

5

如果什麼都不刪除,則for循環的條件不正確。更改爲:

i <= ChatServer.ConnectionArray.size() 

但處理一個for循環是遵循基於0的索引,後來減去一個常規的方法:

for(int i = 0; i < ChatServer.ConnectionArray.size(); i++){ 
    Socket TEMP_SOCK = (Socket) ChatServer.ConnectionArray.get(i); 
+0

這並不能解釋例外; OP正在調用'get(i-1)',而不是'get(i)'。循環限制似乎是正確的。 – 2013-04-05 18:20:40

+0

@Ted Hopp是的。這是一個無限循環,因爲大概集合的大小永遠不會低於1.最終代碼運行結束,因爲1(一)總是小於或等於集合大小。 – rgettman 2013-04-05 18:23:03

+0

@SotiriosDelimanolis - 明白了。我沒看到這個錯字。 – 2013-04-05 18:24:31