得到的StackOverflowError在初始化静态变量

SUMIT:

下面是一块代码,我偶然发现的最小可验证实施例。

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;
  }
}

当我试图编译它,它给我

错误:java的:java.lang.StackOverflowError的

任何人都可以点我在哪里,我错的呢?

在编译的时候我收到以下错误 javac test_package/TestClass.java

该系统是资源的出来。详细信息请参考下面的堆栈跟踪。java.lang.StackOverflowError的在com.sun.tools.javac.code.Scope.dupUnshared(Scope.java:144)在com.sun.tools.javac.comp.Attr.lambdaEnv(Attr.java:2639)在COM。 sun.tools.javac.comp.Attr.visitLambda(Attr.java:2305)在com.sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)在的com.sun.tools.javac。 comp.Attr.attribTree(Attr.java:576)在com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)在com.sun.tools.javac.tree.JCTree $ JCLambda.accept( JCTree.java:1624)在com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)在com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)在COM .sun.tools.javac.tree.JCTree $ JCLambda.accept(JCTree.java:1624)在com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)在的com.sun.tools.javac .comp.Attr.visitLambda(Attr.java:

和我的版本是 javac 1.8.0_112

由于在期待!

尤金:

它的bug,修复的javac-9。我尝试了最新的javac-9,它不会重现。

要解决这个问题,你可以这样做:

public static final String CONST_STR;

static {
    CONST_STR = " some_data " + getMoreData(e -> e.getId() == 3);
}

这似乎编译就好了...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章