尝试填充float数组时出现ArrayStoreException

时间:2013-08-03 15:37:21

标签: java 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 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方法所做的事情(它还有什么用呢)。但我只是好奇为什么这不起作用,这是什么例外。

编辑:我省略了大部分异常消息,因为我不想这么做,而且没有提供任何相关信息。

4 个答案:

答案 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

enter image description here

答案 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;
}

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