OutOfMemoryError: Java heap space при обычном вызове метода

181
04 декабря 2017, 16:44

При повторном вызове program.Menu(); и добавлении нового элемента в список - вылетает Exeption:

OutOfMemoryError: Java heap space

public class Start {
    public static void main(String[] args) {
        SanyaArray program = new SanyaArray();
        program.Start();
        program.Menu();
    }
}

public class SanyaArray extends Menus  {
    Menus menus = new Menus();
    void Start(){// Создание списка и указание размера.
        menus.startMenu();
        menus.arraySize(menus.getArray());
        menus.printMainMenu();
        System.out.println(menus.getArray());
    }
    void Menu(){//Вызов Главного меню с ф-циями.Меню доступно если список уже создан.
        if (menus.getArray().equals(null)){
            System.out.println("Для управления списком - сначало создайте его с помощью Start.");
        }else {
            menus.printMainMenu();
        }
    }
}

public class Menus implements Functions{
    private ArrayList<Integer> array;

    public ArrayList<Integer> getArray() {
        return array;
    }
    public void setArray(ArrayList<Integer> array) {
        this.array = array;
    }

    @Override
    public void add(ArrayList<Integer> array) { //закончить
        System.out.println("Введите целое число для добавления в список.");
        int element = getInteger(4);
        for (int i = 0; i < array.size(); i++) { //переписать
            int a = array.get(i) + element;
            array.add(i,a);
        }
        array.add(element);
        System.out.println("Готово.");

    }
    @Override
    public void delete(ArrayList<Integer> array) {
        System.out.println("Введите индекс для удаления элемента.");
        int index = getInteger(2);
        if (getArray().size()<index) {
            for (int i = 0; i < array.size(); i++) {
                int a = array.get(i) - array.get(index);
                array.add(i, a);
            }
        }else {
            System.out.println("Ошибка, размер списка " + getArray().size());
        }
        array.remove(index);
    }
    @Override
    public void find(ArrayList<Integer> array) {
        System.out.println("Введите элемент для поиска.");
        int element = getInteger(3);
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i) == element){
                System.out.println("We found you'r element at index " + i + "Element : " + element);
            }
        }
    }
    @Override
    public void findElementByIndex(ArrayList<Integer> array) {
        System.out.println("Введите индекс.");
        int index = getInteger(2);
        System.out.println("Index : " + index + " Element : " + array.get(index));
    }
    @Override
    public void maxValue(ArrayList<Integer> array) {
        System.out.println("MaxValue in array : " + Collections.max(array));
    }
    @Override
    public void minValue(ArrayList<Integer> array) {
        System.out.println("MinValue in array : " + Collections.min(array));
    }
    @Override
    public void averageElement(ArrayList<Integer> array) {
        double averageElement;
        int sum = 0;
        for (int i = 0; i < array.size(); i++) {
            sum += array.get(i);
        }
        averageElement = sum / 2;
        System.out.println("Average Element : " + averageElement);
    }
    public int startMenu() {
        System.out.println("Добрый день! \nСделайте выбор:\n1)Cоздать список.\n2)Выход");
        int choice = getInteger(4);
        if (choice == 1) {return choice;}
        if (choice==2) {System.exit(0);}
        return choice;
    }
    public void arraySize(ArrayList<Integer> array) {
        System.out.println("Введите размер списка : \n0) Выход ");
        int choice = getInteger(2);
        if (choice > 0) {
            setArray(new ArrayList<>(choice));
            return;
        }
        if (choice == 0) {
            System.exit(0);
        }
    }
    public void printMainMenu() { //закончить
        System.out.println("Выберите следующие действие с списком : "); //последующие меню
        System.out.println("1)Добавить элемент");
        System.out.println("2)Удалить элемент");
        System.out.println("3)Найти элемент по значению");
        System.out.println("4)Найти элемент по индексу");
        System.out.println("5)Показать максимальное значение в списке");
        System.out.println("6)Показать минимальное значение в списке");
        System.out.println("7)Найти среднее арифметическое всех значений");
        System.out.println("0)Выход");
        int choice = getInteger(1);
        switch (choice) {
            case 1:
                add(getArray());
                break;
            case 2:
                delete(getArray());
                break;
            case 3:
                find(getArray());
                break;
            case 4:
                findElementByIndex(getArray());
                break;
            case 5:
                maxValue(getArray());
                break;
            case 6:
                minValue(getArray());
                break;
            case 7:
                averageElement(getArray());
                break;
            case 0:
                System.exit(0);
                break;
        }
    }
    // В параметрах метода нужно передать нужный вариант операции.
    // 1) Введите число от 1 до 7
    // 2) Целое позитивное число, которое больше или равно 0.
    // 3) Любое целое число.
    // 4) Целое позитивное число, которое больше 0.
    public int getInteger(int option) {//метод для получения чисел.
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int element = 0;
        if (option == 1) {
            while (true) {
                try {
                    element = Integer.parseInt(reader.readLine());
                    if (element > 0 && element < 8) {
                        break;
                    } else {
                        System.out.println("Введите число от 1 до 7.");
                        continue;
                    }
                } catch (Exception e) {
                    System.out.println("Ошибка ввода,введите целое число!");
                }
            }
        }
        if (option == 2) {
            while (true) {
                try {
                    element = Integer.parseInt(reader.readLine());
                    if (element >= 0) {
                        break;
                    } else {
                        System.out.println("Введите позитивное число,которое больше или равно 0!");
                        continue;
                    }
                } catch (Exception e) {
                    System.out.println("Ошибка ввода,введите целое число!");
                }
            }
        }
        if (option == 3) {
            while (true) {
                try {
                    element = Integer.parseInt(reader.readLine());
                } catch (Exception e) {
                    System.out.println("Ошибка ввода,введите целое число!");
                }
            }
        }
        if (option == 4) {
            while (true) {
                try {
                    element = Integer.parseInt(reader.readLine());
                    if (element > 0) {
                        break;
                    } else {
                        System.out.println("Введите позитивное число,которое больше 0!");
                        continue;
                    }
                } catch (Exception e) {
                    System.out.println("Ошибка ввода,введите целое число!");
                }
            }
        }
        return element;
    }
}

