Java - 如何找出哪个类文件有一个损坏的常量池?

时间:2011-07-26 14:58:45

标签: java constants javac pool

是否有某种工具或更好的javac输出来确定哪个类文件有一个损坏的常量池...因为我无法编译一些现有的java文件,因为一些预编译的文件有一个腐败的常数池..

以下是损坏的常量池堆打印出来的样子

An exception has occurred in the compiler (1.6.0_26). Please file a bug at the J
ava Developer Connection (http://java.sun.com/webapps/bugreport)  after checking
 the Bug Parade for duplicates. Include your program and the following diagnosti
c in your report.  Thank you.
java.lang.ArrayIndexOutOfBoundsException: 8047705
        at com.sun.tools.javac.jvm.ClassReader.nextInt(ClassReader.java:277)
        at com.sun.tools.javac.jvm.ClassReader.skipMember(ClassReader.java:1504)

        at com.sun.tools.javac.jvm.ClassReader.readClass(ClassReader.java:1559)
        at com.sun.tools.javac.jvm.ClassReader.readClassFile(ClassReader.java:16
58)
        at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1845)
        at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)

        at com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:1951)
        at com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:842)
        at com.sun.tools.javac.comp.Resolve.findIdentInPackage(Resolve.java:1011
)
        at com.sun.tools.javac.comp.Attr.selectSym(Attr.java:1921)
        at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:1835)
        at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1522
)
        at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:390)
        at com.sun.tools.javac.comp.MemberEnter.attribImportType(MemberEnter.jav
a:681)
        at com.sun.tools.javac.comp.MemberEnter.visitImport(MemberEnter.java:545
)
        at com.sun.tools.javac.tree.JCTree$JCImport.accept(JCTree.java:495)
        at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
        at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:399
)
        at com.sun.tools.javac.comp.MemberEnter.visitTopLevel(MemberEnter.java:5
12)
        at com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:
446)
        at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
        at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:819)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)

        at com.sun.tools.javac.comp.Enter.complete(Enter.java:464)
        at com.sun.tools.javac.main.JavaCompiler.complete(JavaCompiler.java:659)

        at com.sun.tools.javac.jvm.ClassReader.fillIn(ClassReader.java:1869)
        at com.sun.tools.javac.jvm.ClassReader.complete(ClassReader.java:1777)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)

        at com.sun.tools.javac.jvm.ClassReader.loadClass(ClassReader.java:1951)
        at com.sun.tools.javac.comp.Resolve.loadClass(Resolve.java:842)
        at com.sun.tools.javac.comp.Resolve.findGlobalType(Resolve.java:901)
        at com.sun.tools.javac.comp.Resolve.findType(Resolve.java:957)
        at com.sun.tools.javac.comp.Resolve.findIdent(Resolve.java:986)
        at com.sun.tools.javac.comp.Resolve.resolveIdent(Resolve.java:1162)
        at com.sun.tools.javac.comp.Attr.visitIdent(Attr.java:1714)
        at com.sun.tools.javac.tree.JCTree$JCIdent.accept(JCTree.java:1547)
        at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:360)
        at com.sun.tools.javac.comp.Attr.attribType(Attr.java:390)
        at com.sun.tools.javac.comp.MemberEnter.signature(MemberEnter.java:355)
        at com.sun.tools.javac.comp.MemberEnter.visitMethodDef(MemberEnter.java:
560)
        at com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:639)
        at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:387
)
        at com.sun.tools.javac.comp.MemberEnter.memberEnter(MemberEnter.java:399
)
        at com.sun.tools.javac.comp.MemberEnter.finishClass(MemberEnter.java:410
)
        at com.sun.tools.javac.comp.MemberEnter.finish(MemberEnter.java:1000)
        at com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:967)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:386)
        at com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:763)

        at com.sun.tools.javac.comp.Enter.complete(Enter.java:464)
        at com.sun.tools.javac.comp.Enter.main(Enter.java:442)
        at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:81
9)
        at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:727)
        at com.sun.tools.javac.main.Main.compile(Main.java:353)
        at com.sun.tools.javac.main.Main.compile(Main.java:279)
        at com.sun.tools.javac.main.Main.compile(Main.java:270)
        at com.sun.tools.javac.Main.compile(Main.java:69)
        at com.sun.tools.javac.Main.main(Main.java:54)

2 个答案:

答案 0 :(得分:3)

有点固定,找到一个好的quickfix ..只需将-verbose添加到您的javac参数中,您就会看到......

[parsing started .\a.java]
[parsing completed 0ms]
[loading .\ajava]
[parsing started .\b.java]
[parsing completed 0ms]
[loading .\bingo\foo.class] //<- here we go.. just before exception.

An exception has occurred in the compiler (1.6.0_26). Please file a bug at the J
ava Developer Connection (http://java.sun.com/webapps/bugreport)  after checking
 the Bug Parade for duplicates. Include your program and the following diagnosti
c in your report.  Thank you.

答案 1 :(得分:0)

我建议你用aspectj来编译编译器。您只需捕获精确的堆栈签名并转储传递给每个方法的参数。你的班级名称将在那个转储中。

编辑:

e.g。 com.sun.tools.javac.jvm.ClassReader.readClassFile