Ошибка компиляции "слишком большой код" в Java
есть ли максимальный размер для кода в Java? Я написал функцию с более чем 10 000 строк. Фактически, каждая строка присваивает значение переменной массива.
arts_bag[10792]="newyorkartworld";
arts_bag[10793]="leningradschool";
arts_bag[10794]="mailart";
arts_bag[10795]="artspan";
arts_bag[10796]="watercolor";
arts_bag[10797]="sculptures";
arts_bag[10798]="stonesculpture";
и при компиляции, я получаю эту ошибку: код слишком большой
Как мне преодолеть это?
9 ответов:
один метод в классе Java может быть не более 64 КБ байт-кода.
но вы должны очистить это!
использовать
.propertiesфайл для хранения этих данных, и загрузить его черезjava.util.Propertiesвы можете сделать это, поместив
.propertiesфайл на пути к классу, и использовать:Properties properties = new Properties(); InputStream inputStream = getClass().getResourceAsStream("yourfile.properties"); properties.load(inputStream);
существует ограничение размера байт-кода 64K на метод
сказав это, я должен согласиться с Ричардом; зачем вам нужен такой большой метод? Учитывая пример в OP, файл свойств должен быть достаточным ... или даже базы данных, если требуется.
по словам спецификация виртуальной машины Java, a код метода не должен быть больше 65536 байт:
значение
code_lengthэлемент должен быть меньше, чем 65536.здесь
code_lengthопределена в §4.7.3 вCodeатрибут:
code_length: значениеcode_lengthitem дает количество байтов в массиве кода для этого метода. Значение длина кода должна быть больше нуля; массив кода не должен быть пустым.
code[]: массив кода дает фактические байты кода виртуальной машины Java, которые реализуют метод.
Это немного похоже на безумие. Вы не можете инициализировать массив, читая значения из текстового файла или другого источника данных?
Как уже упоминалось в других ответах, существует 64 КБ байт-кода для метода (по крайней мере, в Java-компиляторе Sun)
тоже мне было бы разумнее разбить этот метод на несколько методов - каждый назначает определенный связанный материал массиву (может иметь больше смысла использовать ArrayList для этого)
например:
public void addArrayItems() { addSculptureItems(list); ... } public void addSculptureItems(ArrayList list) { list.add("sculptures"); list.add("stonesculpture"); }в качестве альтернативы вы можете загрузить элементы из статического ресурса, если они фиксированы, как из файла свойств
Я сам столкнулся с этой проблемой. Решение, которое сработало для меня, было рефакторингом и сокращением метода до более управляемых частей. Как и вы, я имею дело с почти 10к методу. Однако с использованием статических переменных, а также меньших модульных функций проблема была решена.
кажется, что было бы лучше обходной путь, но с помощью Java 8, нет ни одного...
вы можете добавить другой метод для создания пространства для вашего кода для дополнительного пространства данных, у вас может быть метод, который занимает большой объем пространства данных. Попробуйте разделить свои методы, потому что у меня была такая же проблема, и исправить ее, создав другой дополнительный метод для тех же данных в моем коде java Android, проблема исчезла после того, как я это сделал.
эта ошибка иногда возникает из-за слишком большого кода в одной функции... Чтобы решить эту ошибку, разделите эту функцию на несколько функций, например
//Too large code function private void mySingleFunction(){ . . 2000 lines of code } //To solve the problem private void mySingleFunction_1(){ . . 500 lines of code } private void mySingleFunction_2(){ . . 500 lines of code } private void mySingleFunction_3(){ . . 500 lines of code } private void mySingleFunction_4(){ . . 500 lines of code } private void MySingleFunction(){ mySingleFunction_1(); mySingleFunction_2(); mySingleFunction_3(); mySingleFunction_4(); }
Comments