2014-06-12 62 views
8

我看了一下ArrayStoreExceptions很多帖子,其中大部分属于这些类别之一:我怎样才能解决一个ArrayStoreException信息

  • 基本误解(把一个基类到子类的数组声明)
  • 类似的误解,同时收到此错误从列表转换为数组
  • “协变”周围的阵列VS仿制药

问题煤矿不属于任何的这些类别。有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的子类,只要我尝试将它添加到数组中,它就会失败。主机是64bit RH linux,OpenJDK java版本为1.7.0.45。

我知道ArrayStoreException告诉我什么,我的问题是如何在故障排除中进一步采取这一步?如果UserValues是一个RecordValues,我该从哪里去?

+1

它可能是与不同​​类加载器和类的不同版本相关的东西?尝试添加一个'instanceof'检查,例如'if(userdefaults instanceof RecordValues){/ * print out something * /}' – Taylor

+0

另外,您确定RecordValues [] rv = new RecordValues [3]的实例化;'是准确的,而不是间接完成的?通过实例化我的意思是'='后的东西) – Taylor

+0

你击中了头部,我更新了答案。 – AndyJ

回答

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的错误更精确!