2012-01-26 8 views
0

私はこの問題を多く探していますが、解決策が見つかりません。私はミニゲームを構築しようとしており、プラットフォームを作成する方法があります。私はすべてのプラットフォームパラメータを持つクラスを持っているので、私はクラスの配列を作ったので、同時に複数のプラットフォームを持つことができます。クラス配列からメソッドを呼び出すとNullPointerExceptionが発生します

問題:私が望むパラメータを送信してプラットフォームを構築する方法を呼び出そうとすると、私にNullPointerExceptionが与えられます。メソッドは以前は動作していましたが、すべて静的なので、そのクラスの複数のインスタンスを持つことができませんでしたが、今ではプラットフォームクラスから静的フィールドを削除して、メソッドを呼び出すたびにNullPointerExceptionを返します。ゲームのクラスで

public static void main(String[] args) { 
     Game ex = new Game(); 
     new Thread(ex).start(); 
    } 

:Load_Stageクラスで

public Load_Stage load = new Load_Stage(); 
public Game() { 
     -other variables initializatin- 
     Initialize_Items(); 
     load.Stage_1(); // <--- problem this way 

私は私にエラーを与えるコードの一部をコピーし、エラーは次のようになります

public class Load_Stage { 
    public Platforms plat = new Platforms(); 

    public void Stage_1(){  
     Stage_Builder.Build_Platform(200, 500, 300, plat.platform1); 
     Stage_Builder.Build_Platform(100, 200, 100, plat.platform1); 
    } 

} 

Stage_Builderクラスの内部:

public class Stage_Builder { 

    public static final int max_platforms = 10; 
    public static Platform_1[] p1 = new Platform_1[max_platforms]; 
    public static boolean[] platform_on = new boolean[max_platforms];  

    public Stage_Builder() { 
     for (int c = 0; c < platform_on.length; c++) { 
      platform_on[c] = false; 
     } 
    } 
    public static void Build_Platform(int x, int y, int width, ImageIcon[] type) { // BUILDS A PLATFORM 

     for (int b = 0; b < max_platforms; b++) { 
      if (platform_on[b] == false) { 
       p1[b].Construct(x, y, width, type); // <-- NullPointerException here 
       platform_on[b] = true; 
       break; 
      } 
     } 
    } 
} 

ありがとうございます。

編集:ここではPlatform_1クラスは(それを忘れて申し訳ありません)です:

public class Platform_1 { 

    private int platform_begin_width = 30; 
    private int platform_middle_width = 20; 
    public int blocks_number = 0; 
    public ImageIcon[] platform_floors = new ImageIcon[500]; 
    private int current_width = 0; 
    public int [] platform_x = new int [500]; 
    public int platform_y = 0; 
    public int platform_width = 0; 

    public void Construct(int x, int y, int width, ImageIcon [] type) {   
     platform_width = width; 
     platform_y = y; 
     for (int c = 0; current_width <= platform_width; c++) { 
      if (c == 0) { 
       platform_x[c] = x; 
       platform_floors[c] = type[0]; 
       current_width += platform_begin_width; 
      } else if ((current_width + platform_middle_width) > platform_width) { 
       platform_floors[c] = type[2]; 
       blocks_number = c + 1; 
       platform_x[c] = current_width + x; 
       current_width += platform_middle_width; 
      } else { 
       platform_floors[c] = type[1]; 
       platform_x[c] = current_width + x; 
       current_width += platform_middle_width; 
      } 
     }   
    } 
} 

やプラットフォームクラス:

public class Platforms { 

    public ImageIcon[] platform1 = {new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/begin.png"), 
     new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/middle.png"), 
     new ImageIcon("Resources/Sprites/Stage_Objects/Platform1/end.png")}; 
} 

答えて

3

問題と解決策はどちらも明らかです。

public static Platform_1[] p1 = new Platform_1[max_platforms]; 

コード行が実行された後、P1は全てヌルあるタイプPlatform_1 の参照の配列です。このコード行を実行する

はすぐにそう説明します:

  p1[b].Construct(x, y, width, type); // <-- NullPointerException here 

ソリューションはPlatform_1のnull以外のインスタンスを指すようにp1配列をintializeすることです。このような

何かが動作します:あなたが満たされていなかった上にメッセージを呼び出している

for (int i = 0; < p1.length; ++i) { 
    p1[i] = new Platform1(); 
} 
+0

p1配列コードを忘れて申し訳ありません。私はその記事を編集した。私はあなたのソリューションをチェックし、それが動作するかどうかを確認します:) –

