代码之家  ›  专栏  ›  技术社区  ›  sumit Kumar Vivek Mitra

初始化静态变量时获取StackOverflowerError

  •  8
  • sumit Kumar Vivek Mitra  · 技术社区  · 7 年前

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

    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.StackOverflower错误

    有人能告诉我哪里出了问题吗?

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

    系统资源不足。请参阅以下堆栈跟踪以了解 细节。Java语言lang.StackOverflowerr位于 通用域名格式。太阳工具。javac。密码范围dupUnshared(Scope.java:144)位于 通用域名格式。太阳工具。javac。公司。属性。lambdaEnv(属性java:2639)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2305)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624) 通用域名格式。太阳工具。javac。公司。属性。attribTree(Attr.java:576)位于 通用域名格式。太阳工具。javac。公司。属性。visitLambda(属性java:2435)位于 通用域名格式。太阳工具。javac。树JCTree$JCLambda。接受(JCTree.java:1624)。。。

    我的版本是 javac 1.8.0_112

    期待您的光临!

    1 回复  |  直到 7 年前
        1
  •  12
  •   Eugene    7 年前

    It's bug ,已在javac-9中修复。我尝试了最新的javac-9,但它无法复制。

    你可以做以下事情:

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

    似乎编译得很好。。。