1

私は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 でクラスを利用しようとしたため、それを期待していました。

クラスローダーを使用した場所も確認しましたが、null ではなく、適切なファイルを正しくロードしていました。

4

6 に答える 6

1

後者の場合、DBF ファイル パスが正しく解決されていないように見えます。Eclipse でクラス ファイルを実行する場所のファイル パスは、バッチ ファイルを実行する場所とはほとんど異なります。(クラスパスではなく、Java -jar を実行している場所からの物理パス、たとえば D:\my\app\bin のように) Eclipse の実行元のパスは、実行構成 -> 引数タブ -> にあります。作業ディレクトリ フィールド。

于 2009-07-16T12:58:28.843 に答える
1

デバッガーをスタンドアロン プログラムに接続する方法を学ぶ必要があります。これにより、IDE をソースとともに実行中のプログラムに接続できます。これはファイルが見つからない可能性が高いという Jon Skeet に同意します。現在の実行構成を直接変更して、それが壊れるかどうかを確認してください。

于 2009-07-16T13:07:33.587 に答える
1

1 つの推測: を使用してリソースを見つけようとしていますClassLoader.getResourceAsStream()が、jar でそれを見つけられません。

もちろん、それが NPE であるというだけでなく、スタック トレースの残りの部分を教えていただければ、推測はかなり少なくなります...そして、ソースを入手したという事実は、正確に解決できるはずであることを意味します。どこが悪いんだ!

EDIT:はい、そのスタックトレースでは、おそらく作成してFilterInputStreamいますが、ストリームを渡しnullてラップしています。(JDK は実際にはコンストラクターで例外をスローする必要がありますが、今それを修正するには遅すぎます。)

于 2009-07-16T12:23:26.647 に答える
0

コマンド ラインから実行したときに、サード パーティの JAR がパスにあることを確認しますか?

于 2009-07-16T12:23:51.530 に答える