Como corrigir “O código do método .. está excedendo o limite de 65535 bytes”?

Eu tenho o seguinte código:

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

Eu recebo o seguinte erro ao tentar compilar isso:

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

Em java, os methods não podem ter mais de 65535 bytes.

Então, para corrigir esse problema, divida seu método main(String[] args) em vários sub-methods.

O código de erro parece bastante auto-explicativo.

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

Isso ocorre porque existe um limite arbitrário codificado em Java de 64 Kb para tamanhos de método. (E na verdade muitas outras coisas estão limitadas a 64K, como nomes de methods, o número de constantes, etc. Veja as especificações do Java 8 ou do Java 7 para mais detalhes.)

Para contornar isso, tudo o que você precisa fazer é dividir seu método main(String[] args) em múltiplos sub-methods.


Mas por que não apenas carregar os nomes de um arquivo?

Alguns dos problemas em fazer isso do jeito que você está propondo atualmente são:

  • Em primeiro lugar, você é um hard-coding details, que é quase sempre uma coisa ruim (veja isso );

  • em segundo lugar, você está recebendo essa mensagem de erro; e

  • em terceiro lugar, você torna seu código muito difícil de ler.

Há muitos mais, é claro, mas estes são os mais óbvios.

Inicializando o array de studentnames está contando para o tamanho do método principal. Como existem 9000 nomes de alunos, cada nome pode ter apenas 7 caracteres antes que você fique sem espaço. Como os outros afirmaram, você precisa reduzir o tamanho do método. Você pode dividi-lo em pedaços, como Pramod disse, mas neste caso, a maior parte do método é realmente dados. Eu faria como o Infiltrator diz e dividiria os nomes em um arquivo separado e apenas lê-lo no seu principal. Algo como commons-io pode ser usado para chegar efetivamente à mesma posição em que você está começando.

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

Você pode achar útil processar a lista em vez de convertê-la em uma matriz ou, alternativamente, usar um LineIterator

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

Gostaria de ler os nomes dos alunos de um arquivo, mas um trabalho em torno do qual irá tornar a class menor também

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

Em vez de definir e usar 9000 strings, isso usa apenas um. O limite para uma única string é de pouco mais de 2 bilhões.

O código do método main (String []) está excedendo o limite de 65535 bytes

Como seu erro diz que o método principal excede o limite de 65535 bytes.

Razão: Por que recebemos esse erro em nosso código?

  • Sabemos que a alocação de memory para array seria feita sequencialmente. ie; a memory seria alocada para a matriz se uma quantidade tão grande de espaço estivesse disponível na RAM continuamente.
  • Nós usamos o array String que contém algumas strings “9000” – que é muito grande para conter a memory.
  • A RAM pode não ter um espaço tão grande continuamente durante esse tempo, portanto, poderíamos ter esse erro.

Solução: Então, o que posso fazer por isso?

  • Para armazenar um valor de tamanho tão grande, podemos preferir um arquivo para leitura / gravação – para que possamos ler uma parte de um arquivo quando necessário
  • Podemos armazenar essas strings em um ArrayList que aumenta sua memory quando o elemento é adicionado a ele, em vez de alocar a memory em um todo inicialmente.

Você método é muito longo.

Crie methods diferentes para dividi-lo e torná-lo muito mais legível e passível de manutenção.

Apenas externalize Strings do seu código para um arquivo * .properties / xml / json. O NetBeans e / ou o Eclipse podem fazer isso para você com facilidade.