为什么以下代码会引发异常,它是什么意思?
float[][] foo_array = new float[WIDTH][HEIGHT]; //Assume WDITH and Height are defined
java.util.Arrays.fill(foo_array, Float.POSITIVE_INFINITY);
正如您所看到的,我只是尝试在无限远处初始化float数组,但这会导致以下异常:
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方法所做的事情(它还有什么用呢)。但我只是好奇为什么这不起作用,这是什么例外。
编辑:我省略了大部分异常消息,因为我不想这么做,而且没有提供任何相关信息。
答案 0 :(得分:3)
根据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);
}
这是一个不错的tutorial on multi-dimensional arrays。
答案 1 :(得分:2)
foo_array
是一个float[][]
,可明确您的尝试失败的原因:foo_array
的元素类型为float[]
。这就是Java的多维数组的工作原理:它们是数组的数组。
要解决您的问题,请对所有float[]
类型的foo_array
成员进行迭代,并针对每个成员使用Arrays.fill
。
答案 2 :(得分:2)
您似乎应该使用此循环来执行您想要的操作:
for(int i = 0; i < foo_array.length; i++){
Arrays.fill(foo_array[i], Float.POSITIVE_INFINITY);
}
答案 3 :(得分:0)
您的代码将在java.util.Arrays中调用以下方法
public static void fill(Object[] a, Object val) {
for (int i = 0, len = a.length; i < len; i++)
a[i] = val;
}
因此,您的例外符合预期。