java.lang.VerifyError函数调用的不兼容对象参数

在编写一些java代码时,我遇到了一个我无法识别的exceptionjava.lang.VerifyError。 一些谷歌搜索表明这通常是一个jvm / javac错误,我很好奇,如果我的情况是。

我怀疑的是

private Pair<Integer/*used size*/,Pair[]>[] map=(Pair<Integer,Pair[]>[])Array.newInstance(Pair.class,63);//good start number 

 map[b]=new Pair<Integer,Pair[]>(7,(Pair[])Array.newInstance(Pair.class,7)); 

但我很不确定。

这是编译器错误还是我的错误代码。

这些行是我在某处找到的generics数组创建失败的解决方法。

附加代码。

 package osm2spacebook; import java.util.Iterator; import java.lang.reflect.Array; import java.util.NoSuchElementException; public class MultiMap implements Iterable{ private int num_keys; @SuppressWarnings("unchecked") private Pair<Integer/*used size*/,Pair[]>[] map=(Pair<Integer,Pair[]>[])Array.newInstance(Pair.class,63);//good start number @SuppressWarnings("unchecked") private int bucket(K key){//position in bucket int h=key.hashCode(); int b=h%map.length; if(map[b]==null) map[b]=new Pair<Integer,Pair[]>(7,(Pair[])Array.newInstance(Pair.class,7)); return b; } private int position(K key){//position within bucket int b=bucket(key);//IMPORTANT this must use the buket function to obtain this otherwise it is a race for(int i=0;i<map[b].v1;i++) if(map[b].v2[i].v1==key) return i; if(map[b].v1==map[b].v2.length) map[b].v2=java.util.Arrays.copyOf(map[b].v2,map[b].v1*2); return map[b].v1++; } public V put(K key,V value){ Pair m=map[bucket(key)].v2[position(key)]; for(int i=0;i<m.v2.length;i++) if(m.v2[i]==value) return value; m.v2=java.util.Arrays.copyOf(m.v2,m.v2.length+1); return m.v2[m.v2.length-1]=value; } public V[] get(K key){ V[] v=map[bucket(key)].v2[position(key)].v2; return java.util.Arrays.copyOf(v,v.length); } public V[] remove(K key){ throw new UnsupportedOperationException("Not implemented"); //TODO } public V remove(K key,V value){ throw new UnsupportedOperationException("Not implemented"); //TODO } public boolean contains(K key){ return position(key)<map[bucket(key)].v1; } public int numKeys(){ return num_keys; } public Iterator iterator(){ return new Iterator(){ int bucket=0; int position=0; public boolean hasNext(){ while(bucket<map.length){ if(map[bucket]!=null) if(position<map[bucket].v1) return true; else position=0; bucket++; } return false; } public K next(){ if(hasNext())//positions cursor on next element if any return map[bucket].v2[position++].v1;//updates position after read else throw new NoSuchElementException(); } public void remove(){ throw new UnsupportedOperationException("Remove not supported in multimap iterator du to ambiguity"); } }; } } 

这取决于对类

 package osm2spacebook; public class Pair{ public T1 v1; public T2 v2; public Pair(T1 t1,T2 t2){ v1=t1; v2=t2; } } 

完整的错误消息

 Exception in thread "main" java.lang.VerifyError: (class: osm2spacebook/MultiMap, method: position signature: (Ljava/lang/Object;)I) Incompatible object argument for function call at osm2spacebook.SqlOutput.(SqlOutput.java:64) at osm2spacebook.OsmImport.(OsmImport.java:142) at osm2spacebook.OsmImport.main(OsmImport.java:280) 

SqlOutput的第64行如下

 private MultiMap edge_index=new MultiMap(); 

VerifyError通常意味着您加载了一个以某种方式格式错误的类文件,或者引用另一个类文件,该文件的更改方式导致另一个类文件中的代码不再有效。 例如,如果您编译了一个引用其他类中的方法的类文件,然后在更改该方法的签名后独立修改并重新编译第二个类,则会出现此类错误。

我建议做一个干净的构建,看看这个问题是否消失了。 如果没有,请检查您是否使用了最新的JAR和源文件。

对于遇到这个问题的不幸的灵魂……我现在已经解决了两次,两种不同的方式(可能是相同的基础解决方案)。 我希望这能让你从我研究和击败墙壁的那些日子中拯救你……

我的项目:SBT 0.13 / Lift 2.5 / Scala 2.10.2

第一个解决方案:我从SBT 0.11 / Lift 2.4 / Scala 2.9.2升级到SBT 0.13 / Lift 2.5 / Scala 2.10.2。 这是让所有依赖项正确更新(花了一天或两天)的地狱,但它确实有效。

第二个解决方案 :我没有更新版本,我可以升级,所以我找到了另一个选择:运行SBT清理并没有做到这一点,所以我进一步重命名(有效删除,就SBT知道)所有中间/衍生对象文件夹(只是在项目文件夹结构中添加了’.archived’)(强制SBT从头开始重建/填充所有内容),即。

  • / lib / – >我认为这是我添加的文件夹,因此可能不适用于您。
  • /project/target/\*.\*
  • /project/project/target/\*.\*
  • /目标/\*。\*

之后,SBT重新下载了所需内容,重建了这些文件夹的内容,一切正常。 如前所述,我相信这也是第一次也有效。 我相信升级除了创建一个scala_2.10.2文件夹以新填充中间/编译对象之外什么也没做,类似于我重命名’target’文件夹。