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

2

你得到一个空指针异常,因为你没有初始化数组。

您可以像这样初始化数组:

String string[][][] = new String[3][3][3];

您需要知道数组的长度是多少,因为如果您尝试使用不存在的索引访问或保存值,您将遇到IndexArrayOutOfBounds异常

于 2013-08-12T21:56:20.763 回答
1

从您在其他答案中的评论来看,我认为多维数组不是您想要的数据结构。您建议您的索引可能是无界的(或至少非常大)并且可能为负数,并且可能只会被稀疏填充。因此,我认为您想要一个Octree实现来存储您的数据。http://www.java-gaming.org/index.php? topic=27334.0 上提供了一个- 我从未使用过它,但使用过 Quadtree 实现(基本上是2维而不是3维相同的东西)过去成功。

于 2013-08-12T22:28:09.973 回答
1

数组生命周期包括三件事 1. 数组类型声明 2. 数组初始化 3. 数组利用

但是您还没有声明一个数组,而是您刚刚声明了一个变量并通知编译器您希望拥有一个名为“realms”的“String”类型的 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 回答
0

下面是一个如何初始化多数组的示例:

初始化二维数组

接受的答案的底部显示了语法:

String[][] table = new String[5][5];
于 2013-08-12T22:01:05.060 回答