2008-10-28 4 views
19

단위 테스트를 실행할 때마다 읽을 필요가없는 파일의 바이트 데이터로 상당히 큰 바이트 배열 (8000 바이트 이상)을 정적으로 정의한 단위 테스트가 있습니다.javac 오류 "코드가 너무 큼"입니까?

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

이 이클립스 내에서 잘 컴파일,하지만 다음과 같은 오류 얻을 개미 스크립트를 통해 컴파일 할 때 : 나는이 문제를 방지 할 수있는 방법

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

어떤 아이디어 왜와?


대답 : 시므이의 대답은 트릭을했다. 나는 바이트 배열을 별도의 클래스로 옮겼다. 그리고 그것은 잘 컴파일되었다. 감사!

+0

그럼 왜 Eclipse에서 작동 했습니까 ?? – paxdiablo

+1

Eclipse가 Javac과 다른 컴파일러를 사용하고 있다는 것을 알고 있습니다. 어쩌면 그걸 설명 할거야. –

+0

아, 그래, 나는 그것을 잊었다. JDK 이전에 이클립스를 한 번만 설치하여 컴파일 된 것을 찾았습니다. 자신의 컴파일러가 내장되어 있다는 것을 알았을 때였습니다. – paxdiablo

답변

22

Java의 메소드는 바이트 코드에서 64k로 제한됩니다. 정적 초기화는 단일 방법으로 수행됩니다 (link 참조)
파일에서 배열 데이터를로드하려고 할 수 있습니다.

0

@BeforeClass 정적 메서드의 파일에서 바이트 배열을로드 할 수 있습니다. 이렇게하면 모든 유닛 테스트에 한 번만로드됩니다.

0

각 내부 클래스에는 자체 64KB 제한이 있으므로 활용할 수 있습니다. 내부 클래스는 기본 클래스와 동일한 정적 초기화 프로그램 제한을받습니다. 따라서 하나의 큰 배열을 사용하면 도움이되지 않을 수 있습니다. 그러나 배열을 별도의 클래스로 이동하여이 문제를 해결할 수 있다고 말씀 하셨으므로 주 클래스에서이 단일 배열 이상을로드하고있는 것으로 보입니다.

대신 :

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] 같은 값에 액세스 할 수 있지만 대신 64킬로바이트의 1백28킬로바이트 제한 대상입니다.

관련 문제