Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法获取变量,除非它为';它是静态的_Java_Arraylist_Nullpointerexception_Static_Bufferedimage - Fatal编程技术网

Java 无法获取变量,除非它为';它是静态的

Java 无法获取变量,除非它为';它是静态的,java,arraylist,nullpointerexception,static,bufferedimage,Java,Arraylist,Nullpointerexception,Static,Bufferedimage,我有一个类,它具有一些BuffereImage的ArrayList,但我有一个严重的问题。有两种可能性: -ArrayList都是静态的,因此它们的获取方法是:这很好,因为应用程序正在启动,动画正在完美运行。但我不能有不同的动画,因为有静态 -ArrayList(及其getter)不是静态的:当调用getDown()时,我会得到一个NullPointerException,该点正好是调用这个的时刻 在此之前,我使用了简单的数组,我相信使用ArrayList可以解决这个问题,但是没有区别 我不明白

我有一个类,它具有一些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 = "";