+0

さて、どのようにp1がnullでないインスタンスのPlatform_1を指すように初期化できますか?私はあなたが意味することを知っている、私はちょうど解決策を実装する方法がわからない –

+0

例のための追加されたコードを参照してください – duffymo

2

あなたはp1配列で物事を置く場所を私は見ていませんよStage_Builderクラスにあります。

表示されていないPlatformクラスのものは、初期化されておらず、Constructに電話をかけたときに破損している可能性があります(可能性はほとんどありませんが、すべて表示されていない可能性があります)。

はまた、次のようにあなたが静的変数を宣言現れp1platform_onが、あなたが唯一のコンストラクタでplatform_onを移入

public static Platform_1[] p1 = new Platform_1[max_platforms]; 
public static boolean[] platform_on = new boolean[max_platforms];  

public Stage_Builder() { 
    for (int c = 0; c < platform_on.length; c++) { 
     platform_on[c] = false; 
    } 
} 

問題と思われます。ですから、Stage_Builderインスタンスを作成するには、最初の時間は、あなたはすべてのfalseで1つの静的配列を移入し、他の静的配列には何も入れていない...

静的ブロックのものの静的変数

// static var declarations 

static { 
    // populate static arrays here. 
} 
の移入
+0

p1配列コードを忘れて申し訳ありません。私はその記事を編集した。私はあなたのソリューションをチェックして、それが動作するかどうかを確認します:) –

+0

あなたは 'p1'配列に値を設定していますか? – hvgotcodes

+0

私は実際にそれを埋めるわけではありません、私は今それを行うでしょう、それが動作するかどうか見てください。私は以前と同じようなことをしたので同じ問題を起こしていないと思っていましたが、私は同じロジックを使っていました...しかし、私はKostaが提案したようにArrayListを使用しています。ありがとう。 –

0

配列。

あなたはとてもp1あなたは

null.Construct(...); 
です

p1[b].Construct(x, y, width, type); 

を呼び出そう

p1[0] = null 
p1[1] = null 
. 
. 
. 
p1[max_platforms] = null 

ある

public static Platform_1[] p1 = new Platform_1[max_platforms]; 

を持っています

配列のインデックスを最初に初期化する必要があります。

p1[b] = new Platform_1(); 
p1[b].Construct(...); 
+0

ありがとう、それは問題のようです。私は今それに取り組んでいます:D –

0

まず、duffymoが指摘しているように、p1 [b]がnullである可能性が高いという問題があります。

第2に、あなたは本当に奇妙な方法で配列を使用しています。何

についてa)の代わりに、ArrayListのどこか

C)Build_Platform1の同等の()は、次のようになり持ってStage_Builder

B)を削除:なし)

p1.add(new Platform1(x, y, width, type); 

Dをon [i]の場合、max_platformsはありません。forループはプラットフォームを追加しません(後者は実際にいくつかのhundretプラットフォームを使用するとパフォーマンスが悪くなります)

+0

うわー、良い改善のようです。ありがとう、私は実際前にArrayListsを扱っていませんが、あなたが示唆したことを悪いです。問題については、p1(Platform_1)クラスコードで投稿を編集しました。私が知る限り、すべてが正しく初期化されています。ありがとう –

関連する問題