Error de comstackción “Código demasiado grande” en Java

¿Hay algún tamaño máximo para el código en Java? Escribí una función con más de 10,000 líneas. En realidad, cada línea asigna un valor a una variable de matriz.

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

Y mientras compilo, obtengo este error: código demasiado grande

¿Cómo supero esto?

Un único método en una clase de Java puede tener como máximo 64 KB de bytecode.

¡Pero deberías limpiar esto!

Utilice el archivo .properties para almacenar esta información y java.util.Properties través de java.util.Properties

Puede hacer esto colocando el archivo .properties en su classpath, y use:

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

Hay un límite de tamaño de código de bytes de 64 KB en un método

Habiendo dicho eso, tengo que estar de acuerdo con Richard; ¿Por qué necesitas un método tan grande? Dado el ejemplo en el OP, un archivo de propiedades debería ser suficiente … o incluso una base de datos si es necesario.

De acuerdo con la especificación de Java Virtual Machine , el código de un método no debe ser mayor que 65536 bytes :

El valor del elemento code_length debe ser menor que 65536.

Donde code_length se define en §4.7.3 The Code Attribute :

code_length : el valor del elemento code_length proporciona la cantidad de bytes en la matriz de códigos para este método. El valor de code_length debe ser mayor que cero; la matriz de códigos no debe estar vacía.

code[] : el conjunto de códigos proporciona los bytes reales de código de máquina virtual Java que implementan el método.

Esto parece un poco como la locura. ¿No puede inicializar la matriz leyendo los valores de un archivo de texto o alguna otra fuente de datos?

Intenta refactorizar tu código. Existe un límite en el tamaño del método en Java.

Como se menciona en otras respuestas, hay 64 KB de límite de byte para un método (al menos en el comstackdor Java de Sun)

Demasiado para mí tendría más sentido dividir ese método en más métodos, cada uno asignando ciertas cosas relacionadas a la matriz (podría tener más sentido usar una ArrayList para hacer esto)

por ejemplo:

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

De forma alternativa, puede cargar los elementos desde un recurso estático si están fijos como desde un archivo de propiedades.

Me he encontrado con este problema yo mismo. La solución que funcionó para mí fue refactorizar y reducir el método a piezas más manejables. Al igual que usted, estoy lidiando con un método de línea de casi 10K. Sin embargo, con el uso de variables estáticas y funciones modulares más pequeñas, el problema se resolvió.

Parece que habría una solución mejor, pero al usar Java 8, no hay ninguna …

Puede agregar otro método para crear espacio para su código de espacio de datos adicional, es posible que tenga un método que está tomando una gran cantidad de espacio de datos. Trata de dividir tus métodos porque tuve el mismo problema y lo solucioné creando otro método adicional para los mismos datos en mi código Java de Android. El problema desapareció después de que lo hice.

Este error a veces ocurre debido a un código demasiado grande en una sola función … Para resolver ese error, divida esa función en funciones múltiples, como

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