generated from cotes2020/chirpy-starter
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Create 2024-01-23-今天发现一个JDK编译器的bug.md
- Loading branch information
1 parent
53574a3
commit 1346838
Showing
1 changed file
with
91 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<B extends Builder<? extends Criteria>> implements Serializable { | ||
private static final long serialVersionUID = 5066371601838698479L; | ||
|
||
protected Criteria() {} | ||
|
||
protected Criteria(B builder) { | ||
} | ||
|
||
// 此处导致,做如下修改则能正常编译 | ||
// 修改为 public static <B extends Builder> B builder() | ||
public static <B extends Builder<E>, E extends Criteria<B>> B builder() { | ||
return (B) new Builder<>(); | ||
} | ||
|
||
public static class Builder<C extends Criteria<? extends Builder<C>>> { | ||
protected Builder() { | ||
} | ||
public Builder<C> page() { | ||
return this; | ||
} | ||
public C build() { | ||
return (C) new Criteria<Builder<C>>(this); | ||
} | ||
} | ||
} | ||
|
||
``` | ||
|
||
等官方反馈后在续上 |