尝试填充float数组时出现ArrayStoreException

为什么以下代码引发exception,它是什么意思?

float[][] foo_array = new float[WIDTH][HEIGHT]; //Assume WDITH and Height are defined java.util.Arrays.fill(foo_array, Float.POSITIVE_INFINITY); 

正如您所看到的,我只是尝试在无穷大处初始化float数组,但这会导致以下exception:

 Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: java.lang.ArrayStoreException: java.lang.Float at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:113) Caused by: java.lang.ArrayStoreException: java.lang.Float at java.util.Arrays.fill(Arrays.java:2170) 

当然我可以遍历整个数组并将每个值设置为无穷大,我知道这就是fill方法所做的事情(它还有什么用呢)。 但我只是好奇为什么这不起作用,这是什么例外。

编辑:我省略了大部分exception消息,因为我不想这么长时间,并没有提供任何相关信息。

根据JLS 10.5

如果所分配的值的类型与组件类型不是赋值兼容(第5.2节),则抛出ArrayStoreException。

看来你的distMap引用不是float[] ,可能是float[][] ,它不起作用,因为float[]不等于float[][]

尝试使用正确的参数,如foo_array[0] ,它的工作原理如下:

 float[][] foo_array = new float[10][10]; //Assume WDITH and Height are defined java.util.Arrays.fill(foo_array[0], Float.POSITIVE_INFINITY); System.out.println(Arrays.toString(foo_array)); 

另请查看fill的方法签名(float [] a,float val) 。

你需要迭代foo_array并设置每个foo_array[i] 。 样品:

 for(float[] floatArrays:foo_array) { java.util.Arrays.fill(floatArrays, Float.POSITIVE_INFINITY); } 

这是一个很好的多维数组教程 。

在此处输入图像描述

foo_array是一个float[][] ,它清楚地说明了你的尝试失败的原因: foo_array的元素类型是float[] 。 这就是Java的多维数组的工作原理:它们是数组的数组。

要纠正您的问题,请迭代foo_array的所有float[] -typed成员,并对每个成员使用Arrays.fill

您似乎应该使用此循环来执行您想要的操作:

 for(int i = 0; i < foo_array.length; i++){ Arrays.fill(foo_array[i], Float.POSITIVE_INFINITY); } 

您的代码将在java.util.Arrays中调用以下方法
public static void fill(Object[] a, Object val) {
for (int i = 0, len = a.length; i < len; i++)
a[i] = val;
}

因此,您的例外符合预期。