私有成员变量变为空

时间:2016-03-30 06:13:57

标签: java android nullpointerexception initialization

我的Android应用程序中有一个类似于此的类:

class MyButton {
    private Paint paint = new Paint();

    // constructors etc.

    private void aNonStaticMethod() {

        // code... 

        if (paint == null) {
            paint = new Paint();
            CrashReporter.report("paint null", "This should never happen, but it does");
        }

        paint.setAntiAlias(true);
        paint.setColor(mColor);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeCap(Paint.Cap.SQUARE);
        paint.setStrokeWidth(DEFAULT_STROKE_WIDTH);

        // more code

    }
}

奇怪的是,成员变量“paint”实际上偶尔变为null。以前我有一些奇怪的崩溃,现在我只是在我的崩溃记者中有这些日志。

以前“paint”被声明为“静态final”,但我必须删除“final”才能在null检查中再次分配它。静态很久以前被删除了,问题仍然发生在“最终”。

在我的职业生涯中,我曾经在处理静态方法和变量时遇到过初始化顺序的奇怪问题,但由于没有任何东西是静态的而且它从未被分配过,所以我完全无法理解可能发生的事情。

我的唯一猜测就是这样:我的方法是从一些重载的布局方法中调用的。

@Override
public void setPadding(int left, int top, int right, int bottom) {
    super.setPadding(left, top, right, bottom);
    init();
}

在初始化类之前,是否可以使用反射或类似的东西来查找和调用方法?

最后:是的,代码确实非常陈旧,丑陋且可能使用完全重写,但这不会让问题变得不那么奇怪:)

1 个答案:

答案 0 :(得分:0)

你的实际" aNonStaticMethod" (可以在链接代码中看到,它名为init - BTW,您应该在问题正文中包含所有相关的实际代码),由您的类中的多个方法调用。这些方法中的一些方法会覆盖超类的方法。如果超类构造函数调用了这些重写方法中的任何一个,则在初始化类的实例变量之前将调用您的方法,这解释了为什么您的成员仍然是null

一个好的解决方案是避免在重写方法中调用该方法。