2008-09-04 41 views
53

我使用ant生成javadoc,但一遍又一遍地得到这个异常 - 为什么?为什么在生成javadoc时会出现ClassCastException?

我使用的是JDK版本1.6.0_06

[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl cannot be cast to com.sun.javadoc.AnnotationTypeDoc 
    [javadoc]  at com.sun.tools.javadoc.AnnotationDescImpl.annotationType(AnnotationDescImpl.java:46) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.getAnnotations(HtmlDocletWriter.java:1739) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1713) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1702) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDocletWriter.writeAnnotationInfo(HtmlDocletWriter.java:1681) 
    [javadoc]  at com.sun.tools.doclets.formats.html.FieldWriterImpl.writeSignature(FieldWriterImpl.java:130) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.buildSignature(FieldBuilder.java:184) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.invokeMethod(FieldBuilder.java:114) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.buildFieldDoc(FieldBuilder.java:158) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.FieldBuilder.invokeMethod(FieldBuilder.java:114) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractMemberBuilder.build(AbstractMemberBuilder.java:56) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildFieldDetails(ClassBuilder.java:301) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.buildClassDoc(ClassBuilder.java:124) 
    [javadoc]  at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.invokeMethod(ClassBuilder.java:101) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.AbstractBuilder.build(AbstractBuilder.java:90) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.builders.ClassBuilder.build(ClassBuilder.java:108) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDoclet.generateClassFiles(HtmlDoclet.java:155) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.generateClassFiles(AbstractDoclet.java:164) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.startGeneration(AbstractDoclet.java:106) 
    [javadoc]  at com.sun.tools.doclets.internal.toolkit.AbstractDoclet.start(AbstractDoclet.java:64) 
    [javadoc]  at com.sun.tools.doclets.formats.html.HtmlDoclet.start(HtmlDoclet.java:42) 
    [javadoc]  at com.sun.tools.doclets.standard.Standard.start(Standard.java:23) 
    [javadoc]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    [javadoc]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    [javadoc]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    [javadoc]  at java.lang.reflect.Method.invoke(Method.java:597) 
    [javadoc]  at com.sun.tools.javadoc.DocletInvoker.invoke(DocletInvoker.java:215) 
    [javadoc]  at com.sun.tools.javadoc.DocletInvoker.start(DocletInvoker.java:91) 
    [javadoc]  at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:340) 
    [javadoc]  at com.sun.tools.javadoc.Start.begin(Start.java:128) 
    [javadoc]  at com.sun.tools.javadoc.Main.execute(Main.java:41) 
    [javadoc]  at com.sun.tools.javadoc.Main.main(Main.java:31) 
+0

在哪个版本的JDK中使用混淆? – 2008-09-04 21:48:58

回答

54

它看起来像这样被报告为Java bug。这似乎是由于使用来自第三方库(如JUnit)的注释而引起的,并且未在javadoc调用中包含具有该注释的jar。

如果是这样,只需在javadoc上使用-classpath选项并包含额外的jar文件即可。

+2

这对我有用。 “找到junit”出现了很多,所以我随便选了一个,放在classpath中,那个特殊的异常消失了。 我仍然认为javadoc是荒谬的flakey,考虑它的使用范围。 – 2011-02-04 05:30:57

1

我对这个问题有一些想法,但这不是确切的解决方案。

如果在注释之前给单注释行\\\\并尝试再次运行javadoc。这个问题会解决

如:sample.java文件

@ChannelPipeline 

使在

\\\\@ChannelPipeline 

尝试改变再次运行javadoc的命令。现在不会出现类别转换异常

0

我也遇到了这个问题。我可以正确编译而不会有任何错误或警告。但是当我生成javadoc时,我得到了错误。

[javadoc中] java.lang.ClassCastException:com.sun.tools.javadoc.ClassDocImpl不能转换到com.sun.javadoc.AnnotationTypeDoc

这里是我的类路径装载我的第三方库...

<path id="build.classpath"> 
<fileset dir="."> 
    <include name="libs/*.jar" /> 
</fileset> 

在我的Java编译的目标..

<target name="compile" depends="clean, makedir"> 
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.classpath"> 
    <compilerarg value="-Xlint:unchecked"/> 
</javac> 

而且在我的javadoc目标......

<target name="docs" depends="compile"> 
<javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}" 
    failonerror="no" 
    author="true" 
    version="true" 
    windowtitle="${Name} API" 
    doctitle="${Name}" 
    bottom="Copyright © 2014 ColayHIlls.com . All Rights Reserved."> 
    <fileset dir="${src.dir}"> 
      <include name="main/java/com/colayhills/jpcenter/business/service/**" /> 
    </fileset> 
</javadoc> 
<echo message="java docs has been generated!"/> 
</target> 

所以,我添加classpathref="build.classpath"选项<javadoc标签。现在对我来说很好。

0

还有另一种方式来获得一个ClassCastException(1.8.0_101目前不及格):

java.lang.ClassCastException: com.sun.tools.javadoc.MethodDocImpl cannot be cast to com.sun.tools.javadoc.AnnotationTypeElementDocImpl

时的javadoc处理相同的注解之前遇到到的javadoc文本注释方法的引用将发生第一次在代码中使用。以下两个类别:

/** 
** {@link javax.annotation.Generated#value()} 
*/ 
public class TestClass1 {} 


@Generated("sometext") 
public class TestClass2 {} 

该错误与订单相关。如果javadoc首先处理TestClass1,则将抛出ClassCastException。如果javadoc首先处理TestClass2,那么它会很好地完成。该错误报告为JDK-8170444

作为解决方法,请不要链接到文档文本中的注释方法。

相关问题