2012-09-04 35 views
23

Tengo el siguiente código:Cómo solucionar "El código de método ... excede el límite de 65535 bytes"?

public static void main(String[] args) { 
    try { 
     String[] studentnames = { 
      /* this is an array of 9000 strings... */ 
     }; 
    } 
} 

me sale el siguiente error al intentar compilar este:

The code of method main(String[]) is exceeding the 65535 bytes limit 
+3

'La cantidad de código por método no nativo y no abstracto está limitada a 65536 bytes por los tamaños de los índices en la tabla de excepción del atributo Código (§4.7.3), en el atributo LineNumberTable (§4.7. 8), y en el atributo LocalVariableTable (§4.7.9) .' de acuerdo con java doc http://docs.oracle.com/javase/specs/#88659 –

+0

¿es 9000 o 90,000? – lsof

Respuesta

20

In java a methods can't have more than 65535 bytes.

Así que para solucionar este problema, divida su método main(String[] args) a múltiples métodos sub.

0

método Usted es demasiado largo.

Crea diferentes métodos para dividirlo y hacerlo mucho más legible y mantenible.

9

El código de error parece bastante autoexplicativo.

The code of method main(String[]) is exceeding the 65535 bytes limit 

Esto se debe a que existe un límite arbitrario codificado en Java de 64 Kb para los tamaños de los métodos. (Y, de hecho muchas otras cosas están limitadas a 64 K, tales como nombres de métodos, el número de constantes, etc. Ver la Java 8 specs o la Java 7 specs para más detalles.)

Para evitar esto, todo lo que tiene que hacer es descanso su método main(String[] args) en múltiples submétodos.


¿Pero por qué no simplemente cargar los nombres de un archivo en su lugar?

Algunos de los problemas con hacerlo de la manera que usted está proponiendo actualmente son:

  • en primer lugar, que está detalles de codificación duros, que es casi siempre una mala cosa (Ver this);

  • En segundo lugar, aparece el mensaje de error; y

  • En tercer lugar, hace que su código sea muy difícil de leer.

Hay muchos más, por supuesto, pero estos son los más obvios.

+0

¿por qué debería cargar desde un archivo? Todo lo que hago es tener una matriz y hacer una impresión de esa matriz. No tengo problemas para leer un archivo, pero quiero saber por qué deberíamos hacer eso ... Realmente no obtuve lo que el conjunto es –

+4

. Hay varios problemas: en primer lugar, tiene detalles difíciles de codificar, que casi siempre es una cosa mala; en segundo lugar, recibes ese mensaje de error; en tercer lugar, haces que tu código sea muy ilegible. Hay muchos más, por supuesto, pero estos son los más obvios. – Infiltrator

1

Al inicializar el conjunto de nombres de alumnos se cuenta el tamaño del método principal. Como hay 9000 nombres de estudiantes, cada nombre solo puede tener unos 7 caracteres antes de que se quede sin espacio. Como los otros han declarado que necesita reducir el tamaño del método. Puedes dividirlo en pedazos como dijo Pramod, pero en este caso la mayor parte del método es en realidad datos. Haría lo que dice Infiltrator y dividiría los nombres en un archivo separado y simplemente lo leería en su carpeta principal. Algo como commons-io se puede usar para llevarlo efectivamente a la misma posición en la que está comenzando.

List<String> namelist = FileUtils.readLines(new File("studentnames.txt")); 
String[] studentnames = namelist.toArray(new String[0]); 

Puede que le resulte útil para procesar la lista en lugar de convertirlo en una matriz o, alternativamente, se podría utilizar un LineIterator lugar

LineIterator it = FileUtils.lineIterator(file); 
try { 
    while (it.hasNext()) { 
     String line = it.nextLine(); 
     // do something with line 
    } 
} finally { 
    it.close(); 
} 
1

me gustaría leer los estudiantes nombres de un archivo sin embargo, una obra todo lo que hará que la clase más pequeña, así

String[] studentnames= "Student names is an array of :9000".split(" "); 

En lugar de definir y utilizar cadenas 9000, este utiliza sólo uno. El límite para una sola Cadena es poco más de 2 mil millones.

+0

Esto produce el mismo error: 'El código para el inicializador estático excede el límite de 65535 bytes'. – minipif

+0

@minipif ¿Puede explicar por qué es porque no es para mí? La cadena no está en un bloque de código por lo que no afecta el tamaño del bloque de código. –

+0

Traté de crear una cadena que contenga los primeros 100000 números primos separados por espacios, esta cadena tiene una longitud de 710485. Declaro que tiene 'final estático privado' pero obtengo el error 'El tipo genera una cadena que requiere más de 65535 bytes para codificar en formato Utf8 en el grupo constante'.Parece que no puede tener un literal de cadena (constante de cadena incrustada en el código fuente) de longitud superior a 65535. Por lo tanto, leerlo desde un archivo es obligatorio en ese caso. – minipif

1

The code of method main(String[]) is exceeding the 65535 bytes limit

Como su error dice que el método principal excede el límite de 65535 bytes.

Motivo: ¿Por qué tenemos este error en nuestro código?

  • Sabemos que la asignación de memoria para la matriz se realizará secuencialmente. es decir; la memoria se asignaría para la matriz si hay una gran cantidad de espacio disponible en la RAM de forma continua.
  • Hemos utilizado String array que contiene algunas cadenas "9000", que es demasiado grande para mantener en la memoria
  • La RAM puede no tener un espacio tan grande continuamente durante ese tiempo, así que podríamos haber obtenido ese error.

Solución: ¿Qué puedo hacer para esto?

  • Para almacenar un valor tan enorme tamaño podemos preferir archivo para lectura/escritura - por lo que podemos leer una parte de un archivo cuando se requiera
  • podemos almacenar esas cadenas en un ArrayList que crece su memoria cuando el elemento se agrega a él en lugar de asignar memoria en un todo inicialmente.
0

Just externalize Cadenas de su código a un archivo * .properties/xml/json. Netbeans y/o Eclipse pueden hacerlo por usted fácilmente.

Cuestiones relacionadas