在 Java 中解决 ArrayStoreException

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(309)   2023-06-26 07:54:18

了解为什么在 Java 中使用数组时会出现 ArrayStoreException 以及如何确定根本原因并修复此错误。

1. ArrayStoreException 的根本原因

Java 数组是协变的 并且支持 Java 的子类型化规则,类型 T[] 的数组可能包含类型 T 或 T 的任何子类型的元素。例如,IntegerNumber 的子类型,因此我们可以将 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

2.解决方案

2.1.手动分析修复

  1. 一旦我们知道了错误,我们就可以轻松解决它。我们必须仔细检查应用程序日志中报告异常的行中的代码。一旦我们固定值的数据类型并在数组中存储兼容类型的值,异常就会得到解决。
  2. 出于某种原因,如果我们无法控制传递给数组的值,另一种选择是使用 try-catch 块这样的代码,并在发现不兼容的值类型时采取适当的措施.

2.2.额外的类型检查

另一种选择是在将项目添加到数组之前进行额外的类型检查。如果该项目是不兼容的类型,则让数组存储它;否则只需使用一些用户友好的错误处理程序拒绝该值。

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");
}

3.总结

在这个简短的教程中,我们了解了为什么我们在 Java 中得到 ArrayStoreException 以及我们如何解决这个问题。尽管手动修复代码是正确的解决方案,但仍然进行额外的类型检查将使代码更加健壮。

快乐学习!!

地址:https://www.cundage.com/article/solving-arraystoreexception.html

相关阅读

使用 array clone、System.arrayCopy() 和 Arrays.copyOf() 方法将一个数组复制到另一个数组对象的 Java 示例。 请注意,下面给出的所有方法都会创建...
如果您正在使用 Hibernate 和 HSqlDB,并且您正在尝试获取实体集合,那么您可能会遇到此错误。对于单个实体,您可能会或可能不会发现此错误。异常将如下所示: Exception in ...
从数组创建子数组的 Java 示例,即创建数组切片。学习使用 Java 8 Arrays.copyOfRange() 方法,以及将 子数组转换为 List 对象。 String[] names ...
制止异常, as name suggest, are exceptions thrown in the code but were ignored somehow. If you remembe...
学习使用 HashSet 类。交集是属于两个不同集合的一组共同项目。 路口 要获取两个数组的交集,请按照下列步骤操作: 将第一个数组推送到 HashSet 实例中。 使用retainAll()方...
通过示例学习在 Java 中创建数组的深拷贝。我们将使用 Apache Commons Lang 库及其实用方法 SerializationUtils.clone( array ) 到 arra...
学习使用不同的技术及其差异来声明和初始化数组。除了直接访问数组外,我们还将使用 java.util.Arrays 和 Stream API,它们提供了几种在 Java 中处理数组的有用方法。 请...
学习使用不同的方法在 Java 中拆分数组。我们将学习将数组分成相等的部分,在指定的索引处和相等的长度。 1. Arrays.copyOfRange() API copyOfRange() 创建...
在此 Java 异常教程中,了解什么是 Java 中的异常,以及已检查异常和未检查异常之间的区别。我们还将学习一些 Java 异常处理最佳实践。 1. Java 中的Exception 是什么?...
Learn to 将 byte[] 数组转换为字符串 and 将 String 转换为 byte[] 数组 in Java with examples. Conversion between b...