Ошибка компиляции кода слишком велика в 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();
}