了解为什么在 Java 中使用数组时会出现 ArrayStoreException 以及如何确定根本原因并修复此错误。
Java 数组是协变的 并且支持 Java 的子类型化规则,类型 T[] 的数组可能包含类型 T 或 T 的任何子类型的元素。例如,Integer
是 Numbe
r 的子类型,因此我们可以将 Integer
值分配给 Number
数组。
Number[] numbers = new Number[3];
numbers[0] = new Integer(10); // Works Fine.
Java 还允许数组 S[]
是数组 T[]
的子类型,前提是 S
是 的子类型$$$
。
Integer[] intArray = { 1, 2, 3, 4 };
Number[] numArray = intArray;
numArray[0] = 10; // Works Fine.
现在考虑一下,我们试图欺骗编译器并尝试在上面的数组中存储一个浮点数。
numArray[0] = 10.01;
上面的代码将失败并在运行时给出 java.lang.ArrayStoreException: java.lang.Double 错误。尽管 10.01
是一个数字,但 java 运行时清楚地知道 Number[] numArray
只是一个引用变量,而实际的数组是 $$$< 类型的/代码>。因此 Java 运行时将只允许数组中的
Integer[]
值。
因此,ArrayStoreException 的根本原因是试图在数组中存储不兼容 类型的值。类型检查可能在编译时被欺骗,也许是在不知不觉中,但 Java 运行时将捕获此尝试并抛出 ArrayStoreException
。
另一种选择是在将项目添加到数组之前进行额外的类型检查。如果该项目是不兼容的类型,则让数组存储它;否则只需使用一些用户友好的错误处理程序拒绝该值。
Integer[] intArray = { 1, 2, 3, 4 };
double value = 10.01;
if(intArray.getClass().getComponentType()
== ((Object)value).getClass()) {
numArray[0] = value;
} else {
System.out.println("Incompatible type");
}
在这个简短的教程中,我们了解了为什么我们在 Java 中得到 ArrayStoreException
以及我们如何解决这个问题。尽管手动修复代码是正确的解决方案,但仍然进行额外的类型检查将使代码更加健壮。
快乐学习!!
地址:https://www.cundage.com/article/solving-arraystoreexception.html