关于java:除非它是静态的,否则无法获取变量

Unable to get a variable unless it's static

我有一个类,它有一些bufferedImage的数组列表,但是我有一个严重的问题。有两种可能性:

-数组列表都是静态的,所以它们的获取方法是:这很好,因为应用程序正在启动,动画运行得很好。但我不能有不同的动画,因为有静态。

-arraylist(及其getter)不是静态的:当调用getdown()时,我会得到一个nullpointerException,它指向调用这个函数的精确时刻。

在那之前,我使用简单的数组,我相信使用数组列表可以解决这个问题,但是没有区别。

我不明白为什么要这样做,你能帮我一下吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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;
}


从所有属性和方法中删除单词"static",每当初始化为空时,请将其初始化为"static"。

例子:

而不是:

1
String xyz = null;

尝试:

1
String xyz ="";


当前,类中维护的属性都是静态的。您正在使用构造函数为它们赋值,这可能会误导类的用户,因为类没有非静态属性。如果没有调用构造函数,那么它们就不会被初始化(并且在访问时会引发空指针异常),但是一个只包含静态方法的构造对象是没有用的。

从所有的属性和方法中去掉"static"这个词,我认为它会按照您希望和期望的方式工作。

1
2
3
4
AnimUnit animUnitA=new animUnit(spriteSheetA);
AnimUnit animUnitB=new animUnit(spriteSheetB);
ArrayList<BufferedImage> downA=animUnitA.getDown();
ArrayList<BufferedImage> downB=animUnitB.getDown();


好吧,我刚刚做了一些测试,最终发现nullpointerException是关于animunit类本身的一个实例,而不是ArrayList。不管怎样,多亏了所有,即使问题根本不是关于阵列的。