2013-04-19 9 views
1

플레이어를 게임에서 제거해야 할 때 호출되는 메서드입니다. 이 두 가지 방법은 서로 다른 클래스에 있습니다.NullPointerException 해결할 수 없습니다.

GameboardGUI 클래스

Vector<Player> players = new Vector<Player>(); 

    public void removePlayerFromGame(Player playerToRemove) 
     { 
      //go through the playerToRemove's properties and reset all their variables 
      for(int i = 0; i < playerToRemove.getPropertiesOwned().size(); i++) 
      { 
       //code to reset the player's properties to an unowned/unmodified state 
      } 
      //same with transports 
      for(int i = 0; i < playerToRemove.getTransportsOwned().size(); i++) 
      { 
       //code to reset the player's transports to an unowned/unmodified state 
      } 
      //just updating the vector based on the playerToRemove's position 
      if(players.get(0) == playerToRemove) 
      { 
       players.remove(playerToRemove); 
       updatePlayerInformation(); 
      } 
      else 
      { 
       players.remove(playerToRemove); 
       updatePlayerVector(players); 
       updatePlayerInformation(); 
      } 

     } 

이 메소드가 호출하는 방법입니다 : 현재 플레이어 (FROMME) 속성에 토지와 임대료를 지불 할 기운이 (즉, 자신의 균형이 0에 도달하면 현재 1200 하드 코딩 takefrombalance(1200);의 결과는 그들이 if 문 if(fromMe.isBankrupt())

재산권 클래스

에서 제거) 테스트를 쉽게하기 여기
GameboardGUI gui = new GameboardGUI(); 

public void payRent(Player fromMe, Player toYou, int rent) 
    { 
     //remove rent from the current player 
     fromMe.takeFromBalance(1200); 
     //add it to the owner 
     toYou.addToBalance(rent); 
     GameboardGUI.addGameFeedMessage(fromMe.getName() + " has paid " + rent + " in rent to " + toYou.getName()); 
     GameboardGUI.addGameFeedMessage(toYou.getName() + "'s balance is now " + toYou.getBalance()); 
     if(fromMe.isBankrupt()) 
     { 
      //THIS IS THE CALL THAT THROWS THE NullPointerException 
      gui.removePlayerFromGame(fromMe); 
     } 
     else 
     { 
      GameboardGUI.addGameFeedMessage(fromMe.getName() + "'s balance is now " + fromMe.getBalance()); 
     } 
    } 

라인에 도달하면 스택 추적입니다 :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at PropertyTile.payRent(PropertyTile.java:254) 
    at PropertyTile.landedOnProperty(PropertyTile.java:239) 
    at GameboardGUI.playerHasLanded(GameboardGUI.java:1905) 
    at Player.setPosition(Player.java:82) 
    at Player.movePlayer(Player.java:101) 
    at GameboardGUI$11.actionPerformed(GameboardGUI.java:1536) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
+0

기본적으로 메서드 호출 gui.removePlayerFromGame (fromMe); 렌트를 지불 할 여력이 없어서 게임에서 '나에게서'플레이어를 제거하는 것입니다. 그것은 그 라인에 대해 널 포인터 예외를 던집니다. 나는 이유를 알 수 없다. 그 방법과 관련된 유일한 코드입니다. – IEatSandvich

+0

디버깅을 시도 했습니까?, GUI는 어디에 정의되어 있습니까? – DGomez

+0

@IEatSandvich Stack Trace please? 'gui'는 어디에 있습니까? 나는 클래스 클래스의 어느 곳에서도 그것을 보지 못한다. – Smit

답변

1

그것은 의 정말 스택 트레이스 내 및 코드의 줄 번호없이 당신을 도울 하드,하지만 우리가 노력하고 있습니다.

실제적으로 회선 (실제로는 removePlayerFromGame 내에 있지 않음) 인 경우 gui 구성원이 초기화되지 않았습니다.

물론 그 행이 아니라면 playerToRemove이 null 일 수 있으며 NullPointerException이 실제로 두 줄 이상 발생합니다.

가 아니면, 또 다른 가능성은 가능성이 가장 높은 경우는 playerToRemove가 제대로 설정되지 않았 음을 인 경우에, removePlayerFromGame 내에서 무슨 일이 일어나고 있다는 것입니다 - 그 getPropertiesOwned() 또는 getTransportsOwned() 방법은 null이 반환됩니다.

+0

되었습니다. 클래스의 맨 위에 초기화되었습니다 GameboardGUI gui = new GameboardGUI(); (그러나 나는 미안하다.) – IEatSandvich

+0

과 GameboardGUI 클래스에있는'players'는'Vector players; – IEatSandvich

+0

입니다. 몇 사람이 코드를 읽었으므로 아무도 코드를 구문 적으로 잘못 볼 수는 없습니다. 누군가가 문제가 무엇인지 알 수 있기를 바랬습니다. – IEatSandvich

0

나는 어떻게되는지 첫 번째 단계로, 다음 두 줄을 추가합니다 : 두 개의 객체 참조의

if(fromMe==null) 
System.out.println("from me is null"); 

if(gui == null) 
System.out.println("gui is null"); 

gui.removePlayerFromGame(fromMe); 

하나는 예외를 발생 null입니다. 그렇지 않으면 removePlayerFromGame 메서드가 뭔가를하고 있지만 stacktrace에 추가 메서드가 포함되어 있기 때문에 그렇게 생각하지 않습니다.

+0

둘 중 하나도 null입니다 :/ – IEatSandvich

+0

매번 또는 때때로 스택 추적/오류가 발생합니까? 버튼을 두 번 클릭하면 어떨까요? –

+0

계속 받으십시오. 전에 코드를 삭제하고 다시 입력하면 작업이 끝납니다. 완전히 다시 쓸 수도 있습니다. 약간 다르게하십시오. 그것이 다른 방식으로 작동하는지 확인하십시오. 모두에게 감사드립니다. – IEatSandvich

0

당신은 (당신이

gui.removePlayerFromGame(fromMe); 

그러나 선, 당신이 Player.movePlayer()입니다 보이고있다 스택 트레이스의 상단에 도달 할 때 예외가 PropertyTile.payRent에서 바닥으로 발생되는 코드에서 말하는).

이 payRent()는 매개 변수를 수신합니까? 소스를 게시 할 수 있습니까?

관련 문제