このカードゲームは Java で作成しました。1 枚のカードを表向きにし、さらに 4 枚のカードを裏向きに提示します。1 から 100 コインを賭けて、裏向きのカードからより高いカードを選択しようとします。より高いカードを選ぶと、賭け金が 2 倍になり、次のラウンドで 2 倍にするか何もしないかを選択できます。
このプログラムは、1 つのパッケージで 3 つの .java ファイルを使用します。
- HigherNumber: メイン クラス。コードの大部分が含まれます。
- Deck: カードのデッキを表すクラスの定義が含まれています。
- カード: 個々のカードを表すクラスの定義が含まれています。
当然、このプログラムはカードを表すために多くの画像を使用します。元の実装では、カードの位置を表す文字列を ImageIcon に渡しました。裏向きのカードのアイコンは
faceDown = new ImageIcon("multimedia/redBack.gif");
私がこれを行ったとき、プログラムはEclipseを介して実行すると完全に実行されました. そこで、Eclipse を使用して、実行可能な JAR ファイルにエクスポートしました。その後、この JAR ファイルは問題なく実行されましたが、JAR ファイルを別の場所に移動した場合を除き、画像は表示されませんでした。
そこで、URL を使用してこれに対処する方法を調査し、発見しました。URL を使用するようにプログラムを作り直したので、次のようなものになりました。
//Set URL for default faceDown icon.
faceDownURL = this.getClass().getResource(pictureRoot +"redBack.gif");
//Set location for default back face of cards.
faceDown = new ImageIcon(faceDownURL);
今では Eclipse で正常に動作しますが、エクスポートされた実行可能な JAR を動作させることができません。Windowsから実行すると、ちょっと点滅して何もしません。コマンドラインを実行すると、次のようになります。
C:\Documents and Settings\mstabosz>java -jar C:\Temp\HigherNumber.jar
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at higherNumber.Card.setImage(Card.java:150)
at higherNumber.Card.<init>(Card.java:36)
at higherNumber.Deck.<init>(Deck.java:22)
at higherNumber.HigherNumber.<init>(HigherNumber.java:16)
at higherNumber.HigherNumber.main(HigherNumber.java:857)
このコードをたどってみると、問題の原因は 150 行目の Card クラスにあるようです。作成時の各カードの画像。次に、ImageIcon を Card クラスのコンストラクターに返します。
//Set up the icon for the card.
this.cardIcon = setImage();
行 150 は return ステートメントです。ImageIcon で使用される URL cardIconURL を作成するステートメントを次に示します。
//Create a URL based on the constructed string.
URL cardIconURL = this.getClass().getResource(iconName);
return new ImageIcon(cardIconURL);
ここで何が問題なのかわかりません。URL の代わりに文字列を使用していた場合、プログラムは実行可能な JAR として正常に動作しました。Eclipse で実行すると問題なく動作します。現在、実行可能な JAR としては機能しません。
マニフェストと呼ばれるものを読みましたが、理解に苦労しました。私はEclipseにこのプログラムのマニフェストを生成させました:
Manifest-Version: 1.0
Main-Class: higherNumber.HigherNumber
私は何が欠けていますか?