如何解决ArrayStoreException问题

时间:2014-06-12 19:14:22

标签: java arrays debugging

我读过很多关于ArrayStoreExceptions的帖子,其中大部分属于以下类别之一:

  • 基本的误解(将基类放入子类的数组声明中)
  • 在将此错误从列表转换为数组时出现类似的误解
  • "协变"围绕数组与泛型的问题

我的不属于这些类别。有one other case,OP怀疑某种类型的错误只出现在Unix上。我认为我遇到过这种情况,而且我不确定如何更接近这个问题。

我已经尽可能地破解了代码,它看起来像这样:

System.out.println("Declaring RecordValues array");
RecordValues[] rv = new RecordValues[3];
System.out.println("This array is meant for "+rv.getClass().getComponentType());
System.out.println("Adding user defaults which is: "+userdefaults.getClass().getName());
System.out.println("Its parent is: "+userdefaults.getClass().getSuperclass().getName());
rv[0] = userdefaults;
System.out.println("Adding templvalues which is: "+tmplvalues.getClass().getName());
rv[1] = tmplvalues;
System.out.println("Adding sessionvalues which is: "+tmplvalues.getClass().getName());
rv[2] = sessionvalues;

它输出:

[ant:createwo] Declaring RecordValues array
[ant:createwo] This array is meant for class org.kp.mbe.arscli.datamap.RecordValues
[ant:createwo] Adding user defaults which is: org.kp.mbe.arscli.datamap.UserValues
[ant:createwo] Its parent is: org.kp.mbe.arscli.datamap.RecordValues
:createwo FAILED <-- 
...
Caused by: java.lang.ArrayStoreException: org.mbe.arscli.datamap.UserValues

UserValues是RecordValues的子类型。我使用有问题的类创建了一些简单的测试,但无法复制错误。此外(这里是非常奇怪的部分),这已经工作了六个多月。我已经对该工具的其他部分进行了更改,但这些库附近没有任何更改。它突然爆发了。

我想知道还有什么可能导致ArrayStoreException。我100%确定UserValues是RecordValues的子类,但是当我尝试将它添加到数组时,它就会失败。主机是64位RH linux,OpenJDK java版本1.7.0.45。

我知道ArrayStoreException告诉我的是什么,我的问题是如何在故障排除方面更进一步?如果UserValues是一个RecordValues,我从哪里开始?

1 个答案:

答案 0 :(得分:1)

发布后,我放弃了数组并将其更改为List,虽然仍然失败,但却提出了一个更具体的问题:

Caused by: java.lang.LinkageError: loader constraint violation: when
resolving method
"org.mbe.arscli.datamap.ValueResolver.resolve(Ljava/util/List;)Lorg/mbe/arscli/datamap/RecordValues;"
the class loader (instance of org/apache/tools/ant/loader/AntClassLoader5) of the current class,
org/build/ant/CreateRemedyWo, and the class loader (instance of java/net/URLClassLoader) for resolved class,
org/mbe/arscli/datamap/ValueResolver, have different Class objects for the type )Lorg/mbe/arscli/datamap/RecordValues; used in the
signature 

正如@Taylor猜测的那样,这是由多个类加载器通过gradle引起的。虽然我很久没有更改此代码,但我最近更改了构建文件中的依赖声明。幸运的是,我从List获得的错误比Array中的错误更精确!