2011-06-06 123 views
0
game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 

我們正在製作一個客戶端 - 服務器賽車遊戲,我們在這個確切的線路中得到了這個例外,我們可以做什麼或者我們可以改變什麼?在這裏,我會告訴你的所有代碼:指數範圍異常

package speedrace.client; 

import static speedrace.common.Config.*; 

import speedrace.common.*; 
import speedrace.game.Car; 
import speedrace.game.CarGame; 
import speedrace.game.Player; 

import java.awt.geom.Point2D; 
import java.awt.geom.Point2D.Float; 
import java.rmi.*; 
import java.rmi.server.*; 
import java.util.ArrayList; 
import java.util.Vector; 

import javax.swing.*; 

public class SpeedRaceClientController extends UnicastRemoteObject implements 
     RaceObserver, RaceUpdate 
{ 
    private RaceSubject serverGet; 
    private RaceUpdate serverSet; 
    private SpeedRaceClientView view; 

    private int clientID = 0; 
    private Player currentPlayer = null; 
    private CarGame game = new CarGame(); 

    public SpeedRaceClientController() throws Exception 
    { 
     super(); 
     game.setVisible(false); 
    } 

    @Override 
    public Player getCurrentPlayer() throws RemoteException 
    { 
     return currentPlayer; 
    } 

    @Override 
    public void setCurrentPlayer(Player currentPlayer) throws RemoteException 
    { 
     this.currentPlayer = currentPlayer; 

    } 

    @Override 
    public int getClientID() 
    { 
     return clientID; 
    } 

    @Override 
    public void setClientID(int clientID) 
    { 
     this.clientID = clientID; 
    } 

    @Override 
    public CarGame getGame() 
    { 
     return game; 
    } 

    @Override 
    public void setGame(CarGame game) 
    { 
     this.game = game; 
    } 

    public void begin(SpeedRaceClientView view) 
    { 
     this.view = view; 

     try 
     { 
      String ip = view.inputIP(); 
      String URL = "rmi://" + ip + "/" + SERVICE; 

      serverSet = (RaceUpdate) Naming.lookup(URL); 
      serverGet = (RaceSubject) Naming.lookup(URL); 

      serverGet.attach(this); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
      view.error("Trouble connecting to server"); 

      System.exit(1); 
     } 
    } 

    @Override 
    public void updatePlayerList(Vector<Player> playersList) 
      throws RemoteException 
    { 
     view.showOnlinePlayers(playersList); 

    } 

    @Override 
    public void registerNewPlayer(Player player, int clientID) 
      throws RemoteException 
    { 
     try 
     { 
      serverSet.registerNewPlayer(player, clientID); 
     } 
     catch (RemoteException ex) 
     { 
      ex.printStackTrace(); 
      view 
        .error("Trouble connecting to server. Please restart the server."); 
      System.exit(1); 
     } 

    } 

    @Override 
    public void startGame() throws RemoteException 
    { 

     try 
     { 
      serverSet.startGame(); 

     } 

     catch (RemoteException re) 
     { 
      re.printStackTrace(); 
      view 
        .error("Trouble connecting to server. Please restart the server."); 
      System.exit(1); 
     } 
    } 

    @Override 
    public void startTheGame(ArrayList<Point2D.Float> positions, 
      Vector<RaceObserver> observers) throws RemoteException 
    { 

     switch (clientID) 
     { 
      case 1: 
       game.updatePosition(273, 471); 
       break; 
      case 2: 
       game.updatePosition(315, 408); 
       break; 
      case 3: 
       game.updatePosition(353, 471); 
       break; 
      case 4: 
       game.updatePosition(395, 408); 
       break; 
      case 5: 
       game.updatePosition(433, 471); 
       break; 
      case 6: 
       game.updatePosition(475, 408); 
       break; 
      case 7: 
       game.updatePosition(513, 471); 
       break; 
      case 8: 
       game.updatePosition(555, 408); 
       break; 
     } 

     for (int i = 1; i < observers.size(); i++) 
     { 
      game.getS().getVehicles().add(
        new Car(getClass().getResource(
          "/speedrace/game/bluecar.png"))); 

      game.getS().getVehicles().get(i).setMass(0.9f); 
      game.getS().getVehicles().get(i).setMaxSteering(500.0f); 
      game.getS().getVehicles().get(i).updateVelocity(80.0f, 0.0f); 
     } 
     updatePosition(clientID, positions); 

     game.setVisible(true); 
     game.getS().requestFocusInWindow(); 
     sendCurrentCarPosition(game.getS().getVehicles().get(0).getPosition(),clientID); 
    } 

    public void updatePosition(int id, ArrayList<Point2D.Float> positions){ 
     if(id==1){ 
      for (int i = 1; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i));    
      } 

     }else if(id==2){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0));    
      for (int i = 2; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==3){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      for (int i = 3; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==4){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      game.getS().getVehicles().get(3).updatePosition(positions.get(2)); 
      for (int i = 4; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==5){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      game.getS().getVehicles().get(3).updatePosition(positions.get(2)); 
      game.getS().getVehicles().get(4).updatePosition(positions.get(3)); 
      for (int i = 5; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==6){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      game.getS().getVehicles().get(3).updatePosition(positions.get(2)); 
      game.getS().getVehicles().get(4).updatePosition(positions.get(3)); 
      game.getS().getVehicles().get(5).updatePosition(positions.get(4)); 
      for (int i = 6; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==7){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      game.getS().getVehicles().get(3).updatePosition(positions.get(2)); 
      game.getS().getVehicles().get(4).updatePosition(positions.get(3)); 
      game.getS().getVehicles().get(5).updatePosition(positions.get(4)); 
      game.getS().getVehicles().get(6).updatePosition(positions.get(5)); 
      for (int i = 7; i < game.getS().getVehicles().size(); i++) 
      { 
       game.getS().getVehicles().get(i).updatePosition(positions.get(i)); 
      } 
     }else if(id==8){ 
      game.getS().getVehicles().get(1).updatePosition(positions.get(0)); 
      game.getS().getVehicles().get(2).updatePosition(positions.get(1)); 
      game.getS().getVehicles().get(3).updatePosition(positions.get(2)); 
      game.getS().getVehicles().get(4).updatePosition(positions.get(3)); 
      game.getS().getVehicles().get(5).updatePosition(positions.get(4)); 
      game.getS().getVehicles().get(6).updatePosition(positions.get(5)); 
      game.getS().getVehicles().get(7).updatePosition(positions.get(6)); 
     } 
    } 

    @Override 
    public void updateCarPosition(ArrayList<Point2D.Float> positions) 
      throws RemoteException 
    { 
     for (int i = 0; i < positions.size(); i++) 
     { 
      System.out.println(i+"= ["+positions.get(i).x+", "+positions.get(i).y+"]");   
     } 
     System.out.println("My clienID is: "+clientID+" my car size is: "+ game.getS().getVehicles().size()); 
     updatePosition(clientID, positions); 

    } 

    @Override 
    public void sendCurrentCarPosition(final Point2D.Float position, final int clientID) throws RemoteException 
    { 

     class UpdateThread implements Runnable 
     { 
      boolean running = true; 
      public void run() 
      { 
       while (running) 
       { 
        try 
        { 
         System.out.println(clientID+" send his position to the server: "+position.x+", "+position.y); 
         serverSet.sendCurrentCarPosition(position, clientID); 
         Thread.sleep(20); 
        } 

        catch (RemoteException re) 
        { 
         re.printStackTrace(); 
         view 
           .error("Trouble connecting to server. Please restart the server."); 
         System.exit(1); 
        } 
        catch (InterruptedException e) 
        { 
         e.printStackTrace(); 
         view 
           .error("Trouble connecting to server. Please restart the server."); 
         System.exit(1); 
        } 
       } 
      } 
     } 
     final UpdateThread t = new UpdateThread(); 
     new Thread(t).start(); 
    } 



} 
+0

這看起來非常像我剛剛看到的另一個線程。您的問題已在這裏得到解答:http://stackoverflow.com/questions/6251760/strange-exception – Kaj 2011-06-06 12:33:11

+2

*確切地說,這行*在您的代碼中出現7次... – 2011-06-06 12:39:02

+0

*我們可以改變什麼*? - 使用局部變量而不是那些「鏈接」表達式。你的代碼是接近不可讀的... – 2011-06-06 12:41:50

回答

0

在for循環中,您幾乎總是從1開始。是正確的嗎?

爲了讓我們找到問題,我想你應該發佈更多的代碼。

+0

@弗拉季斯拉夫波格丹諾夫:您將此標記爲正確答案。有什麼問題? – 2011-06-06 13:28:16

0

無論是positions有0個元素或game.getS().getVehicles()具有<2元素。測試這些條件並採取適當的行動。

+0

無論如何,我得到的錯誤是不同的它是我的錯誤抱歉 – 2011-06-06 12:39:38

+0

位置的大小總是8,game.getS()。getVehicles()的大小是連接的觀察者的數量。在我們的測試案例中,它始終是2.所以這個IndexOutOfBounds Exception沒有任何理由。還有一件事。編譯器在客戶端1中刪除此異常,但是該行的代碼被if,else-if語句限制爲client2,並且客戶端1不能看到它。PLease help。 – 2011-06-06 12:51:09