Ошибка javac "слишком большой код"?

У меня есть модульный тест, в котором я статически определил довольно большой байтовый массив (более 8000 байтов) как байтовые данные файла, который я не хочу читать каждый раз, когда я запускаю свой модульный тест.

private static final byte[] FILE_DATA = new byte[] {
12,-2,123,................
}

Это нормально компилируется в Eclipse, но при компиляции с помощью скрипта Ant я получаю следующую ошибку:

[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large
[javac]     private static final byte[] FILE_DATA = new byte[] {
[javac]                                 ^

Есть идеи, почему и как я могу этого избежать?


Отвечать: Ответ Шими сработал. Я переместил массив байтов в отдельный класс, и он отлично скомпилировался. Спасибо!

Так почему это сработало в Eclipse ??

paxdiablo 28.10.2008 15:44

Я знаю, что Eclipse использует другой компилятор, чем Javac. Может быть, это объяснит это.

Shimi Bandiel 28.10.2008 15:46

Ах да, я забыл об этом. Я установил Eclipse до JDK один раз только для того, чтобы найти его скомпилированным - именно тогда я узнал, что у него есть встроенный компилятор.

paxdiablo 29.10.2008 05:00

Я просто решил эту проблему, разделив инициализацию моих данных на 120 различных статических методов.

André Puel 22.10.2013 22:29

@paxdiablo Eclipse использует ECJ

Mauren 25.03.2014 18:20

Где документально подтверждено, что Eclipse использует другой компилятор? Это не имеет смысла, если в свойстве Java Compiler для проекта используется стандартный компилятор.

Richard Jessop 30.11.2019 00:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
20
6
14 567
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Методы в Java ограничены 64 КБ в байтовом коде. Статические инициализации выполняются одним методом (см. связь)
Вы можете попробовать загрузить данные массива из файла.

Вы можете загрузить массив байтов из файла в статический метод @BeforeClass. Это гарантирует, что он будет загружен только один раз для всех ваших модульных тестов.

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

Вместо:

private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>};

Пытаться:

private static final class FILE_DATA
{
    private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>};
}

Затем вы можете получить доступ к значениям как FILE_DATA.VALUES[i] вместо FILE_DATA[i], но вы ограничены 128 КБ вместо 64 КБ.

Другие вопросы по теме