Che cosa potrebbe causare un NullPointerException quando si esegue un JAR dalla riga di comando, ma non da un IDE?

StackOverflow https://stackoverflow.com/questions/1137170

  •  16-09-2019
  •  | 
  •  

Domanda

Ho un progetto in Eclipse. Quando eseguo dall'interno di Eclipse, tutto funziona bene. Tuttavia, quando si esegue lo script di build Ant ed eseguire il JAR o dalla riga di comando o utilizzando uno script batch, ottengo una NullPointerException.

La NullPointerException in questione è stato gettato da un vaso di terze parti che ho compilato dai sorgenti. Ma, dubito che è il problema - funziona quando eseguo dentro Eclipse

!

Che cosa ha potuto causare questo e come posso fare per isolare il problema e correggere esso?

Ecco come gran parte della traccia dello stack che posso mostrare:

java.lang.NullPointerException
        at java.io.FilterInputStream.read(Unknown Source)
        at java.io.BufferedInputStream.fill(Unknown Source)
        at java.io.BufferedInputStream.read(Unknown Source)
        at java.io.DataInputStream.readUnsignedByte(Unknown Source)
        at com.jhlabs.dbf.DBFFile.readHeader(DBFFile.java:129)
        at com.jhlabs.dbf.DBFFile.<init>(DBFFile.java:76)
        at com.jhlabs.map.shapefile.Shapefile.<init>(Shapefile.java:102)
        at com.jhlabs.map.layer.ShapefileLayer.<init>(ShapefileLayer.java:62)

Ho controllato il percorso di classe - la terza parte JAR è infatti nel classpath. Tuttavia, mi aspettavo che, come mi sarebbe più probabile ottenere un NoClassDefFoundException se non fosse e ho cercato di utilizzare le classi nel vaso.

Inoltre ho controllato i luoghi in cui ho usato un programma di caricamento classe, e non erano nulla e stavano caricando correttamente i file corretti.

È stato utile?

Soluzione

Una delle ipotesi:. Si sta cercando di trovare una risorsa utilizzando ClassLoader.getResourceAsStream() o simili, e non è a cercare il vaso

Naturalmente saremmo indovinare un po 'meno se ci dicessi il resto della traccia dello stack invece di che si tratta di un NPE ... e il fatto che hai la fonte significa che si dovrebbe essere in grado di elaborare esattamente dove sta andando male!

EDIT: Sì, con quella traccia dello stack è probabilmente la creazione di un FilterInputStream ma passando in un flusso null per avvolgere. (Il JDK in realtà dovrebbe generare un'eccezione nel costruttore, ma è troppo tardi per sistemare le cose ora.)

Altri suggerimenti

appare più come il percorso del file DBF non sta risolvendo correttamente in quest'ultimo caso. Il percorso del file da cui si esegue il file di classe in Eclipse è in gran parte diverso da quello in cui si esegue il file batch da. (Non la classe-percorso, ma il percorso fisico da cui si sta facendo java-jar ..., come dire, D: \ My \ app \ bin) Il percorso va da Eclipse è in Run Configurazioni -> scheda Argomenti -> directory di lavoro di campo.

Si dovrebbe imparare come collegare un debugger a un programma stand-alone, in modo da poter collegare il vostro IDE con la fonte di questo programma in esecuzione. Sono d'accordo con Jon Skeet che questo è più probabile un file che non si trova - provare a cambiare il vostro attuale direttamente per la propria configurazione Run per vedere se si rompe troppo poi

.

Sei sicuro che il 3 ° JAR partito è nel tuo percorso quando si esegue dalla riga di comando?

Prova di eseguire sul JDK e non su JRE, in questo modo vedrete su quale linea si riceve NullPointerException, e scoprire che cosa fare, cercando la fonte.

Inoltre, compilarlo con informazioni di debug abilitato (non ricordo come, vedere il manuale compito javac Ant).

Direi che il percorso di classe nel vostro compito corsa Eclipse e il classpath nel vostro approccio manuale sono diversi. Vai alla finestra di dialogo Esegui Configurazioni e controllare la scheda classpath del vostro compito corsa Eclipse e garantire che il vostro gruppo ha le stesse voci.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top