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.