消失的默认构造函数

时间:2014-04-28 16:00:02

标签: java android dalvik default-constructor

我收到了大量崩溃报告,其中包含以下堆栈跟踪(名称已更改):

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
}

默认构造函数肯定在那里,它是公共的。

1 个答案:

答案 0 :(得分:1)

注意:在这种情况下,这不是问题所在,但如果您因为遇到相同的症状而正在阅读此问题时,可能成为问题你...

  

根据我对Java规范的理解,这意味着编译器应该隐式插入以下构造函数

public MyApplication() {
    super();
}

只有当它是 public 类时才会出现这种情况。来自section 8.8.9 of the JLS

  

默认构造函数与类具有相同的可访问性(第6.6节)。

因此,如果您的类被声明为具有public以外的任何访问权限,则构造函数也不会公开。

您尚未展示您的课程声明,但您首先要检查的是它是公开的。