我收到了大量崩溃报告,其中包含以下堆栈跟踪(名称已更改):
Caused by: java.lang.InstantiationException: can't instantiate class com.example.MyApplication; no empty constructor
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1319)
at android.app.Instrumentation.newApplication(Instrumentation.java:997)
at android.app.Instrumentation.newApplication(Instrumentation.java:982)
at android.app.LoadedApk.makeApplication(LoadedApk.java:496)
... 11 more
java.lang.RuntimeException: Unable to instantiate application com.example.MyApplication: java.lang.InstantiationException: can't instantiate class com.example.MyApplication; no empty constructor
at android.app.LoadedApk.makeApplication(LoadedApk.java:501)
android.app.Application
有一个明确的无参数构造函数:
public Application() {
super(null);
}
MyApplication
继承自android.app.Application
,并且根本没有明确的构造函数。根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数:
public MyApplication() {
super();
}
这肯定发生了,或者我从来没有能够首先编译应用程序。那么可能导致这些崩溃的原因是什么?
<小时/> 编辑:以下是使用
MyApplication.class
反编译ProGuard编辑javap
的输出的一部分:
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
}
默认构造函数肯定在那里,它是公共的。
答案 0 :(得分:1)
注意:在这种情况下,这不是问题所在,但如果您因为遇到相同的症状而正在阅读此问题时,可能成为问题你...
根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数
public MyApplication() { super(); }
只有当它是 public 类时才会出现这种情况。来自section 8.8.9 of the JLS:
默认构造函数与类具有相同的可访问性(第6.6节)。
因此,如果您的类被声明为具有public
以外的任何访问权限,则构造函数也不会公开。
您尚未展示您的课程声明,但您首先要检查的是它是公开的。