尝试填充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;
}
因此,您的例外符合预期。