0

サーバー用の Realm プラグインを作成しており、マルチアレイを使用してユーザー ポータルの場所を検出しています。コードは次のとおりです。

public static String[][][] realms;

@EventHandler
public void onPlayerInteract(final PlayerInteractEvent event) throws Exception {
  if( event.getMaterial() == Material.NETHER_STAR ) {
    int x = (int) event.getClickedBlock().getX();
    int y = (int) event.getClickedBlock().getY();
    int z = (int) event.getClickedBlock().getZ();
**  realms[x][y][z] = event.getPlayer().getName();
    createPortal();
  }
}

「**」の行に出ましたNullPointerException。誰かが私が間違っていることを説明してもらえますか? 「Java multiarrays」をグーグルで検索しましたが、それらはすべて同じように機能するようです。

4

4 に答える 4

1

配列のライフ サイクルは 3 つの要素で構成されます。 1. 配列型の宣言 2. 配列の初期化 3. 配列の使用

しかし、配列を宣言していないのではなく、変数を宣言し、「文字列」型の「レルム」という名前の 3 次元配列が必要であることをコンパイラーに通知しましたが、その配列をメモリに割り当てるのを忘れていました。変数へのポインター。配列宣言のサンプル

public static String[][][] realms; /// array variable declared
/*now allocate the memory and point it to the array variable*/
realms = new String [<length index>][<breath index>][<height index>]

これを試してください(長さ指数、呼吸指数、高さ指数をあなたに合わせて置き換えてください)

public static String[][][] realms;

@EventHandler
public void onPlayerInteract(final PlayerInteractEvent event) throws Exception {

    realms = new String [<length index>][<breath index>][<height index>]

  if( event.getMaterial() == Material.NETHER_STAR ) {
    int x = (int) event.getClickedBlock().getX();
    int y = (int) event.getClickedBlock().getY();
    int z = (int) event.getClickedBlock().getZ();
**  realms[x][y][z] = event.getPlayer().getName();
    createPortal();
  }
}
于 2013-08-12T22:22:24.753 に答える
1

他の回答のコメントから判断すると、多次元配列はあなたが望むデータ構造ではないと思います。あなたのインデックスは潜在的に無制限 (または少なくとも非常に大きい) であり、負になる可能性があり、おそらくまばらにしか埋められないことを示唆しています。Octreeしたがって、データを格納するための実装が必要だと思います。 http://www.java-gaming.org/index.php?topic=27334.0で入手できるものがあります- 私はそれを使用したことはありませんが、Quadtree 実装を使用しました(基本的には3次元ではなく2次元でも同じこと)過去に成功。

于 2013-08-12T22:28:09.973 に答える