From 13468381324636e53ef5a0db2915ee760f7eb782 Mon Sep 17 00:00:00 2001 From: "ray.zh" Date: Tue, 23 Jan 2024 11:55:39 +0800 Subject: [PATCH] =?UTF-8?q?Create=202024-01-23-=E4=BB=8A=E5=A4=A9=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=E4=B8=80=E4=B8=AAJDK=E7=BC=96=E8=AF=91=E5=99=A8?= =?UTF-8?q?=E7=9A=84bug.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...350\257\221\345\231\250\347\232\204bug.md" | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 "_posts/2024-01-23-\344\273\212\345\244\251\345\217\221\347\216\260\344\270\200\344\270\252JDK\347\274\226\350\257\221\345\231\250\347\232\204bug.md" diff --git "a/_posts/2024-01-23-\344\273\212\345\244\251\345\217\221\347\216\260\344\270\200\344\270\252JDK\347\274\226\350\257\221\345\231\250\347\232\204bug.md" "b/_posts/2024-01-23-\344\273\212\345\244\251\345\217\221\347\216\260\344\270\200\344\270\252JDK\347\274\226\350\257\221\345\231\250\347\232\204bug.md" new file mode 100644 index 0000000..cfa279e --- /dev/null +++ "b/_posts/2024-01-23-\344\273\212\345\244\251\345\217\221\347\216\260\344\270\200\344\270\252JDK\347\274\226\350\257\221\345\231\250\347\232\204bug.md" @@ -0,0 +1,91 @@ +--- +layout: post +title: "今天发现一个JDK编译器的bug" +date: 2024-01-23 11:29:20 +0800 +categories: + - java +tags: + - 编译器bug +--- + +平平淡淡的一天,正常写开发输出代码,但在打包编译时就懵了,编译出错,正常错误还好,根据提示修改即可,但这次报的却是`java.lang.StackOverflowError`。 + +我懵了:这ide也没提示有语法错误什么的啊,上个版本也能正常打包的啊 + +后来发现这可能是一个JDK编译器的bug, 具体情况是编译项目中的一个java类时,报`StackOverflowError`错误。 + +测试过以下jdk版本: +- oricaljdk-1.8.0_271 +- oricaljdk-17.0.8 +- openjdk-17.0.2 +- openjdk-21.0.1 + +以上版本编译统一都报错如下: +```shell +D:\workspace>javac Criteria.java + + +系统资源不足。 +有关详细信息, 请参阅以下堆栈跟踪。 +java.lang.StackOverflowError + at jdk.compiler/com.sun.tools.javac.code.Type.equalsIgnoreMetadata(Type.java:513) + at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.contains(Type.java:1150) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4769) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724) + at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681) + at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4739) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4724) + at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1011) + at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4771) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724) + at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681) + at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4739) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitClassType(Types.java:4724) + at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1011) + at jdk.compiler/com.sun.tools.javac.code.Types$UnaryVisitor.visit(Types.java:4980) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4771) + at jdk.compiler/com.sun.tools.javac.code.Types$Rewriter.visitTypeVar(Types.java:4724) + at jdk.compiler/com.sun.tools.javac.code.Type$TypeVar.accept(Type.java:1681) +``` +目前已经将bug上报了,等待官方反馈。 + +测试代码如下, 感兴趣的同学可以自己拿去`javac`编译下: + +```java +package test; +import java.io.Serializable; +import test.Criteria.Builder; + +@SuppressWarnings({ "unchecked", "rawtypes" }) +public class Criteria> implements Serializable { + private static final long serialVersionUID = 5066371601838698479L; + + protected Criteria() {} + + protected Criteria(B builder) { + } + + // 此处导致,做如下修改则能正常编译 + // 修改为 public static B builder() + public static , E extends Criteria> B builder() { + return (B) new Builder<>(); + } + + public static class Builder>> { + protected Builder() { + } + public Builder page() { + return this; + } + public C build() { + return (C) new Criteria>(this); + } + } +} + +``` + +等官方反馈后在续上