Ход работы программы:

Добрый день! 
Сделайте выбор:
1)Cоздать список.
2)Выход
1
Введите размер списка : 
0) Выход 
123
Выберите следующие действие с списком : 
1)Добавить элемент
2)Удалить элемент
3)Найти элемент по значению
4)Найти элемент по индексу
5)Показать максимальное значение в списке
6)Показать минимальное значение в списке
7)Найти среднее арифметическое всех значений
0)Выход
1
Введите целое число для добавления в список.
32
Готово.
[32]
Выберите следующие действие с списком : 
1)Добавить элемент
2)Удалить элемент
3)Найти элемент по значению
4)Найти элемент по индексу
5)Показать максимальное значение в списке
6)Показать минимальное значение в списке
7)Найти среднее арифметическое всех значений
0)Выход
1
Введите целое число для добавления в список.
32
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.base/java.util.Arrays.copyOf(Arrays.java:3719)
    at java.base/java.util.Arrays.copyOf(Arrays.java:3688)
    at java.base/java.util.ArrayList.grow(ArrayList.java:237)
    at java.base/java.util.ArrayList.grow(ArrayList.java:242)
    at java.base/java.util.ArrayList.add(ArrayList.java:499)
    at Menus.add(Menus.java:29)
    at Menus.printMainMenu(Menus.java:130)
    at SanyaArray.Menu(SanyaArray.java:20)
    at Start.main(Start.java:5)
Process finished with exit code 1
Answer 1

Every time you are in the inner for loop you add a new element to array. Since the loop condition specifies to continue while i < array.size(), i starts out less than the size, and you add one to both every time, i never reaches array.size() and you keep adding elements until the heap space runs out.

READ ALSO
Required java.lang.String[] found java.lang.String

Required java.lang.String[] found java.lang.String

Добрый день, столкнулся со следующей проблемойСоздал массив и инициализировал в нем элементы

156
Android контекстное меню

Android контекстное меню

Здравствуйте, вопрос по androidУ меня есть двухуровневый список и всплывающее контекстное меню, подскажите пожалуйста как мне добыть id группы...

126
Есть ли аналог datalist? (input с поиском плюс select)

Есть ли аналог datalist? (input с поиском плюс select)

Chosen и подобные не подходят, тк

195
Плагин jQuery для Select по типу datalist?

Плагин jQuery для Select по типу datalist?

Стандартные, такие как Chosen или Select2 не подходят, тк

169