[java] Java의 “코드가 너무 큼”컴파일 오류

Java에서 코드의 최대 크기가 있습니까? 10,000 줄이 넘는 함수를 작성했습니다. 실제로 각 줄은 배열 변수에 값을 할당합니다.

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";

컴파일하는 동안이 오류가 발생합니다. 코드가 너무 큽니다.

이것을 어떻게 극복합니까?



답변

Java 클래스의 단일 메소드는 최대 64KB의 바이트 코드 일 수 있습니다.

그러나 이것을 정리해야합니다!

사용하여 .properties파일이 데이터를 저장하고,를 통해 그것을로드java.util.Properties

.properties클래스 경로에 파일을 배치하여이를 수행 하고 다음을 사용할 수 있습니다.

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);


답변

메서드 에 64K 바이트 코드 크기 제한이 있습니다.

그렇게 말했지만, 나는 리처드와 동의해야합니다. 왜 그렇게 큰 방법이 필요한가요? OP의 예가 주어지면 속성 파일로도 충분하거나 필요한 경우 데이터베이스로도 충분합니다.


답변

에 따르면 Java 가상 머신 사양 , 메소드의 코드는보다 큰 65536 바이트 안 :

code_length항목 의 값은 code이 메서드 에 대한 배열 의 바이트 수를 제공합니다 .

code_length의 값은 0보다 크고 (코드 배열이 비어 있지 않아야하므로) 65536보다 작아야합니다.

code_lengthcode[]메소드의 실제 바이트 코드를 포함 하는 속성 의 크기를 정의합니다 .

code배열 방법을 구현하는 자바 가상 머신 코드의 실제 바이트를 제공합니다.


답변

이것은 광기처럼 보입니다. 텍스트 파일이나 다른 데이터 소스에서 값을 읽어 배열을 초기화 할 수 없습니까?


답변

이 오류는 단일 함수에서 너무 큰 코드로 인해 가끔 발생합니다.이 오류를 해결하려면 해당 함수를 다음과 같이 여러 함수로 분할하십시오.

//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();
}


답변

코드를 리팩터링하십시오. Java에서는 메소드 크기에 제한이 있습니다.


답변

다른 답변에서 언급했듯이 메서드에 대해 64KB의 바이트 코드 제한이 있습니다 (적어도 Sun의 Java 컴파일러에서는)

나에게도 그 메서드를 더 많은 메서드로 나누는 것이 더 합리적 일 것입니다. 각각은 특정 관련 항목을 배열에 할당합니다 (이 작업을 수행하기 위해 ArrayList를 사용하는 것이 더 합리적 일 수 있음).

예를 들면 :

public void addArrayItems()
{
  addSculptureItems(list);
  ...
}

public void addSculptureItems(ArrayList list)
{
  list.add("sculptures");
  list.add("stonesculpture");
}

또는 속성 파일 에서처럼 고정 된 경우 정적 리소스에서 항목을로드 할 수 있습니다.