为了账号安全,请及时绑定邮箱和手机立即绑定

我的 for 循环中的 java.lang.OutOfMemoryError

我的 for 循环中的 java.lang.OutOfMemoryError

噜噜哒 2021-09-15 16:12:07
我正在尝试获取列表的大小,但出现错误:Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.OutOfMemoryError occurred dispatching signal UNKNOWN to handler- the VM may need to be forcibly terminatedException in thread "main"这是我的代码:public void wrapText(String text, int width)  {    List<String> items = new LinkedList<String>(Arrays.asList(text.split(" ")));    for(int j = 0; j < items.size(); j++){        items.add(width, "\n");    }    System.out.println(items);    /* this method needs to be improved - it currently does not wrap text */  //  System.out.println(text);  }我在这里做错了什么?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

每次迭代,您都会在列表中添加一个元素,从而增加它的大小。在每次迭代结束时,j < items.size()将始终 eval 为true,将您for变成无限循环,其调用堆栈最终会耗尽 JVM 的内存。


如果您只想为列表的初始长度重复 for 循环,只需将该值保存到循环之前的变量中并使用它而不是 .size()


int len = items.size();

for(int j = 0; j < len; j++){

    items.add(width, "\n");

}


查看完整回答
反对 回复 2021-09-15
?
临摹微笑

TA贡献1982条经验 获得超2个赞

您收到此错误的原因是因为您有一个无限循环。items.size()将永远大于 j。


那是因为您向列表中添加了一个项目,这意味着您将其大小加 1,并且由于您还在每次循环迭代中将 1 加到 j,因此 j 永远不会变得大于列表的大小。因此,循环永远不会停止。您可以添加一个变量int size = items.size(),然后将其放入循环中,而不是items.size()像下面这样:



List<String> items = new LinkedList<>(Arrays.asList(text.split(" ")));

int size = items.size();

for(int j = 0; j < size; j++){

    items.add(width, "\n");

}

System.out.println(items);

这将消除您遇到的错误


查看完整回答
反对 回复 2021-09-15
?
慕慕森

TA贡献1856条经验 获得超17个赞

我对你想要什么的理解。


   public void wrapText(String text, int width)

      {

        String resultingString="";

        for(String item : text.split(" ")){

            resultingString +=  item +"\n";

        }

        System.out.println(resultingString);

        /* this method needs to be improved - it currently does not wrap text */

      //  System.out.println(text);

      }


查看完整回答
反对 回复 2021-09-15
  • 3 回答
  • 0 关注
  • 300 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信