Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8145489

NPE while compiling annotations with qualified names in package-info.java

XMLWordPrintable

    • b122
    • x86_64
    • windows_7
    • Verified

      FULL PRODUCT VERSION :
      java version "1.8.0_66"
      Java(TM) SE Runtime Environment (build 1.8.0_66-b18)
      Java HotSpot(TM) 64-Bit Server VM (build 25.66-b18, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows [Version 6.1.7601]

      EXTRA RELEVANT SYSTEM CONFIGURATION :
      64-bit operating system
      Intel Core i3 CPU 550 @ 3.20 GHz
      8 GB RAM

      A DESCRIPTION OF THE PROBLEM :
      We can not migrate our application to JDK 1.8 because of the following error.
      Compiler crashes with java.lang.NullPointerException while compiling Java sources with org.hibernate.annotations.TypeDef
      annotation from hibernate-core-4.2.15.Final.jar.

      REGRESSION. Last worked in version 7u76

      ADDITIONAL REGRESSION INFORMATION:
      java version "1.7.0_21"
      Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
      Java HotSpot(TM) Client VM (build 23.21-b01, mixed mode)

      And also:

      java version "1.6.0_37"
      Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
      Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01, mixed mode)

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Run the javac compiler with following commands:

      set JDK_HOME=E:\Dist\jdk1.8.0_66
      %JDK_HOME%\bin\javac -d ..\out -g -encoding UTF-8 -verbose -classpath ..\lib\hibernate-core-4.2.15.Final.jar ..\src\ru\ftc\upc2\testing\extract\package-info.java ..\src\ru\ftc\upc2\testing\extract\Status.java ..\src\ru\ftc\upc2\testing\extract\IdEnumType.java > build.log 2>&1

      , where ..\lib\hibernate-core-4.2.15.Final.jar can be downloaded from Maven Central Repository: https://repo1.maven.org/maven2/org/hibernate/hibernate-core/4.2.15.Final/hibernate-core-4.2.15.Final.jar
      and *.java files are provided below in "Source code for an executable test case" section.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Compiled *.class files in ..\out directory.
      ACTUAL -
      1. No compiled classes in ..\out directory.
      2. java.lang.NullPointerException error in build.log file.
      The build.log file content is provided below (see Error Message(s)/ Crash Logs section).

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      [parsing started RegularFileObject[..\src\ru\ftc\upc2\testing\extract\package-info.java]]
      [parsing completed 19ms]
      [parsing started RegularFileObject[..\src\ru\ftc\upc2\testing\extract\Status.java]]
      [parsing completed 2ms]
      [parsing started RegularFileObject[..\src\ru\ftc\upc2\testing\extract\IdEnumType.java]]
      [parsing completed 4ms]
      [search path for source files: e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar]
      [search path for class files: E:\Dist\jdk1.8.0_66\jre\lib\resources.jar,E:\Dist\jdk1.8.0_66\jre\lib\rt.jar,E:\Dist\jdk1.8.0_66\jre\lib\sunrsasign.jar,E:\Dist\jdk1.8.0_66\jre\lib\jsse.jar,E:\Dist\jdk1.8.0_66\jre\lib\jce.jar,E:\Dist\jdk1.8.0_66\jre\lib\charsets.jar,E:\Dist\jdk1.8.0_66\jre\lib\jfr.jar,E:\Dist\jdk1.8.0_66\jre\classes,E:\Dist\jdk1.8.0_66\jre\lib\ext\access-bridge-64.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\cldrdata.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\dnsns.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\jaccess.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\jfxrt.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\localedata.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\nashorn.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\sunec.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\sunjce_provider.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\sunmscapi.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\sunpkcs11.jar,E:\Dist\jdk1.8.0_66\jre\lib\ext\zipfs.jar,e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Enum.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
      [loading ZipFileIndexFileObject[e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar(org/hibernate/HibernateException.class)]]
      [loading ZipFileIndexFileObject[e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar(org/hibernate/engine/spi/SessionImplementor.class)]]
      [loading ZipFileIndexFileObject[e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar(org/hibernate/usertype/UserType.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/sql/PreparedStatement.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/sql/ResultSet.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/sql/SQLException.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/sql/Types.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Class.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/Override.class)]]
      [loading ZipFileIndexFileObject[E:\Dist\jdk1.8.0_66\lib\ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Annotation.class)]]
      [loading ZipFileIndexFileObject[e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar(org/hibernate/annotations/TypeDefs.class)]]
      [loading ZipFileIndexFileObject[e:\Issues\UPCSEC-1788-java-8\reproducer\extract\lib\hibernate-core-4.2.15.Final.jar(org/hibernate/annotations/TypeDef.class)]]
      An exception has occurred in the compiler (1.8.0_66). Please file a bug at the Java Bug Database (http://bugreport.java.com/bugreport/) after checking the database for duplicates. Include your program and the following diagnostic in your report. Thank you.
      java.lang.NullPointerException
      at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3312)
      at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1897)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
      at com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3227)
      at com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:1897)
      at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
      at com.sun.tools.javac.comp.Attr.attribExpr(Attr.java:608)
      at com.sun.tools.javac.comp.Annotate.enterAttributeValue(Annotate.java:405)
      at com.sun.tools.javac.comp.Annotate.enterAnnotation(Annotate.java:312)
      at com.sun.tools.javac.comp.Annotate.enterAnnotation(Annotate.java:236)
      at com.sun.tools.javac.comp.Annotate.enterAttributeValue(Annotate.java:381)
      at com.sun.tools.javac.comp.Annotate.enterAttributeValue(Annotate.java:357)
      at com.sun.tools.javac.comp.Annotate.enterAnnotation(Annotate.java:312)
      at com.sun.tools.javac.comp.Annotate.enterAnnotation(Annotate.java:236)
      at com.sun.tools.javac.comp.MemberEnter.actualEnterAnnotations(MemberEnter.java:923)
      at com.sun.tools.javac.comp.MemberEnter.access$600(MemberEnter.java:64)
      at com.sun.tools.javac.comp.MemberEnter$5.run(MemberEnter.java:876)
      at com.sun.tools.javac.comp.Annotate.flush(Annotate.java:143)
      at com.sun.tools.javac.comp.Annotate.enterDone(Annotate.java:129)
      at com.sun.tools.javac.comp.Enter.complete(Enter.java:512)
      at com.sun.tools.javac.comp.Enter.main(Enter.java:471)
      at com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:982)
      at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)
      at com.sun.tools.javac.main.Main.compile(Main.java:523)
      at com.sun.tools.javac.main.Main.compile(Main.java:381)
      at com.sun.tools.javac.main.Main.compile(Main.java:370)
      at com.sun.tools.javac.main.Main.compile(Main.java:361)
      at com.sun.tools.javac.Main.compile(Main.java:56)
      at com.sun.tools.javac.Main.main(Main.java:42)


      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      /* ------------------------------------------------------ package-info.java file contents ---*/
      @org.hibernate.annotations.TypeDefs(value = {
          @org.hibernate.annotations.TypeDef(name = "HistoryEventStatusTypeRef", typeClass = Status.HistoryEventStatusType.class)
      }) package ru.ftc.upc2.testing.extract;

      /* ------------------------------------------------------ Status.java file contents --- */
      package ru.ftc.upc2.testing.extract;

      public enum Status {
        NEW,
        PROCESSED;

        public class HistoryEventStatusType extends IdEnumType {
          @Override
          public Class<?> returnedClass() {
            return Status.class;
          }
        }
      }

      /* ------------------------------------------------------ IdEnumType.java file contents --- */
      package ru.ftc.upc2.testing.extract;

      import org.hibernate.HibernateException;
      import org.hibernate.engine.spi.SessionImplementor;
      import org.hibernate.usertype.UserType;

      import java.io.Serializable;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Types;

      public abstract class IdEnumType implements UserType {

        @Override
        public Object assemble(Serializable cached, Object owner) throws HibernateException {
          return cached;
        }

        @Override
        public Object deepCopy(Object value) throws HibernateException {
          return value;
        }

        @Override
        public Serializable disassemble(Object value) throws HibernateException {
          return (Serializable) value;
        }

        @Override
        public boolean equals(Object x, Object y) throws HibernateException {
          return x == y;
        }

        @Override
        public int hashCode(Object x) throws HibernateException {
          return x == null ? 0 : x.hashCode();
        }

        @Override
        public boolean isMutable() {
          return false;
        }

        @Override
        public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor sessionImplementor, Object owner)
            throws HibernateException, SQLException {
          return null;
        }

        @Override
        public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor sessionImplementor)
            throws HibernateException, SQLException { }

        @Override
        public Object replace(Object original, Object target, Object owner)
            throws HibernateException {
          return original;
        }

        @Override
        public abstract Class<?> returnedClass();

        @Override
        public int[] sqlTypes() {
          return new int[]{Types.INTEGER};
        }}
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      Unfortunately no.

        1. build.log
          5 kB
        2. hibernate-core-4.2.15.Final.jar
          4.47 MB
        3. IdEnumType.java
          2 kB
        4. package-info.java
          0.2 kB
        5. Status.java
          0.2 kB

            mcimadamore Maurizio Cimadamore
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: