una tutorial sistema programa fuente con codigo biblioteca java nullpointerexception zipfile

java - tutorial - Cómo depurar NullPointerException ocurrió en el código de la biblioteca?



sistema de biblioteca en java netbeans (2)

Aquí está el método getZipEntry (desde 1.7.0_10):

private ZipEntry getZipEntry(String name, long jzentry) { ZipEntry e = new ZipEntry(); e.flag = getEntryFlag(jzentry); // get the flag first if (name != null) { e.name = name; } else { byte[] bname = getEntryBytes(jzentry, JZENTRY_NAME); if (!zc.isUTF8() && (e.flag & EFS) != 0) { e.name = zc.toStringUTF8(bname, bname.length); } else { e.name = zc.toString(bname, bname.length); // Line 529 } } /* snip */ return e; }

La única razón por la que se lanzaría una NullPointerException en esta línea sería si e , zc o bname fueran null .

e no puede ser null porque está claramente instanciado en este método.

zc no puede ser null :

public ZipFile(File file, int mode, Charset charset) throws IOException { /* snip */ this.zc = ZipCoder.get(charset); /* snip */ } static ZipCoder get(Charset charset) { return new ZipCoder(charset); }

Lo que significa que bname debe ser null , lo que será bastante difícil de depurar. getEntryBytes es un método native :

private static native byte[] getEntryBytes(long jzentry, int type);

Así es como procedería:

  • Averiguar si es ese archivo zip particular o todos los archivos zip. Si se trata de ese archivo zip en particular, intente volver a crearlo.
  • Actualice su versión de Java, es posible que haya un error con getEntryBytes que se solucionó
  • Enviar un informe de error a Oracle

Estoy extrayendo un archivo ZIP en java:

ZipFile zipFile = new ZipFile(theZipFile); Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); while(zipEntries.hasMoreElements()){ ZipEntry entry = zipEntries.nextElement(); /// <---Nullpointer exception happens here }

La ejecución del código pasado while(zipEntries.hasMoreElements()) pero falló al extraer un ZipEntry.

Es extraño que hasMoreElements devuelva verdadero, pero el puntero nulo se produce al intentar obtener elementos.

La excepción es desde dentro de la clase ZipFile de JDK lib, que no puedo ver las variables locales en el depurador, entonces, ¿cómo puedo averiguar qué está mal con el archivo Zip?

Editar: seguimiento de pila:

java.lang.NullPointerException at java.util.zip.ZipFile.getZipEntry(ZipFile.java:529) at java.util.zip.ZipFile.access$900(ZipFile.java:56) at java.util.zip.ZipFile$1.nextElement(ZipFile.java:511) at java.util.zip.ZipFile$1.nextElement(ZipFile.java:481)


Recientemente tuve el mismo problema, así que comparé el código fuente ZIP zip de JDK 1.6 y 1.7 .

La verdadera razón es jdk 1.6 inicializará zipEntry con jzentry por constructor como este:

ZipEntry ze = new ZipEntry(jzentry); ZipEntry(long jzentry) { initFields(jzentry); }

pero en jdk 1.7 podemos ver su uso

private ZipEntry getZipEntry(String name, long jzentry) { ZipEntry e = new ZipEntry(); // it did not use jzentry initial it

Cuando algún archivo jar tiene una entrada vacía arrojará una excepción.