JDK 11.0.2-Kompilierung schlägt mit javac NPE bei anonymer parametrisierter Klassentyp-Inferenz fehl

Lesezeit: 3 Minuten

Benutzer-Avatar
Michail Cholodkow

Code (Springweb 5.1.2)

public static void main(String[] args) {
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.AUTHORIZATION, "token");
    HttpEntity<Object> requestEntity = new HttpEntity<>(headers);

    ResponseEntity<Object> test = restTemplate.exchange(
            "https://example.com",
            HttpMethod.GET,
            new HttpEntity<>(headers),
            new ParameterizedTypeReference<>() { // fails here
            });
}

OracleJDK 1.8 (erwartete Ausgabe)

kann keine Typargumente für org.springframework.core.ParameterizedTypeReference ableiten

Grund: ‘<>‘ kann nicht mit anonymen inneren Klassen verwendet werden

OracleJDK 11.0.2 (nicht erwartete Ausgabe)

Compiler-Meldungsdatei defekt: key=compiler.misc.msg.bug arguments=11.0.2, {1}, {2}, {3}, {4}, {5}, {6}, {7} java.lang .NullPointerException bei jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitApply(Flow.java:1235) bei jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept( JCTree.java:1634) unter jdk.compiler/com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) unter jdk.compiler/com.sun.tools.javac.comp.Flow$BaseAnalyzer. scan(Flow.java:398) unter jdk.compiler/com.sun.tools.javac.comp.Flow$FlowAnalyzer.visitVarDef(Flow.java:989)

Wenn ich den Rautenoperator in den expliziten Typ ändere

new ParameterizedTypeReference<>(){} zu new ParameterizedTypeReference<Object>(){}

dann wird der Code auf beiden JDKs erfolgreich kompiliert.

Ist es ein bekannter Compiler-Bug?

  • Eine Ausnahme vom Compiler ist ein Fehler. Schreiben Sie einen Testfall und reichen Sie den Fehler ein.

    – Thorbjørn Ravn Andersen

    19. Februar 2019 um 22:07 Uhr


  • Auch diesen Fehler bestätige ich

    – Mircea Stanciu

    25. März 2019 um 20:43 Uhr

  • Ich kann das Projekt nicht erstellen, während meine anderen Teamkollegen es erstellen können. Ich habe versucht, mein Repo zu löschen. kein Glück .

    – Robert Ravikumar

    16. November 2020 um 2:03 Uhr

  • Dies ist ein Fehler in allen Versionen, die älter als 11.0.8 sind. Versuchen Sie, Ihr JDK auf 11.0.8 oder neuer zu aktualisieren

    – Callum Atwal

    27. Januar um 14:53 Uhr

  • JDK 11.0.14 funktioniert, habe frühere Versionen nicht ausprobiert.

    – gaborsch

    28. April um 15:14 Uhr

Benutzer-Avatar
Michail Cholodkow

Insekt (JDK-8212586) wurde bereits eingereicht und Fest in Version 12.

Minimales, überprüfbares Beispiel:

public static void main(String[] args) {
    new Bug<>(){};
}

static class Bug<T> {

    Bug() {
        test(new ParameterizedTypeReference<>(){});
    }

    void test(ParameterizedTypeReference<T> typeReference) {
    }
}

Ein paar Details.


Fix wurde auch auf JDK 11 zurückportiert – https://bugs.openjdk.java.net/browse/JDK-8220578.

Verfügbar ab JDK 11.0.4.

  • Bedeutet „behoben in Version 12“, dass ich JDK 12 installieren muss, um den Fix zu erhalten? Bleibt JDK 11 defekt?

    – Troy Daniels

    25. Februar 2019 um 22:59 Uhr

  • @TroyDaniels ja, Fix ist enthalten und soll als Teil von JDK 12 veröffentlicht werden. openjdk.java.net/projects/jdk/12

    – Michail Cholodkow

    26. Februar 2019 um 16:46 Uhr

  • Was ist mit JDK11, das “angeblich” LTE sein soll?

    – Mircea Stanciu

    25. März 2019 um 20:44 Uhr

  • @ MirceaStanciu Fix wurde zurückportiert und wird in JDK 11.0.4 verfügbar sein. Antwort aktualisiert.

    – Michail Cholodkow

    25. März 2019 um 22:43 Uhr


  • Java 11.0.6 hat das gleiche Problem

    – Maxim Kasjanow

    29. Juni 2020 um 12:21 Uhr

Benutzer-Avatar
Otmane el alami el hassani

Ich hatte den gleichen Fehler, Sie müssen eine Funktion erstellen:

ParameterizedTypeReference<Object> createParameterizedTypeReference(){ return new ParameterizedTypeReference<>(){}; }

und nenne es:

ResponseEntity<Object> test = restTemplate.exchange(
"https://example.com",
HttpMethod.GET,
new HttpEntity<>(headers),
createParameterizedTypeReference() { 
});

Wie in früheren Kommentaren erwähnt, besteht das Problem bei parametrisierten anonymen Klassen, z. B. bei der Verwendung von TypeToken von Guava NICHT Arbeit:

public List<SomeClass> list() {
    return getData(new TypeToken<>() { });
}

Aber dieses TUT Arbeit:

public List<SomeClass> list() {
    return getData(new TypeToken<List<SomeClass>>() { });
}

Ich habe das in den Versionen 11.0.3 – 11.0.7 versucht und alle enthalten den Fehler.

  • OpenJDK 11.0.8 hat den Fehler auch

    – aksh1618

    5. Januar 2021 um 14:47 Uhr


Benutzer-Avatar
Martin Langvatn

Java 11.0.7 hat das gleiche Problem.

Dies änderte sich von:

new ParameterizedTypeReference<>() {
})

dazu:

new ParameterizedTypeReference<HashMap<String, MyClass>>() {
})

Ich habe dieses Problem auf meinem Computer behoben, indem ich auf AdoptOpenJDK 11.0.8 aktualisiert habe.

https://adoptopenjdk.net/installation.html#x64_mac-jdk

1116730cookie-checkJDK 11.0.2-Kompilierung schlägt mit javac NPE bei anonymer parametrisierter Klassentyp-Inferenz fehl

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy