我的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。以前我有一些奇怪的崩溃,现在我只是在我的崩溃记者中有这些日志。
You can find the entire class here, where the variable is called "sPaint" (it was static initially).
以前“paint”被声明为“静态final”,但我必须删除“final”才能在null检查中再次分配它。静态很久以前被删除了,问题仍然发生在“最终”。
在我的职业生涯中,我曾经在处理静态方法和变量时遇到过初始化顺序的奇怪问题,但由于没有任何东西是静态的而且它从未被分配过,所以我完全无法理解可能发生的事情。
我的唯一猜测就是这样:我的方法是从一些重载的布局方法中调用的。
@Override
public void setPadding(int left, int top, int right, int bottom) {
super.setPadding(left, top, right, bottom);
init();
}
在初始化类之前,是否可以使用反射或类似的东西来查找和调用方法?
最后:是的,代码确实非常陈旧,丑陋且可能使用完全重写,但这不会让问题变得不那么奇怪:)
答案 0 :(得分:0)
你的实际" aNonStaticMethod" (可以在链接代码中看到,它名为init
- BTW,您应该在问题正文中包含所有相关的实际代码),由您的类中的多个方法调用。这些方法中的一些方法会覆盖超类的方法。如果超类构造函数调用了这些重写方法中的任何一个,则在初始化类的实例变量之前将调用您的方法,这解释了为什么您的成员仍然是null
。
一个好的解决方案是避免在重写方法中调用该方法。