【问题标题】:Private member variable becomes null私有成员变量变为空
【发布时间】:2016-03-30 06:13:57
【问题描述】:

我的 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”实际上偶尔会变为空。以前我有一些奇怪的崩溃,现在我的崩溃报告器中只有这些日志。

以前“paint”被声明为“static final”,但我必须删除“final”才能在空检查中再次分配它。 static 早就去掉了,到“final”的时候问题还是出现了。

在我的职业生涯中,我曾在处理静态方法和变量时看到过初始化顺序的奇怪问题,但由于没有什么是静态的,而且从未分配过,所以我完全不知道会发生什么。

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

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

是否可以在类初始化之前使用反射或类似的方法找到并调用方法?

最后:是的,代码确实很旧,很丑,可能需要完全重写,但这并没有让问题变得不那么奇怪:)

【问题讨论】:

  • 谁打电话给aNonStaticMethod?是否总是从同一个类 (MyButton) 调用,正如其私有访问所暗示的那样?
  • 你在哪里调用这个方法?
  • Paint 构造函数中会出现问题吗?
  • 看起来另一种方法正在将绘制对象设置为空...检查或发布更多代码...
  • 致各位:方法和变量都是私有的,不在类外调用。自己查看源代码(或我附上的屏幕截图)。它只用了10个地方,都很容易理解。没有什么复杂的事情发生。我不知道 Paint 构造函数是否会失败,但没有记录。

标签: java android nullpointerexception initialization


【解决方案1】:

您的实际“aNonStaticMethod”(从链接代码中可以看出,它被命名为init - 顺便说一句,您应该在问题的正文中包含所有相关的实际代码),由多种方法调用你的班。一些关闭这些方法覆盖超类的方法。如果这些被覆盖的方法中的任何一个被超类构造函数调用,你的方法将在你的类的实例变量被初始化之前被调用,这就解释了为什么你的成员仍然是null。

一个好的解决方案是避免在被覆盖的方法中调用该方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多