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

5

在编写一些Java代码时,我遇到了一个我不认识的异常:java.lang.VerifyError。通过一些谷歌搜索,我发现这通常是jvm/javac的错误,我很好奇我的情况是否也是如此。

我怀疑的行是:

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

并且

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

但我并不确定。

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

这些行是为了解决我在某个地方发现的泛型数组创建失败的问题而采取的变通方法。

附上代码。

package osm2spacebook;

import java.util.Iterator;
import java.lang.reflect.Array;
import java.util.NoSuchElementException;

public class MultiMap<K,V> implements Iterable<K>{
    private int num_keys;
    @SuppressWarnings("unchecked")
    private Pair<Integer/*used size*/,Pair<K,V[]>[]>[] map=(Pair<Integer,Pair<K,V[]>[]>[])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<K,V[]>[]>(7,(Pair<K,V[]>[])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<K,V[]> 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<K> iterator(){
        return new Iterator<K>(){
            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");
            }
        };
    }
}

以及依赖于此的Pair类

package osm2spacebook;

public class Pair<T1,T2>{
    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.<init>(SqlOutput.java:64)
    at osm2spacebook.OsmImport.<init>(OsmImport.java:142)
    at osm2spacebook.OsmImport.main(OsmImport.java:280)

SqlOutput的第64行如下:
private MultiMap<Integer,Integer> edge_index=new MultiMap<Integer,Integer>();
2个回答

6
一个"VerifyError"通常意味着你加载了一个有问题的类文件,或者引用了另一个已经改变的类文件,导致另一个类文件中的代码不再有效。例如,如果你编译一个类文件,其中引用了另一个类的方法,然后修改了那个方法的签名并重新编译第二个类,你就会得到这种错误。
建议进行一次干净的构建,并查看是否出现此问题。如果没有解决,请检查您是否使用最新的JAR文件和源文件。

重新使用javac *.java进行编译,然后使用java运行而不需要额外的标志仍然会出现问题。我使用的唯一其他类是Pair类,它是一个具有两个公共成员和构造函数的通用类。除此之外只有标准库依赖项。 - Lijat
你从异常中获取到其他信息了吗?有关于哪个具体方法导致问题的信息吗? - templatetypedef
我不这么认为,无论如何,我已经更新了帖子并附上了完整的Java输出。 - Lijat

1
对于那些不幸遇到这个问题的人...我已经解决了两次,用了两种不同的方法(可能是相同的基本解决方案)。我希望这可以节省你研究和头痛的日子...
我的项目: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。这很难以正确更新所有依赖项(花了一两天时间),但它起作用了。 解决方案2:我没有更高版本可升级,所以我找到了另一个选项:运行SBT清理并不能解决问题,所以我进一步重命名(实际上是按照SBT知道的方式删除)项目文件夹结构中所有中间/派生对象文件夹(只需在它们的名称后面添加'.archived'),即:

  • /lib/ --> 我认为这是我添加的文件夹,所以可能不适用于您。
  • /project/target/\*.\*
  • /project/project/target/\*.\*
  • /target/\*.\*

之后,SBT重新下载所需内容,重建了这些文件夹的内容,一切正常。正如之前提到的,我相信这也将在第一次运行时起作用。我相信升级除了创建一个scala_2.10.2文件夹以外没有做任何其他事情,以便重新填充中间/已编译对象,就像我重命名'target'文件夹一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接