web-dev-qa-db-fra.com

Comment réparer "Le code de la méthode .. dépasse la limite de 65 535 octets"?

J'ai le code suivant:

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

J'obtiens l'erreur suivante en essayant de compiler ceci:

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

En Java, une méthode ne peut pas avoir plus de 65 535 octets.

Donc, pour résoudre ce problème, divisez votre méthode main(String[] args) en plusieurs méthodes secondaires.

23
Pramod Kumar

Le code d'erreur semble assez explicite.

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

En effet, il existe une limite arbitraire codée en dur en Java de 64 Ko pour la taille des méthodes. (Et en réalité beaucoup d'autres choses sont limitées à 64 Ko, telles que les noms de méthodes, le nombre de constantes, etc. Voir les spécifications Java 8 ou les spécifications Java 7 pour plus de détails.)

Pour contourner ce problème, tout ce que vous avez à faire est de diviser votre méthode main(String[] args) en plusieurs sous-méthodes.


Mais pourquoi ne pas simplement charger les noms d'un fichier à la place?

Certains des problèmes liés à la manière dont vous proposez actuellement sont les suivants:

  • premièrement, vous codez en dur, ce qui est presque toujours une mauvaise chose (voir ceci );

  • deuxièmement, vous obtenez ce message d'erreur. et

  • troisièmement, votre code est très difficile à lire.

Il y en a beaucoup plus, bien sûr, mais ce sont les plus évidentes.

11
Infiltrator

Initialiser le tableau studentnames compte pour la taille de la méthode principale. Comme il y a 9 000 noms d'étudiants, chaque nom ne peut contenir que 7 caractères avant de manquer d'espace. Comme les autres l'ont indiqué, vous devez réduire la taille de la méthode. Comme Pramod l'a dit, vous pouvez le diviser en plusieurs parties, mais dans ce cas, le gros de la méthode est constitué de données. Je ferais ce que dit Infiltrator, scindais les noms dans un fichier séparé et lisais-le simplement dans ton dossier principal. Quelque chose comme commons-io peut être utilisé pour vous amener effectivement à la même position que vous commencez po 

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

Vous trouverez peut-être utile de traiter la liste plutôt que de la convertir en tableau ou d'utiliser un LineIterator à la place.

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

Je voudrais lire les noms des étudiants à partir d’un fichier, mais un travail autour duquel la classe sera réduite

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

Au lieu de définir et d'utiliser 9 000 chaînes, cela n'en utilise qu'une. La limite pour une seule chaîne est légèrement supérieure à 2 milliards.

1
Peter Lawrey

Le code de la méthode main (String []) dépasse la limite de 65 535 octets. 

Comme votre erreur le dit, la méthode principale dépasse la limite de 65 535 octets.

Raison: Pourquoi nous avons cette erreur dans notre code?

  • Nous savons que l’allocation de mémoire pour array serait effectuée séquentiellement. c'est à dire; la mémoire serait allouée à la matrice si une telle quantité d'espace est disponible en permanence dans RAM.
  • Nous avons utilisé un tableau de chaînes contenant des chaînes "9000" - trop volumineuses pour être stockées en mémoire. 
  • La RAM pourrait ne pas avoir un espace aussi vaste de façon continue pendant cette période, donc nous aurions peut-être eu cette erreur.

Solution: Que puis-je faire pour cela?

  • Pour stocker une valeur aussi énorme, nous préférerons peut-être un fichier en lecture/écriture - nous pourrons ainsi lire une partie du fichier si nécessaire
  • Nous pouvons stocker ces chaînes dans un ArrayList qui augmente sa mémoire lorsque l'élément y est ajouté au lieu d'allouer initialement de la mémoire sur un tout.
1
rm -rf star

Il suffit d'externaliser des chaînes de votre code dans un fichier * .properties/xml/json. Netbeans et/ou Eclipse peuvent le faire pour vous facilement.

0
Rogerio

Votre méthode est trop longue.

Créez différentes méthodes pour le scinder et le rendre beaucoup plus lisible et maintenable.

0
user1565007