Ошибка компиляции кода слишком велика в 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";
И во время компиляции я получаю эту ошибку: слишком большой код
Как мне это преодолеть?
Ответы
Ответ 1
Один метод в классе Java может содержать не более 64 Кбайт байт-кода.
Но вы должны очистить это!
Используйте .properties
файл для хранения этих данных и загрузите его через java.util.Properties
Вы можете сделать это, поместив файл .properties
в свой путь к классам и используя:
Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);
Ответ 2
Ограничение размера байта 64K на
Сказав это, я должен согласиться с Ричардом; зачем вам нужен такой метод? Учитывая пример в OP, файл свойств должен быть достаточным... или даже базу данных, если это необходимо.
Ответ 3
В соответствии с спецификацией Java Virtual Machine, код метод не должен превышать 65536 байт:
Значение элемента code_length
должно быть меньше 65536.
Где code_length
определяется в §4.7.3 Атрибут Code
:
code_length
: значение элемента code_length
дает количество байтов в массиве кодов для этого метода. Значение длины кода должно быть больше нуля; массив кода не должен быть пустым.
code[]
: массив кода предоставляет фактические байты кода виртуальной машины Java, которые реализуют этот метод.
Ответ 4
Это похоже на безумие. Не можете ли вы инициализировать массив, читая значения из текстового файла или другого источника данных?
Ответ 5
Попробуйте реорганизовать свой код. В Java существует ограничение на размер метода.
Ответ 6
Ничего себе, это плохо. Жесткие данные кодирования в вашей программе никогда не являются хорошей идеей в первую очередь. Жесткое кодирование тонны данных не лучше, и вы сталкиваетесь с ограничениями, описанными в других ответах.
Существует несколько способов исправить это, но следующее не должно нарушать какой-либо другой код.
public static String[] getTheArrayThing(){
List<String> list = new LinkedList<String>();
try {
BufferedReader br = new BufferedReader(new FileReader(<the file>));
String line = br.readLine();
while (line != null) {
list.add(line);
line = br.readLine();
}
} catch (Exception e){
throw new IllegalStateException("Couldn't load array file");
}
return list.toArray(new String[0]);
}
Базисно метод создает (и возвращает, но может так же легко редактировать переменную класса) массив, который содержит каждую строку файла в порядке.
Просто выгрузите значения в исходном примере (например, "newyorkartworld" ) в текстовый файл - в порядке - и используйте это для загрузки массива.
В то время как это простое замещение будет работать, есть гораздо более элегантное решение, если вы можете найти время, чтобы сделать небольшой рефакторинг.
Ответ 7
Как упоминалось в других ответах, существует ограничение на 64 Кбайт байта для метода (по крайней мере, в компиляторе Java)
Слишком мне было бы разумнее разбить этот метод на большее количество методов - каждый присваивает определенному связанному материалу массив (может иметь смысл использовать ArrayList для этого)
например:
public void addArrayItems()
{
addSculptureItems(list);
...
}
public void addSculptureItems(ArrayList list)
{
list.add("sculptures");
list.add("stonesculpture");
}
В качестве альтернативы вы можете загружать элементы из статического ресурса, если они фиксированы как из файла свойств
Ответ 8
Я столкнулся с этой проблемой сам. Решение, которое сработало для меня, состояло в том, чтобы реорганизовать и сжать метод до более управляемых частей. Как и вы, я имею дело с методом линии 10K. Однако с использованием статических переменных и небольших модульных функций проблема была решена.
Кажется, что было бы лучше обходное решение, но с использованием Java 8 нет...
Ответ 9
Вы можете добавить еще один способ создания пространства для вашего кода для дополнительного пространства данных, у вас может быть метод, который занимает большое количество пространства данных. Попробуйте делить свои методы, потому что у меня была такая же проблема, и исправить ее, создав еще один дополнительный метод для одних и тех же данных в моем java-коде Android. Проблема исчезла после того, как я это сделал.
Ответ 10
Эта ошибка иногда возникает из-за слишком большого кода в одной функции...
Чтобы решить эту ошибку, разделите эту функцию на несколько функций, например
//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();
}