"Слишком большой код" ошибка компиляции в Java
Есть ли максимальный размер кода в 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";
И во время компиляции я получаю эту ошибку: слишком большой код
Как мне преодолеть это?
14 ответов
Один метод в классе Java может содержать не более 64 КБ байтового кода.
Но вы должны очистить это!
использование .properties
файл для хранения этих данных и загрузки их через java.util.Properties
Вы можете сделать это, разместив .properties
файл на вашем classpath, и используйте:
Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);
Для метода существует ограничение размера байт-кода в 64 КБ.
Сказав это, я должен согласиться с Ричардом; зачем вам такой большой метод? Учитывая пример в OP, файл свойств должен быть достаточным... или даже база данных, если требуется.
Согласно спецификации виртуальной машины Java, код метода не должен быть больше 65536 байт:
Значение
code_length
элемент должен быть меньше 65536.
куда code_length
определено в §4.7.3. Code
Атрибут:
code_length
: Значениеcode_length
Элемент дает число байтов в массиве кода для этого метода. Значение code_length должно быть больше нуля; массив кода не должен быть пустым.
code[]
: Массив кода предоставляет фактические байты кода виртуальной машины Java, который реализует метод.
Это похоже на безумие. Не можете ли вы инициализировать массив, читая значения из текстового файла или другого источника данных?
Эта ошибка иногда возникает из-за слишком большого кода в одной функции... Чтобы решить эту ошибку, разбейте эту функцию на несколько функций, например
//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();
}
Попробуйте рефакторинг вашего кода. Существует ограничение на размер метода в Java.
Как упоминалось в других ответах, для метода есть ограничение в 64 КБ (по крайней мере, в Java-компиляторе Sun)
Кроме того, было бы более разумно разбить этот метод на несколько методов, каждый из которых назначает определенные связанные вещи в массив (для этого может иметь смысл использовать ArrayList)
например:
public void addArrayItems()
{
addSculptureItems(list);
...
}
public void addSculptureItems(ArrayList list)
{
list.add("sculptures");
list.add("stonesculpture");
}
В качестве альтернативы вы можете загрузить элементы из статического ресурса, если они зафиксированы как из файла свойств
Я сам столкнулся с этой проблемой. Решение, которое работало для меня, состояло в том, чтобы реорганизовать и сократить метод до более управляемых частей. Как и вы, я имею дело с почти линейным методом. Однако, с использованием статических переменных, а также меньших модульных функций, проблема была решена.
Кажется, будет лучший обходной путь, но с использованием Java 8 его нет...
Я пришел к этому вопросу, потому что пытался решить аналогичную проблему. Я хотел жестко закодировать график, содержащий 1600 элементов, в двумерный целочисленный массив из соображений производительности. Я решал проблему на веб-сайте в стиле leetcode, и загрузка данных графика из файла была невозможна. Весь график превысил максимум 64 КБ, поэтому я не смог выполнить ни одного статического выполнения заданий. Я разделил назначения на несколько статических методов, каждый из которых ниже предела, а затем вызвал каждый метод один за другим.
private static int[][] G = new int[1601][];
static {
assignFirst250();
assignSecond250();
assignSecond500();
assignThird500();
}
private static void assignFirst250() {
G[1] = new int[]{3,8,15,24,35,48,63,80,99,120,143,168,195,224,255,288,323,360,399,440,483,528,575,624,675,728,783,840,899,960,1023,1088,1155,1224,1295,1368,1443,1520,1599};
G[2] = new int[]{2,7,14,23,34,47,62,79,98,119,142,167,194,223,254,287,322,359,398,439,482,527,574,623,674,727,782,839,898,959,1022,1087,1154,1223,1294,1367,1442,1519,1598};
У меня есть перечисление, из-за которого размер файла.java превышает 500 КБ. Eclipse может его построить по какой-то причине; экспортированный из eclipse файл ant build.xml не может. Я изучаю это и обновлю этот пост.
Вы можете добавить другой метод, чтобы создать пространство для своего кода для дополнительного пространства данных, у вас может быть метод, который занимает большой объем пространства данных. Попробуйте разделить ваши методы, потому что у меня была та же проблема, и исправить ее, создав еще один дополнительный метод для тех же данных в моем коде Java Java. Проблема исчезла после того, как я это сделал.
Это связано с тем, что весь код находится в решении для одного метода: создайте еще несколько небольших методов, тогда эта ошибка исчезнет
Поскольку существует ограничение на размер методов, и вы не хотите переделывать свой код в этот момент, возможно, вы можете разделить массив на 4-5 частей, а затем поместить их в разные методы. Во время чтения массива вызовите все методы в серии. Вы также можете вести счетчик, чтобы знать, сколько индексов вы проанализировали.
Хорошо , может быть, этот ответ слишком поздно, но я думаю, что этот способ лучше, чем другой, поэтому
например, у нас есть данные 1000 строк в коде
сломать их
private void rows500() { //you shoud write 1-500 rows here } private void rows1000() { you shoud write 500-1000 rows here }
для лучшей производительности поставьте в код "если"
if (count < 500) { rows500(); } else if (count > 500) { rows1000(); }
Надеюсь, этот код поможет вам