我用 Java 创建了这个纸牌游戏。它的作用是它呈现一张正面朝上的牌和另外四张正面朝下的牌。您从 1 到 100 个硬币下注,并尝试从面朝下的牌中选择更高的牌。如果您选择更高的牌,您的赌注将加倍,您可以选择在另一轮中加倍或不加倍。
该程序在一个包中使用了 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 类。在第 150 行,该类位于setImage()函数中,该函数正在构建一个名为 iconName 的字符串,用于设置每张卡片创建时的图像。然后它返回一个 ImageIcon 给 Card 类的构造函数。
//Set up the icon for the card.
this.cardIcon = setImage();
第 150 行是返回语句。以下是创建在 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
我错过了什么?