Java 无法获取变量,除非它为';它是静态的
我有一个类,它具有一些BuffereImage的ArrayList,但我有一个严重的问题。有两种可能性: -ArrayList都是静态的,因此它们的获取方法是:这很好,因为应用程序正在启动,动画正在完美运行。但我不能有不同的动画,因为有静态 -ArrayList(及其getter)不是静态的:当调用getDown()时,我会得到一个NullPointerException,该点正好是调用这个的时刻 在此之前,我使用了简单的数组,我相信使用ArrayList可以解决这个问题,但是没有区别 我不明白它为什么这么做,你能帮我解决这件事吗Java 无法获取变量,除非它为';它是静态的,java,arraylist,nullpointerexception,static,bufferedimage,Java,Arraylist,Nullpointerexception,Static,Bufferedimage,我有一个类,它具有一些BuffereImage的ArrayList,但我有一个严重的问题。有两种可能性: -ArrayList都是静态的,因此它们的获取方法是:这很好,因为应用程序正在启动,动画正在完美运行。但我不能有不同的动画,因为有静态 -ArrayList(及其getter)不是静态的:当调用getDown()时,我会得到一个NullPointerException,该点正好是调用这个的时刻 在此之前,我使用了简单的数组,我相信使用ArrayList可以解决这个问题,但是没有区别 我不明白
public class AnimUnit {
private static final int width = 32, height = 32, nbframe = 4;
private ArrayList<BufferedImage> down;
private ArrayList<BufferedImage> up;
private ArrayList<BufferedImage> right;
private ArrayList<BufferedImage> left;
private ArrayList<BufferedImage> idle;
public AnimUnit(SpriteSheet sheet) {
this.down = new ArrayList<BufferedImage>();
this.up = new ArrayList<BufferedImage>();
this.left = new ArrayList<BufferedImage>();
this.right = new ArrayList<BufferedImage>();
this.idle = new ArrayList<BufferedImage>();
for(int i = 0; i < nbframe; i++)
down.add(sheet.crop((width*2)+2, (height*i)+i, width, height));
for(int i = 0; i < nbframe; i++)
up.add(sheet.crop((width*3)+3, (height*i)+i, width, height));
for(int i = 0; i < nbframe; i++)
left.add(sheet.crop((width)+1, (height*i)+i, width, height));
for(int i = 0; i < nbframe; i++)
right.add(sheet.crop((width*4)+4, (height*i)+i, width, height));
for(int i = 1; i < nbframe; i++)
idle.add(sheet.crop(0, (height*i)+i, width, height));
}
public static int getWidth() {
return width;
}
public static int getHeight() {
return height;
}
public ArrayList<BufferedImage> getDown() {
return down;
}
public ArrayList<BufferedImage> getUp() {
return up;
}
public ArrayList<BufferedImage> getRight() {
return right;
}
public ArrayList<BufferedImage> getLeft() {
return left;
}
public ArrayList<BufferedImage> getIdle() {
return idle;
}
公共类单元{
私有静态最终整数宽度=32,高度=32,nbframe=4;
私人ArrayList down;
私人ArrayList up;
私审权;
私人ArrayList左;
私有数组列表空闲;
公共动画单元(精灵表){
this.down=new ArrayList();
this.up=new ArrayList();
this.left=新的ArrayList();
this.right=新的ArrayList();
this.idle=new ArrayList();
对于(int i=0;i
当前,类中维护的属性都是静态的。您正在使用构造函数为它们赋值,这可能会误导类的用户,因为您的类没有非静态属性。如果未调用构造函数,则它们不会初始化(访问时会抛出空指针异常),但是一个只有静态方法的构造对象是无用的
从您的所有属性和方法中删除“static”一词,我认为它将像您希望和期望的那样工作
AnimUnit animUnitA=new animUnit(spriteSheetA);
AnimUnit animUnitB=new animUnit(spriteSheetB);
ArrayList<BufferedImage> downA=animUnitA.getDown();
ArrayList<BufferedImage> downB=animUnitB.getDown();
animUnitA animUnitA=新的AnimUnit(spriteSheetA);
AnimUnit animUnitB=新的AnimUnit(精灵表TB);
ArrayList downA=animUnitA.getDown();
ArrayList downB=animUnitB.getDown();
从所有属性和方法中删除“static”一词,并且每当您将某个对象初始化为null时,将其初始化为“”
例如:
而不是:
String xyz = null;
尝试:
好的,我刚做了一些测试,最终发现NullPointerException是关于AnimUnit类本身的一个实例,而不是ArrayList。无论如何,感谢大家,即使问题根本不是关于数组的你能分享
AnimUnit
的客户端代码调用方法吗?一般来说,静态
方法/me在面向对象编程中应避免使用MBER。您应该使用对象实例。对于“随机”类方法访问,我建议使用单例模式而不是静态方法。我删除了“静态”从代码中看,因为人们似乎误解了我的观点。我希望我的代码在实例中正常运行,但是如果它们不是静态的,它总是给我NulpPoExtExchange,这对我来说很奇怪。我没有找到解决问题的方法…很多人认为我误解了我的文章。我知道我不能正确使用这个类。Sticts ListArray,但是当我删除它们时会得到NullPointerException(当然,我会删除属性和getter之前的“statics”)您已经在帖子中编辑了代码,因此您应该验证您的环境是否已更改。当属性是静态的时,您可以访问它们而不必初始化它们。既然它们是非静态的,您就不能尝试访问它们,除非您构造了对象(初始化了它们)。它不会改变任何内容,因为我从未将某些内容初始化为“null”或“”,所以请删除您无用的问题。对不起,即使这个问题是无用的,我也无法删除它,因为“很多人都投入了时间和精力来回答它”。
String xyz = "";