Подтвердить что ты не робот

Javac error "code too large"?

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

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

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

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

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


Ответ: ответ Shimi сделал трюк. Я переместил массив байтов в отдельный класс и скомпилировал его. Спасибо!

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Вместо:

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

Try:

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 КБ.