初始化静态变量时获取StackOverflowError

sum*_*mit 8 java java-8

下面是我偶然发现的一段代码的最小可验证示例.

package test_package;

import java.util.function.Predicate;

public class TestClass {

  public static final String CONST_STR = " some_data "+ getMoreData(e -> e.getId()==3);

  private static String getMoreData(Predicate<TestEnum> p){
    StringBuilder sb = new StringBuilder();
    for(TestEnum e : TestEnum.values()){
      if(p.test(e)){
        sb.append(e.name());
      }
    }
    return sb.toString();
  }

  public static void main(String[] args) {
    System.out.println(CONST_STR);
  }
}

enum TestEnum{
  OP1(1),OP2(2),OP3(3);

  private final int id;

  public int getId() {
    return id;
  }

  TestEnum(int id){
    this.id = id;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我试图编译它给它我

错误:java:java.lang.StackOverflowError

任何人都可以指出我在哪里出错了吗?

我在尝试编译时遇到错误 javac test_package/TestClass.java

该系统资源不足.有关详细信息,请参阅以下堆栈跟踪 com.sun.tools.javac.code.Scope.dupUnshared(Scope.java:144)中的java.lang.StackOverflowError位于com的com.sun.tools.javac.comp.Attr.lambdaEnv(Attr.java:2639).在com.sun.tools.javac的com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)的sun.tools.javac.comp.Attr.visitLambda(Attr.java:2305). comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept( JCTree.java:1624)com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com .sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac .comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree (attr.java:576)com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTre e $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr. java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com .sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac .comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept (JCTree.java:1624)com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at at com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)位于com.sun.tools的com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576). javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)at com.sun.tools.ja vac.com.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree $ JCLambda.接受(JCTree.java:1624)...

我的版本是 javac 1.8.0_112

在预期中感谢!

Eug*_*ene 10

这是bug,在javac-9中修复.我尝试了最新的javac-9,它不会重现.

为了解决这个问题,你可以做到:

public static final String CONST_STR;

static {
    CONST_STR = " some_data " + getMoreData(e -> e.getId() == 3);
}
Run Code Online (Sandbox Code Playgroud)

这似乎编译得很好......