it-swarm.dev

Erreur de compilation "Code too large" en Java

Existe-t-il une taille maximale pour le code en Java? J'ai écrit une fonction avec plus de 10 000 lignes. En réalité, chaque ligne attribue une valeur à une variable de tableau. 

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

Et lors de la compilation, j'obtiens cette erreur: code trop gros

Comment puis-je surmonter cela? 

78
trinity

Une seule méthode dans une classe Java peut contenir au plus 64 Ko de bytecode.

Mais vous devriez nettoyer cela!

Utilisez le fichier .properties pour stocker ces données et chargez-le via Java.util.Properties

Vous pouvez le faire en plaçant le fichier .properties sur votre chemin de classe et utilisez:

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

Il y a une limite de taille de code en octets 64K sur une méthode

Cela dit, je suis d’accord avec Richard; pourquoi avez-vous besoin d'une méthode aussi large? Étant donné l'exemple de l'OP, un fichier de propriétés devrait suffire ... ou même une base de données si nécessaire.

11
Everyone

Selon la spécification Java Virtual Machine , a le code d'une méthode ne doit pas dépasser 65 536 octets :

La valeur de l'élément code_length doit être inférieure à 65536.

code_length est défini dans §4.7.3 L'attribut Code :

code_length: La valeur de l'item code_length donne le nombre d'octets dans le tableau de code pour cette méthode. La valeur de code_length doit être supérieure à zéro; le tableau de code ne doit pas être vide.

code[]: le tableau de code donne les octets réels du code de la machine virtuelle Java qui implémente la méthode.

10
Joachim Sauer

Cela ressemble un peu à la folie. Ne pouvez-vous pas initialiser le tableau en lisant les valeurs d'un fichier texte ou d'une autre source de données?

9
RichardOD

Essayez de refactoriser votre code. La taille de la méthode est limitée en Java.

3
Padmarag

Comme mentionné dans d'autres réponses, il existe une limite de 64 Ko de bytecode pour une méthode (au moins dans le compilateur Java de Sun)

Il serait également plus logique de diviser cette méthode en plusieurs méthodes, chacune affectant certains éléments liés au tableau (il serait peut-être plus judicieux d'utiliser un ArrayList pour le faire)

par exemple:

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

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

Sinon, vous pouvez charger les éléments à partir d'une ressource statique s'ils sont corrigés comme dans un fichier de propriétés.

2
saret

Vous pouvez ajouter une autre méthode pour créer de l'espace pour votre code pour un espace de données supplémentaire. Vous pouvez utiliser une méthode prenant beaucoup d'espace de données. Essayez de diviser vos méthodes parce que j'ai le même problème et corrigez-le en créant une autre méthode supplémentaire pour les mêmes données dans mon code Java Android.

1
FermDroi

J'ai rencontré ce problème moi-même. La solution qui a fonctionné pour moi a été de refactoriser et de réduire la méthode à des éléments plus faciles à gérer. Comme vous, je suis confronté à une méthode de ligne proche de 10K. Cependant, avec l’utilisation de variables statiques et de fonctions modulaires plus petites, le problème a été résolu.

Il semblerait qu'il y aurait une meilleure solution de contournement, mais en utilisant Java 8, il n'y en a pas ...

1
Azadi B.

Cette erreur est parfois due à un code trop volumineux dans une seule fonction .... Pour résoudre cette erreur, divisez cette fonction en plusieurs fonctions, telles que

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