2

jar ファイルをビルドして実行すると、imageicon が見つからないため、null ポインター例外が表示されます。

new ImageIcon(getClass().getClassLoader().getResource("icons/exit.png")));

これは、jar ファイルを実行したときに表示されるエラーです。

Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(Unknown Source)
        at mediaplayer.MediaPlayer.buildtoolbar(MediaPlayer.java:130)
        at mediaplayer.MediaPlayer.<init>(MediaPlayer.java:81)
        at mediaplayer.MediaPlayer.main(MediaPlayer.java:464)

しかし、NetBeans でプロジェクトを実行すると、正常に動作します

これは、jar内のすべてのファイルをリストしたときの出力です

META-INF/
META-INF/MANIFEST.MF
helliker/
helliker/id3/
icons/
mediaplayer/
Thumbs.db
exit.png
ff1.png
helliker/id3/BinaryParser.class
helliker/id3/CorruptHeaderException.class
helliker/id3/ID3Exception.class
helliker/id3/ID3FieldDataException.class
helliker/id3/ID3Tag.class
helliker/id3/ID3v1Tag.class
helliker/id3/ID3v2ExtendedHeader.class
helliker/id3/ID3v2Footer.class
helliker/id3/ID3v2FormatException.class
helliker/id3/ID3v2Frame.class
helliker/id3/ID3v2Frames.class
helliker/id3/ID3v2Header.class
helliker/id3/ID3v2Tag.class
helliker/id3/MP3Comparator.class
helliker/id3/MP3File.class
helliker/id3/MP3FileFilter.class
helliker/id3/MPEGAudioFrameHeader.class
helliker/id3/NoMPEGFramesException.class
helliker/id3/NullsoftID3GenreTable.class
helliker/id3/Playlist.class
helliker/id3/PlaylistException.class
helliker/id3/XingVBRHeader.class
icons/Thumbs.db
icons/exit.png
icons/ff1.png
icons/label.jpg
icons/openpl.gif
icons/pause1.png
icons/play1.png
icons/playlist.png
icons/rr.png
icons/rr1.PNG
icons/stop.png
label.jpg
mediaplayer/MediaPlayer$1.class
mediaplayer/MediaPlayer$PlaylistFilter.class
mediaplayer/MediaPlayer.class
mediaplayer/PlaylistManager$1.class
mediaplayer/PlaylistManager$MP3Filter.class
mediaplayer/PlaylistManager$PlaylistFilter.class
mediaplayer/PlaylistManager.class
mediaplayer/Settings.class
mediaplayer/TagEditor.class
mediaplayer/Thumbs.db
openpl.gif
pause1.png
play1.png
playlist.png
rr.png
rr1.PNG
4

4 に答える 4

6

jarファイルが実際にどのように構築されているかという質問にはいくつかの情報が欠けていますが、次のディレクトリレイアウトを使用しています

├── bin
│   ├── com
│   │   └── example
│   │       └── ImageIconTest.class
│   └── icons
│       └── exit.png
└── src
    ├── MANIFEST.MF
    └── com
        └── example
            └── ImageIconTest.java

および次のコードImageIconTest.java

package com.example;
import javax.swing.ImageIcon;

public class ImageIconTest {
   public void run() {
      ImageIcon ii = new ImageIcon(getClass().getClassLoader().getResource("icons/exit.png"));
      System.out.println(ii);
   }
   public static void main(String[] args) {
      ImageIconTest app = new ImageIconTest();
      app.run();
   }
}

ファイルシステムからサンプルを適切に実行できます

$ java -classpath bin com.example.ImageIconTest

次の内容の MANIFEST.MF ファイルを使用します。

Manifest-Version: 1.0
Main-Class: com.example.ImageIconTest

実行可能なjarファイルにパッケージ化して、jarファイルから実行できます。

$ jar cvfm app.jar src/MANIFEST.MF -C bin .
$ java -jar app.jar

どちらのアプローチも問題なく機能しています。重要な詳細は、アイコン ディレクトリが適切な場所にある jar ファイルに含まれていることを確認することです

jar ファイルの内容を一覧表示すると、次のようになります。

  0 Tue Nov 06 12:27:56 CET 2012 META-INF/
107 Tue Nov 06 12:27:56 CET 2012 META-INF/MANIFEST.MF
  0 Tue Nov 06 12:27:56 CET 2012 com/
  0 Tue Nov 06 12:27:56 CET 2012 com/example/
950 Tue Nov 06 12:27:56 CET 2012 com/example/ImageIconTest.class
  0 Tue Nov 06 12:00:36 CET 2012 icons/
873 Tue Nov 06 12:00:36 CET 2012 icons/exit.png

アイコン ディレクトリの場所に注意してください。

于 2012-11-06T11:25:34.820 に答える
2

MediaPlayerパッケージ内 mediaplayerで の埋め込みリソースを呼び出すと、例外が発生します"icons/exit.png"。これは次のパスに解決されます。

mediaplayer/icons/exit.png

それは実際にはパスではないと推測しています。

icons/exit.png

Stringそれが必要な理由です -接頭辞"/icons/exit.png"に注意してください。/

/前にあるStringは、リソースが呼び出されたクラスのパッケージではなく、クラスパスのルートからリソースを検索することを意味することをクラスローダに通知します。

于 2012-11-06T14:39:27.253 に答える
1

みなさん、ありがとうございました。私は答えを理解しました

button = new JButton(new ImageIcon(getClass().getResource("/icons/playlist.png")));

ClassLoader()を削除して機能しましたが、理由がわかりません。誰かが私にこの背後にある理論を説明してもらえますか?

于 2012-11-07T08:37:17.453 に答える
0

このコードはうまく機能します:

ClassLoader cl = getClass().getClassLoader();
InputStream stream = cl.getResourceAsStream( "hpms/study/Starbucks.jpg" );
if( stream == null ) System.err.println( "resource not found" );
BufferedImage image = ImageIO.read( stream );
ImageIcon icon = new ImageIcon( image );
于 2012-11-06T11:34:07.543 に答える