Что может вызвать исключение NullPointerException при запуске JAR из командной строки, но не из IDE? - PullRequest
1 голос
/ 16 июля 2009

У меня есть проект в Eclipse. Когда я запускаю его из Eclipse, все работает просто отлично. Однако, когда я запускаю скрипт сборки Ant и выполняю JAR либо из командной строки, либо с помощью пакетного скрипта, я получаю исключение NullPointerException.

Исключительная ситуация NullPointerException создается из стороннего JAR, который я скомпилировал из исходного кода. Но я сомневаюсь, что это проблема - это работает, когда я запускаю его в Eclipse!

Что может быть причиной, и как я могу выделить проблему и исправить ее?

Вот столько трассировки стека, сколько я могу показать:

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)

Я проверил путь к классам - сторонний JAR действительно находится на пути к классам. Однако я ожидал, что, поскольку, скорее всего, я получу исключение NoClassDefFoundException, если это не так, и я попытался использовать классы в JAR.

Я также проверил места, где я использовал загрузчик классов, и они не были нулевыми и правильно загружали нужные файлы.

Ответы [ 6 ]

1 голос
/ 16 июля 2009

Вы должны научиться подключать отладчик к отдельной программе, чтобы вы могли присоединить вашу IDE с источником к этой работающей программе. Я согласен с Джоном Скитом в том, что это, скорее всего, файл, который не найден - попробуйте изменить текущий напрямую для своей конфигурации Run, чтобы посмотреть, не сломается ли она тогда.

1 голос
/ 16 июля 2009

Похоже, что путь файла DBF не разрешается правильно в последнем случае. Путь к файлу, из которого вы запускаете файл класса в Eclipse, в основном отличается от того, откуда вы запускаете пакетный файл. (Не путь к классу, а физический путь, из которого вы выполняете java -jar ..., например, D: \ my \ app \ bin) Путь, с которого запускается Eclipse, находится в Run Configurations -> вкладка Arguments -> Поле рабочего каталога.

1 голос
/ 16 июля 2009

Одно предположение: он пытается найти ресурс, используя ClassLoader.getResourceAsStream() или аналогичный, и не находит его в банке.

Конечно, мы бы предпочли гораздо меньше, если бы вы сказали нам остальную часть трассировки стека, а не просто, что это NPE ... и тот факт, что у вас есть источник, означает, что вы сможете потренируйся точно там, где все идет не так!

EDIT: Да, с этой трассировкой стека он, вероятно, создает FilterInputStream, но передает поток null для переноса. (JDK действительно должен вызвать исключение в конструкторе, но сейчас уже слишком поздно это исправлять.)

0 голосов
/ 16 июля 2009

Я думаю, что classpath в вашей задаче запуска Eclipse и classpath в вашем ручном подходе различны. Перейдите в диалоговое окно «Выполнить конфигурации» и проверьте вкладку «classpath» вашей задачи запуска Eclipse и убедитесь, что в вашем пакете есть те же записи.

0 голосов
/ 16 июля 2009

Попробуйте запустить его на JDK, а не на JRE. Таким образом, вы увидите, по какой строке вы получаете NullPointerException, и узнаете, что делать, посмотрев на источник.

Кроме того, скомпилируйте его с включенной информацией отладки (не помню как, см. Руководство по задаче Ant javac).

0 голосов
/ 16 июля 2009

Вы уверены, что JAR стороннего производителя находится на вашем пути, когда вы запускаете из командной строки?

...