JDK-8358078 : javap crashes with NPE on preview class file
  • Type: Bug
  • Component: tools
  • Sub-Component: javap
  • Affected Version: 25
  • Priority: P3
  • Status: New
  • Resolution: Unresolved
  • Submitted: 2025-05-29
  • Updated: 2025-06-01
Related Reports
Causes :  
Description
After JDK-8297271 and JDK-8355956, javap fails to print class files with a minor class file version != 0. It can be simply reproduced with a file that uses preview features, e.g.,

void main() {
    assert 5 instanceof byte b;
}


Stacktrace:
Error: A serious internal error has occurred: java.lang.NullPointerException
Please file a bug report, and include the following information:
java.lang.NullPointerException
        at java.base/java.util.Objects.requireNonNull(Objects.java:220)
        at java.base/java.lang.reflect.AccessFlag$Location.findInHistory(AccessFlag.java:636)
        at java.base/java.lang.reflect.AccessFlag$Location.flagsMask(AccessFlag.java:672)
        at java.base/java.lang.reflect.AccessFlag.maskToAccessFlags(AccessFlag.java:408)
        at jdk.jdeps/com.sun.tools.javap.BasicWriter.maskToAccessFlagsReportUnknown(BasicWriter.java:63)
        at jdk.jdeps/com.sun.tools.javap.BasicWriter.flagsReportUnknown(BasicWriter.java:58)
        at jdk.jdeps/com.sun.tools.javap.ClassWriter.getClassModifiers(ClassWriter.java:802)
        at jdk.jdeps/com.sun.tools.javap.ClassWriter.write(ClassWriter.java:167)
        at jdk.jdeps/com.sun.tools.javap.JavapTask.write(JavapTask.java:859)
        at jdk.jdeps/com.sun.tools.javap.JavapTask.writeClass(JavapTask.java:684)
        at jdk.jdeps/com.sun.tools.javap.JavapTask.run(JavapTask.java:628)
        at jdk.jdeps/com.sun.tools.javap.JavapTask.run(JavapTask.java:474)
        at jdk.jdeps/com.sun.tools.javap.Main.main(Main.java:48)


The null is caused by https://github.com/openjdk/jdk/blob/79aff26c2880922b92863911d8a5a035ba9a1e75/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java#L123
Comments
A pull request was submitted for review. Branch: master URL: https://git.openjdk.org/jdk/pull/25569 Date: 2025-06-01 04:53:46 +0000
01-06-2025

Indeed, the handling should instead emulate what ReflectionFactory does: https://github.com/openjdk/jdk/blob/79aff26c2880922b92863911d8a5a035ba9a1e75/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java#L516-L521 When the CFFV is null, we can just fallback to the latest release on a best attempt basis. (Maybe if we have a CFFV for preview features in the future, we will fall back to that one instead.)
30-05-2025