Was würde eine Nullpointerexception verursachen, wenn Sie ein Glas aus der Befehlszeile ausführen, aber nicht von einer IDE?

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

  •  16-09-2019
  •  | 
  •  

Frage

Ich habe ein Projekt in Eclipse. Wenn ich es von Innenfinsternis ausführe, funktioniert alles gut. Wenn ich jedoch das Ant -Build -Skript ausführe und das Glas entweder aus der Befehlszeile ausführe oder ein Batch -Skript verwende, erhalte ich eine NullPointerexception.

Die fragliche NullPointerexception wird aus einem Drittanbieter-Glas geworfen, das ich aus der Quelle zusammengestellt habe. Aber ich bezweifle, dass das das Problem ist - es funktioniert, wenn ich es in Eclipse ausführe!

Was könnte das verursachen und wie kann ich das Problem isolieren und korrigieren?

Hier ist so viel von der Stapelspur, wie ich zeigen kann:

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)

Ich habe den Klassenpfad überprüft - das Jar von Drittanbietern ist in der Tat auf dem Klassenpfad. Ich erwartete jedoch, dass ich, da ich höchstwahrscheinlich eine NoclassDeffoundException bekommen würde, wenn dies nicht der Fall war, und ich versuchte, die Klassen im Glas zu nutzen.

Ich habe auch die Orte überprüft, an denen ich einen Klassenloader verwendet habe, und sie waren nicht null und lud die richtigen Dateien korrekt.

War es hilfreich?

Lösung

Eine Vermutung: Es wird versucht, eine Ressource mithilfe zu finden ClassLoader.getResourceAsStream() oder ähnlich, und es findet es nicht im Glas.

Natürlich würden wir eher weniger raten, wenn Sie uns den Rest der Stapelspur sagen würden, anstatt nur, dass es sich um ein NPE handelt ... und die Tatsache, dass Sie die Quelle haben, bedeutet, dass Sie in der Lage sein sollten, herauszufinden exakt Wo es schief geht!

Bearbeiten: Ja, mit dieser Stapelspur erzeugt es wahrscheinlich eine FilterInputStream aber in a vorbeikommen null Stream zum Wickeln. (Der JDK sollte wirklich eine Ausnahme in den Konstruktor machen, aber es ist zu spät, um das jetzt zu beheben.)

Andere Tipps

Sieht eher so aus, als würde der DBF -Dateipfad im letzteren Fall nicht korrekt auflösen. Der Dateipfad, von dem Sie Ihre Klassendatei in Eclipse ausführen, unterscheidet sich hauptsächlich von Ihrem Ausführen der Batch -Datei. (Nicht der Klassenpfad, sondern der physische Weg von wo aus Sie Java -Jar machen ... wie sagen: my app bin) Die Pfadfinsternis läuft in Auslaufkonfigurationen -> Argumente Registerkarte -> Arbeitsverzeichnis Feld.

Sie sollten lernen, wie Sie einem eigenständigen Programm einen Debugger anhängen, damit Sie Ihre IDE mit der Quelle an dieses laufende Programm anschließen können. Ich stimme Jon Skeet zu, dass dies höchstwahrscheinlich eine Datei ist, die nicht gefunden wird. Ändern Sie Ihren Strom direkt für Ihre Auslaufkonfiguration, um festzustellen, ob sie dann auch bricht.

Sind Sie sicher, dass sich das Jar des Drittanbieters auf Ihrem Weg befindet, wenn Sie aus der Befehlszeile rennen?

Versuchen Sie, es auf JDK und nicht auf JRE auszuführen. Auf diese Weise sehen Sie, welche Zeile Sie NullPointerexception erhalten, und finden Sie heraus, was Sie tun sollen, indem Sie die Quelle betrachten.

Kompilieren Sie es auch mit aktivierter Debugging -Informationen (erinnern Sie sich nicht daran, wie man das Handbuch für Ant -Javac -Aufgaben siehe).

Ich würde vermuten, dass der Klassenpfad in Ihrer Eclipse -Laufaufgabe und der Klassenpfad in Ihrem manuellen Ansatz unterschiedlich sind. Gehen Sie zum Dialogfeld Konfigurationen auszufahren und überprüfen Sie die Registerkarte "ClassPath" Ihrer Eclipse -Auslaufaufgabe und stellen Sie sicher, dass Ihr Stapel die gleichen Einträge hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top