我使用JFrame制作游戏,现在我想在JApplet中部署它,但是我得到以下异常:
java.lang.ExceptionInInitializerError
Google告诉我它是由静态初始化器引起的,我在静态初始化块中唯一要做的就是调用以下函数:
public static BufferedImage[] loadAnimation (String fileName, int subimagewidth, int subimageheight, int pixelsbetweensprites) {
BufferedImage spr = null;
BufferedImage[] animation;
int x, y; //amount of images in each direction
try {
Object ob = new Object();
spr = ImageIO.read(ob.getClass().getResourceAsStream(fileName));
} catch (IOException ex) {
System.exit(0);
Logger.getLogger(AnimationLoader.class.getName()).log(Level.SEVERE, null, ex);
}
x = spr.getWidth() / subimagewidth;
y = spr.getHeight() / subimageheight;
animation = new BufferedImage[x*y];
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
animation[j*x+i] = spr.getSubimage(i*(subimagewidth + pixelsbetweensprites), j*(subimageheight+pixelsbetweensprites), subimagewidth, subimageheight);
}
}
return animation;
}
是否出现此问题是因为它是JApplet,还是因为它是未签名的? 如何修复它(最好不要在签名上花钱)?
答案 0 :(得分:1)
此:
Object ob = new Object();
spr = ImageIO.read(ob.getClass().getResourceAsStream(fileName));
您可能希望从代码源自的相同位置加载图像(例如jar文件)。相反,你要求java.lang.Object.class
回馈可能不是你想要的图像流(这将搜索JRE或JDK内部库中的filename
资源 - 更具体地说是{{1}文件)。
如果您确实要从类文件来源的同一个jar中加载图像,则应该像这样获取流:
rt.jar
您应将此InputStream in = YourClass.class.getResourceAsStream(filename);
传递给InputStream
方法,或将loadAnimation()
和文件名一起传递,以获取图片流。