Java 正在消失的默认构造函数
我收到了大量具有以下堆栈跟踪的崩溃报告(名称已更改):Java 正在消失的默认构造函数,java,android,dalvik,default-constructor,Java,Android,Dalvik,Default Constructor,我收到了大量具有以下堆栈跟踪的崩溃报告(名称已更改): android.app.Application有一个明确的无参数构造函数: public Application() { super(null); } MyApplication继承自android.app.Application,完全没有显式构造函数。根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数: public MyApplication() { super(); } 这一定发生过,否则我根本就无法编译这
android.app.Application
有一个明确的无参数构造函数:
public Application() {
super(null);
}
MyApplication
继承自android.app.Application
,完全没有显式构造函数。根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数:
public MyApplication() {
super();
}
这一定发生过,否则我根本就无法编译这个应用程序。那么是什么导致了这些事故呢
编辑:以下是使用
javap反编译ProGuardMyApplication.class
的部分输出:
Compiled from "MyApplication.java"
public class com.example.MyApplication extends android.app.Application {
public com.example.MyApplication();
Signature: ()V
public void onCreate();
Signature: ()V
public void onLowMemory();
Signature: ()V
public void onTrimMemory(int);
Signature: (I)V
// ... some other methods ...
static {};
Signature: ()V
}
默认构造函数肯定在那里,并且是公共的。注意:在这种情况下,这不是问题所在,但是如果您阅读这个问题是因为您遇到了相同的症状,那么它可能是您的问题……
根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数
public MyApplication() {
super();
}
只有当它是一个公共类时才是这样。发件人:
默认构造函数与类具有相同的可访问性(§6.6)
因此,如果您的类被声明为具有除public
之外的任何访问权限,则构造函数也不会是公共的
您还没有显示类声明,但首先要检查它是否是公共的。您是否尝试过显式声明构造函数?这样做时,您是否仍有问题?我知道它不会解释为什么这目前不起作用,但我只是好奇一下。这似乎有点含糊不清的联系:如果你有权访问编译后的资源,请运行javap
,检查这样的构造函数是否存在并且是公共的。@Joffrey,我自己从来没有见过这种崩溃,只有在崩溃报告中见过。我可以显式地声明构造函数,但我需要一段时间才能看到它是否修复了“在野外”的问题,我在问题中添加了来自javap
的输出。MyApplication
确实是public
@kpozin:好的-将把这个答案留给处于类似位置的其他人检查,但将进行编辑以表明它不是问题。
public MyApplication() {
super();
}