2010-06-15 17 views
8

Recibo un error extraño cuando intento ejecutar este programa. La clase compila bien en múltiples archivos .class y la compilé la semana pasada (antes de editarla) bien. Pero ahora, veo esto:java.lang.ClassFormatError: bytes adicionales al final del archivo de clase

Exception in thread "main" java.lang.ClassFormatError: Extra bytes at the end of class file blah/hooplah/fubar/nonsense/IndexId$Transaction 

Por lo que he mirado hacia arriba, Java 6 build 1.5 podría solucionarlo, ya que permite bytes adicionales al final de los archivos de clase (creo), pero me gustaría mucho más usar build 1.6.

Estoy editando en Windows y luego transfiriendo los archivos .java a una máquina OpenVMS donde los compilo. Después de compilar, muevo el archivo .class a un directorio creado a partir de la explosión del archivo jar anterior y luego vuelva a jar.

¿Alguna idea clara de cómo sucedió esto o cómo solucionarlo?

+0

Java 6.0 build 1.6.0-1 ------ También es Java SE si importa que – CheesePls

+0

1.6.0_1 sea realmente antiguo ahora; estamos hasta 1.6.0_20 (o al menos eso es lo que la versión javac dice que está en mi máquina) – Powerlord

+0

HP mantiene java para OpenVMS, así que estoy atascado con él. Además, Java 7 no está demasiado lejos – CheesePls

Respuesta

2

El problema se resolvió mediante la eliminación de todos los avances de línea desde el archivo .java y adecuadamente el cambio de nombre (OpenVMS defecto es todo en minúsculas a menos que no)

Lamentablemente un fracaso de mi parte al no probar entre cada uno, pero al menos funciona

En resumen:

-Line feeds son malos y archivos Nombre adecuadamente (normas estándares de Java no OS)

5

Este es de hecho no permitidos según VM Spec 4.9.1:

The class file must not be truncated or have extra bytes at the end.

Esto puede ocurrir si hay una incompatibilidad en el compilador Java y tiempo de ejecución Java utilizado. Verifique ambas versiones y asegúrese de compilar para las versiones correctas de tiempo de ejecución. Es decir. la clase compilada se puede usar con la misma o más reciente versión de tiempo de ejecución, pero no siempre es con versiones anteriores de tiempo de ejecución. Verifique las versiones usando java -version y javac -version.

Otra causa común es que el archivo se corrompe durante la transferencia de archivos (FTP) entre diferentes máquinas. Esta transferencia debe realizarse en modo binario en lugar de en modo texto.

Otra posible causa es un error de hardware, p. corrupto disco duro/archivo/memoria. Intente recompilar u otra máquina.

2

Para aclarar: ¿esto sucede después de haber limpiado todos los viejos archivos .class y recompilado en la misma máquina?

¿O está compilando en una máquina y luego copiando los archivos a otra? Si ese es el caso, es probable que su software de transferencia de archivos corrompa los archivos (Windows < -> Linux es un culpable común, generalmente al agregar/eliminar un byte 0x0D, pero ocasionalmente al agregar un marcador 0x1A DOS EOF).

Sospecho que si revisa su proceso, encontrará que en algún lugar está modificando los archivos fuera de Java. No hay razón, incluso cambios de versión, para que un archivo producido por un compilador Java válido tenga bytes adicionales al final.

+0

Edito el código en una máquina de Windows (bloc de notas ++) y FTP en ASCII en una máquina OpenVMS, donde luego lo compilo. No he estado limpiando archivos de clase anterior debido al sistema de control de versiones de VMS. – CheesePls

+2

Necesita FTP archivos de clase como binarios no como texto. – BalusC

+0

Estoy FTP-ing los archivos .java no los archivos .class – CheesePls

0

tuve un problema similar. Intenté escribir una clase en mi PC de oficina y transferirla a nuestro servidor cliente para probar algo < porque no había JDK en esa máquina. Usé la misma versión de Java en ambas máquinas, pero después de una transferencia obtuve esa Excepción. Intenté usar Archiver antes de transferir y me ayudó.

2

He encontrado esa excepción solo durante el desarrollo. Me parece que ECJ de Eclipse (Eclipse Luna) induce ese comportamiento. Para mí, una construcción limpia resolvió el problema.

Cuestiones relacionadas