2008-09-04 46 views
53

Tôi đang sử dụng kiến ​​để tạo ra javadocs, nhưng nhận được ngoại lệ này hơn và hơn - tại sao?Tại sao tôi nhận được một ClassCastException khi tạo javadocs?

Tôi đang sử dụng phiên bản 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

Kết hợp phiên bản JDK nào được sử dụng? –

Trả lời

54

Có vẻ như điều này đã được báo cáo là Java bug. Dường như nó được gây ra bằng cách sử dụng chú thích từ thư viện của bên thứ ba (như JUnit) và không bao gồm bình chứa chú thích đó trong lời gọi javadoc.

Nếu đúng như vậy, chỉ cần sử dụng tùy chọn -classpath trên javadoc và bao gồm các tệp jar bổ sung.

+2

Điều này làm việc cho tôi. 'định vị junit' bật lên rất nhiều, vì vậy tôi chọn một cách ngẫu nhiên, đặt nó trên classpath, và trường hợp ngoại lệ đặc biệt đó biến mất. Tôi vẫn nghĩ rằng javadoc là vô cùng flakey, xem xét nó được sử dụng rộng rãi như thế nào. –

+2

Đối với tôi, tôi phải thêm các thư viện Jackson vào đường dẫn lớp javadoc. –

+0

Tôi phải thêm chú thích.jar vào classpath của mình, nằm trong thư mục android-sdk/tools/support – crobicha

1

Tôi có một số ý tưởng về vấn đề này nhưng giải pháp này không chính xác để có được.

Nếu bạn cung cấp dòng nhận xét đơn lẻ \\\\ trước chú thích và thử chạy lại javadoc. Vấn đề này sẽ giải quyết

Ví dụ: sample.java file

@ChannelPipeline 

Làm thay đổi trong

\\\\@ChannelPipeline 

Cố gắng chạy lệnh javadoc một lần nữa. Hiện tại, Ngoại lệ Lớp Cast sẽ không xảy ra

0

Tôi cũng gặp sự cố này. Tôi có thể biên dịch đúng cách mà không có bất kỳ lỗi hoặc cảnh báo nào. Nhưng khi tôi tạo ra javadoc, tôi nhận được lỗi dưới đây.

[javadoc] java.lang.ClassCastException: com.sun.tools.javadoc.ClassDocImpl không thể được đúc để com.sun.javadoc.AnnotationTypeDoc

Đây là tải classpath của tôi cho bên-libs thứ ba của tôi ...

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

Tại mục tiêu java biên dịch của tôi ..

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

Và tại mục tiêu javadoc của tôi ...

<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> 

Vì vậy, tôi đã thêm classpathref="build.classpath" tùy chọn để <javadoc thẻ. Bây giờ nó là tốt cho tôi.

0

Có một cách khác để có được một ClassCastException (1.8.0_101 hiện đang thất bại):

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

Nó sẽ xảy ra khi javadoc gặp một tham chiếu đến một phương pháp chú thích trong văn bản javadoc trước khi xử lý các chú thích tương tự lần đầu tiên được sử dụng trong mã.Thực hiện hai loại này:

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


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

Lỗi này phụ thuộc vào đơn hàng. Nếu javadoc xử lý TestClass1 trước tiên, số ClassCastException sẽ bị ném. Nếu javadoc xử lý TestClass2 trước tiên, nó sẽ hoàn thành tốt. Lỗi được báo cáo là JDK-8170444.

Giải pháp thay thế, không liên kết đến các phương thức chú thích trong văn bản tài liệu của bạn.

Các vấn đề liên quan