【发布时间】: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”实际上偶尔会变为空。以前我有一些奇怪的崩溃,现在我的崩溃报告器中只有这些日志。
You can find the entire class here, where the variable is called "sPaint" (it was static initially).
以前“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