java.lang.OutOfMemoryError в моем цикле for - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь получить размер списка, но получаю ошибку:

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 terminated
Exception 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 ]

0 голосов
/ 12 сентября 2018

Мое понимание того, что вы хотите.

   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);
      }
0 голосов
/ 12 сентября 2018

Причина, по которой вы получаете эту ошибку, в том, что у вас бесконечный цикл.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);

Это избавит вас от возникшей ошибки

0 голосов
/ 12 сентября 2018

На каждой итерации вы добавляете элемент в свой список, следовательно, увеличиваете его размер.В конце каждой итерации j < items.size() всегда будет равняться true, превращая ваш for в бесконечный цикл, который в результате его стека вызовов в конечном итоге истощит память JVM.

Если вы хотите повторитьцикл for только для начальной длины вашего списка, просто сохраните это значение в переменной до цикла и используйте его вместо .size()

int len = items.size();
for(int j = 0; j < len; j++){
    items.add(width, "\n");
}
...