java.lang.ClassFormatError: octets Supplémentaires à la fin du fichier de classe
Je suis une drôle d'erreur lorsque j'essaie d'exécuter ce programme. La classe compile amende en plusieurs .les fichiers de classe et j'ai compilé la semaine dernière (avant modification) l'amende juste. Mais maintenant, je vois ceci:
Exception in thread "main" java.lang.ClassFormatError: Extra bytes at the end of class file blah/hooplah/fubar/nonsense/IndexId$Transaction
De ce que j'ai regardé en haut, la version 6 de Java compiler la version 1.5 pu le résoudre, car il permet d'octets supplémentaires à la fin de la catégorie fichiers (je pense), mais je préférerais utiliser créer 1.6.
Je suis en train de monter sur Windows, puis FTP-ing .java fichiers sur un OpenVMS machine où je puis les compiler. après la compilation je déplace le .classe fichier dans un répertoire créé à partir de l'explosion de la précédente fichier jar et puis re-jar.
Toutes les idées claires sur la façon dont cela s'est passé ou comment résoudre le problème?
1.6.0_1 est positivement ancien maintenant, nous sommes tout le chemin jusqu'à 1.6.0_20 (ou du moins c'est ce que la version javac dit qu'il est sur ma machine)
HP met à jour java pour OpenVMS donc je suis coincé avec elle. En outre, Java 7 n'est pas trop loin
Envisager la compilation et de la distortion sur Windows aussi, et juste ftp le pot. Va vous rendre plus sain.
A la même question, la réponse pour moi est ce que BalusC dit dans les commentaires ci-dessous - assurez-vous que ftp en mode binaire, pas de texte.
OriginalL'auteur CheesePls | 2010-06-15
Vous devez vous connecter pour publier un commentaire.
C'est en effet interdits comme par VM Spec 4.9.1:
Cela peut se produire si il y a une incompatibilité dans le compilateur Java et Java runtime utilisé. Vérifiez que les deux versions et assurez-vous que vous compilez pour le droit versions du moteur d'exécution. I. e. la classe compilée peut être utilisé avec la même ou une plus récente version du moteur d'exécution, mais pas toujours avec les anciennes versions du moteur d'exécution. Vérifiez les versions à l'aide de
java -version
etjavac -version
.Une autre cause fréquente est que le fichier corrompu pendant le transfert de fichiers (FTP) entre les différentes machines. Ce transfert doit être fait en mode binaire plutôt qu'en mode texte.
Une autre cause possible est une erreur matérielle, par exemple corrompu disque dur/fichier/de la mémoire. Essayez de recompiler ou sur une autre machine.
OriginalL'auteur BalusC
Pour clarifier les choses: ce qui se passe après que vous avez nettoyé tous les anciens .les fichiers de classe et recompilé sur la même machine?
Ou êtes-vous de compiler sur une machine, et puis de copier les fichiers vers un autre? Si c'est le cas, alors il est probable que votre logiciel de transfert de fichiers est en train de corrompre les fichiers (Windows <-> Linux est une commune coupable, le plus souvent par l'ajout/retrait d'une 0x0D octet, mais de temps en temps en ajoutant un 0x1A DOS marqueur EOF).
Je pense que si vous vérifiez votre processus, vous verrez que quelque part vous êtes en modifiant les fichiers en dehors de Java. Il n'y a pas de raison, même les changements de version-pour un fichier produit par un valide compilateur Java pour avoir octets supplémentaires à la fin.
Vous avez besoin de FTP des fichiers de classe en tant que binaire non pas en tant que texte.
Je suis FTP-ing .fichiers java pas la .les fichiers de classe
Le transfert en mode binaire n'a pas fonctionné. La compression puis de l'envoyer en binaire puis en ouvrant ne fonctionne pas non plus
pour référence future, des remarques comme "je suis en train de monter sur Windows et la compilation sur OpenVMS" devraient aller dans votre question de départ, car ils fournissent des informations critiques. Vous ne devriez pas avoir un problème si tout ce que vous faites est FTP-ing la
.java
fichiers, mais je soupçonne fortement que vous êtes également la copie.class
fichiers. La meilleure façon de diagnostiquer ce problème est de créer entièrement de nouveaux répertoires de travail sur les deux machines. Copie juste .fichiers java dans Windows répertoire de travail, puis d'importer seulement les fichiers de ce répertoire vers le nouveau répertoire de travail sur OpenVMS. Puis compilateur sur OpenVMS.OriginalL'auteur Anon
Le problème a été résolu par la suppression de tous les retours à la Ligne de la .fichier java et correctement le renommer(OpenVMS les valeurs par défaut pour tous en bas de l'affaire, à moins de dit de ne pas m')
Malheureusement un échec de ma part par pas de test entre chaque, mais au moins il fonctionne.
En bref:
-Retours à la ligne sont mauvais ET Nom correctement les fichiers (Java normes pas OS normes)
OriginalL'auteur CheesePls
J'ai rencontré cette exception au cours du développement. Il me semble que l'Éclipse de la CJCE (Eclipse Luna) induit ce comportement. Pour moi, une nouvelle version a résolu le problème.
OriginalL'auteur Gernot Krost
J'ai eu le même problème. J'ai essayé d'écrire une classe sur mon PC de bureau et transfert à notre client serveur pour tester quelque chose< car il n'y avait pas de JDK sur cette machine. J'ai utilisé la même version de java sur les deux machines, mais après un transfert que j'ai eu cette Exception.
J'ai essayé d'utiliser le programme d'archivage avant de les transférer et il a aidé.
OriginalL'auteur MaxNevermind