1

これは、プレーヤーをゲームから削除する必要があるときに呼び出されるメソッドです。これらのメソッドは両方とも異なるクラスにあります。

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 に達しtakefrombalance(1200);、現在はテストを容易にするために 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)
4

3 に答える 3

1

スタック トレースとコードの行番号なしでサポートするのは非常に困難ですが、私たちは努力しています。

それが実際に行である (実際には 内にないremovePlayerFromGame) 場合、メンバーguiは初期化されていません。

もちろん、それがその行でない場合は、単にplayerToRemovenull である可能性があり、NullPointerException は実際には数行上で発生しています。

または、別の可能性として、 内removePlayerFromGameで発生している可能性があります。この場合、最も可能性の高いケースは、playerToRemove適切に設定されていないことです。つまり、そのgetPropertiesOwned()またはgetTransportsOwned()メソッドが null を返しています。

于 2013-04-19T19:46:33.173 に答える
0

コードで、行に到達すると例外がスローされると言います

gui.removePlayerFromGame(fromMe);

ただし、表示しているスタックトレースの上部は Player.movePlayer() で、下部は PropertyTile.payRent() です。

この payRent() はパラメータを受け取っていますか? ソースを投稿できますか?

于 2013-04-19T21:51:17.223 に答える
0

何が起こるかを確認するための最初のステップとして、次の 2 行を追加します。

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

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

gui.removePlayerFromGame(fromMe);

2 つのオブジェクト参照の 1 つが null であり、例外が発生します。それ以外の場合、removePlayerFromGame メソッドは何かを実行していますが、スタックトレースに追加のメソッドが含まれているため、そうではないと思います。

于 2013-04-19T20:48:38.603 に答える