处理java.lang.VerifyError

时间:2013-06-07 05:43:14

标签: java lucene

我在Eclipse Juno中使用Lucene编写了一个Java程序。每当我尝试运行它时,都会出现以下错误:

Exception in thread "main" java.lang.VerifyError: Cannot inherit from final class

at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at parser.BuildMainIndex.setUp(BuildMainIndex.java:339)
at parser.luceneDemo.main(luceneDemo.java:10)

和错误的来源,即BuildManinIndex.java中的行是:

        doc.add(new IntField("startTime1",startTime1,Field.Store.YES));

这里startTime1是要编制索引的文档中的字段。我之前使用的是Lucene 3.6.0,现在我使用的是Lucene 4.3.0。我没有从java.net.URL导入任何东西。我不知道这个错误的可能原因。请帮忙。

编辑:这是我写的以下简短程序。

writer=new IndexWriter(directory,new StandardAnalyzer(Version.LUCENE_CURRENT),IndexWriter.MaxFieldLength.UNLIMITED);

Document doc=new Document();
doc.add(new Field("title","XYZ",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("address","ABC Road",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("city","Mumbai",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new IntField("startTime1",900,Field.Store.YES));
doc.add(new IntField("finishTime1",1000,Field.Store.YES));
doc.add(new IntField("startTime2",9999,Field.Store.YES));
doc.add(new IntField("finishTime2",9999,Field.Store.YES));

writer.addDocument(doc);
writer.close();

1 个答案:

答案 0 :(得分:1)

错误消息有点令人困惑,因为你没有继承IntField类,你正在创建它的实例,对吗?

doc.add(new IntField("startTime1", startTime1, Field.Store.YES));

问题出现在该陈述doc.add(..)的第一部分。 Lucene版本3.6.0和4.x之间的Document类发生了更改 - 3.6中的add(..)正在接受Fieldableclass API),并且在4.1.0中正在接受IndexableFieldclass API)。

VerifyError上有用的article。或this StackOverflow answer

此外,Lucene 3.6.0中没有IntField,即该类来自Apache Solr(class API),但Lucene 4.1.0中有一个。您可能正在使用3.6版本的IntField与Lucene的版本不同 - 请检查您的import语句和类路径。

更新

Joy,最简单的解决方案是从/home/abhishek/mtp/stage-2/software/apache-tomcat-7.0.37/lib删除旧的Lucene JAR文件并放入新文件,并在Eclipse中刷新项目。

我的建议是切换到Apache Maven进行依赖管理(有一个Eclipse的Maven插件)。在Eclipse中,您创建一个“New Maven Project”并将依赖项添加到pom.xml文件 - example for Lucene。这样您就不必将任何JAR文件复制到项目或Tomcat中。

祝你好运。