«Слишком большой код» ошибка компиляции в Java - PullRequest
80 голосов
/ 09 марта 2010

Есть ли максимальный размер кода в Java? Я написал функцию с более чем 10000 строк. Фактически, каждая строка присваивает значение переменной массива.

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 ]

81 голосов
/ 09 марта 2010

Один метод в классе Java может содержать не более 64 КБ байтового кода.

Но ты должен очистить это!

Используйте файл .properties для хранения этих данных и загрузите их через java.util.Properties

Вы можете сделать это, поместив файл .properties в ваш путь к классам и использовать:

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);
12 голосов
/ 09 марта 2010

Существует ограничение размера байт-кода в 64 КБ для метода

Сказав это, я должен согласиться с Ричардом; зачем вам такой большой метод? Учитывая пример в OP, файла свойств должно хватить ... или даже базы данных, если требуется.

10 голосов
/ 09 марта 2010

Согласно спецификации виртуальной машины Java , a код метода не должен быть больше 65536 байт :

Значение элемента code_length должно быть меньше 65536.

Где code_length определено в §4.7.3 Атрибут Code :

code_length: значение элемента code_length дает количество байтов в массиве кода для этого метода. Значение code_length должно быть больше нуля; массив кода не должен быть пустым.

code[]: Массив кода предоставляет фактические байты кода виртуальной машины Java, который реализует метод.

9 голосов
/ 09 марта 2010

Это похоже на безумие. Разве вы не можете инициализировать массив, читая значения из текстового файла или другого источника данных?

3 голосов
/ 09 марта 2010

Попробуйте рефакторинг вашего кода. Существует ограничение на размер метода в Java.

2 голосов
/ 09 марта 2010

Как упоминалось в других ответах, для метода есть ограничение в 64 КБ (по крайней мере, в Java-компиляторе Sun)

Слишком мне было бы логичнее разбить этот метод на несколько методов - каждый из которых присваивает массиву определенные связанные вещи (для этого может иметь смысл использовать ArrayList)

например:

public void addArrayItems()
{
  addSculptureItems(list);
  ...
}

public void addSculptureItems(ArrayList list)
{
  list.add("sculptures");
  list.add("stonesculpture");
}

В качестве альтернативы вы можете загрузить элементы из статического ресурса, если они зафиксированы, как в файле свойств

1 голос
/ 23 декабря 2015

Вы можете добавить другой метод, чтобы создать пространство для вашего кода для дополнительного пространства данных, у вас может быть метод, который занимает большой объем пространства данных. Попробуйте разделить ваши методы, потому что у меня была та же проблема, и исправьте ее, создав еще один дополнительный метод для тех же данных в моем коде Java Java. Проблема исчезла после того, как я это сделал.

1 голос
/ 27 сентября 2014

Я сам столкнулся с этой проблемой. Решение, которое работало для меня, состояло в том, чтобы реорганизовать и сократить метод до более управляемых частей. Как и вы, я имею дело с почти линейным методом. Однако с использованием статических переменных, а также меньших модульных функций проблема была решена.

Кажется, было бы лучшее решение, но при использовании Java 8 его нет ...

0 голосов
/ 23 июля 2017

Эта ошибка иногда возникает из-за слишком большого кода в одной функции ... Чтобы устранить эту ошибку, разбейте эту функцию на несколько функций, например

//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();
}
...