0

次のエラーが表示されるという問題があります。

スレッド「メイン」での例外 java.lang.NullPointerException

com.noxia.Main.startCombat (Main.java:101) で

com.noxia.Area1.createArea1Enemy (Area1.java:43) で

com.noxia.Main.main (Main.java:30) で

変数が null であるため、変数を初期化する必要があることはわかっていますが、どこに何を配置する必要があるのか​​ わかりません。他にも多くの変数やメソッドが省略されているため、関連する部分だけを表示するようにコードを最小化しましたが、これは問題に関係しているようです。どんな助けでも大歓迎です=)

public class Main {
    Player p;
    Enemy e;
    Area1 a1;        

    public static void main(String[] args) {
        Main main = new Main();
        main.a1 = new Area1();            
        main.p = new Player(100);
        //the line directly below this is line 30 where the error occurs
        main.a1.createArea1Enemy(10);
    }

    public void startCombat()
    {
        //the line directly below this is line 101 where the error occurs       
        while (p.getCurrentLife() > 0 & a1.e.getLife() > 0)
        {
            p.playerAttack();
            if (p.getCurrentLife() > 0 & a1.e.getLife() > 0)
            {
                e.enemyAttack();
            }
        }   
    }


public class Player extends Main {
    private int currentLife;

    public int getCurrentLife()
    {
        return currentLife;
    }
    public void setCurrentLife(int cl)
    {
        currentLife = cl;
    }

    public Player(int cl)
    {
        currentLife = cl;
    }


public class Enemy extends Main {
    private int life;

    public int getLife()
    {
        return life;
    }
    public void setLife(int lf)
    {
        life = lf;
    }

    public Enemy (inf lf)
    {
        life = lf;
    }


public class Area1 extends Main {

    public void createArea1Enemy(int enemyCounter)
    {
        while (enemyCounter > 0)
        {
            String[] enemyList = {"Enemy1", "Enemy2"} //code for Enemy2 left out below
            int enemyListLength = enemyList.length; 
            int randomEnemy = (int) (Math.random() * enemyListLength);

            if (enemyList[randomEnemy].equals("Enemy1"))
            {
                Enemy enemy1 = new Enemy("Enemy1", 100);
                //the line directly below this is line 43 where the error occurs
                startCombat();
            }
        enemyCounter--;
        }
    }
}
4

3 に答える 3

3

簡単な答えは、e呼び出す前に敵に設定する必要があるということですstartCombat

しかし、これを行うためのより良い方法は、 を削除し、メソッド パラメーターを使用しeて敵オブジェクトを渡すことです。フィールドは概念的に間違っていますstartCombat。誤りを理解するには、オブジェクトeの状態に関して、それが何を意味するのかについて首尾一貫した説明を考え出すようにしてください。Main


明らかにこれは初心者のコードです...そして、あなたが書いたものには多くの悪い点があります:

  • クラスのフィールドは、パラメーター値をメソッドに渡すためではなく、オブジェクトの状態用である必要があります。
  • メインメソッドのように、クラスの内部にアクセスするコードを書くことは避けるべきです。
  • ベスト プラクティスは、 fields を作成しprivate、外部クラスがそれらにアクセス/変更できるように (必要に応じて) getter および / または setter メソッドを定義することです。
  • パラメーターを使用してコンストラクターを作成する方法を学ぶ必要があります。
  • コードを適切に設計する必要があります。すべてが拡張Mainされるということは、オブジェクトが「意味する」ことの合理的なモデルが存在しないことを意味します。そして、 と の各インスタンスには、 、 、およびフィールドの独自のコピーと、不適切なメソッドが多数含まれるというEnemy問題がありArea1ます。pea1
于 2012-06-24T01:22:36.413 に答える
2

主な問題は、決して初期化しないことですEnemy e;。あなたは敵を作成しますが、それを に割り当てることはありませんthis.e

この行を変更します。

Enemy enemy1 = new Enemy("Enemy1", 100);

これに:

this.e = new Enemy("Enemy1", 100);

コードには他にも多くの問題があります。

于 2012-06-24T01:17:54.197 に答える
1

コンストラクターの正しい書き方を学びましょう。このコードは間違っています。

Play, Area1, andEnemyが Main を拡張する理由がまったくわかりません。

于 2012-06-24T01:18:10.533 に答える