【问题标题】:Why getApplicationContext() in constructor of Activity throws null pointer exception?为什么 Activity 的构造函数中的 getApplicationContext() 会抛出空指针异常?
【发布时间】:2013-04-06 23:02:32
【问题描述】:

经过一段时间的 bug 搜寻,结果是:

public class MainActivity extends BaseActivity { // BaseActivity extends Activity

    public MainActivity() {
        super();
        getApplicationContext(); // NPE here
    }
}

为什么?这是在哪里记录的?
果冻

【问题讨论】:

  • 永远不要在活动上实现构造函数。
  • @CommonsWare:实际上是在service 上:D 注意提供一些输入-链接-源链接。无论如何,这不应该/不是记录在某处吗?
  • “它实际上是在服务上”——您在上面粘贴的代码显示了一个实现构造函数的活动。 “无论如何,这不应该/不是记录在某处吗?” -- developer.android.com/reference/android/app/… "在活动开始时调用。这是大多数初始化应该去的地方:调用 setContentView(int) 来膨胀活动的 UI,使用 findViewById(int) 以编程方式与 UI 中的小部件交互,调用 managedQuery()检索光标以获取正在显示的数据等。”
  • 不,不是问题。任何方法都可以抛出 NullPointerException,它不必声明。而且,即使它返回 null 而不是抛出 NullPointerException,当您稍后尝试使用所述 null 值时,您最终也会自己抛出异常。顺便说一句,返回 null 和抛出 NPE 在概念上是不同的。
  • @dmon:我知道 - 不,我认为这种行为是违反直觉的。一个方法不应该抛出一个未经检查的异常,除了 A) 如果它有一个错误或 B) 一个人以错误的方式使用它 - 但是这个 wrong way 应该在文档中 - 就像在大多数 api 中一样java中的类(如果参数为null等,则抛出NPE)-我通常检查null,所以我(可能)不会因为null返回值而落入(我知道它与NPE不同!)

标签: android constructor nullpointerexception android-context


【解决方案1】:

只是为了了解正在发生的事情。 Activity extends ContextThemeWrapper 扩展 ContextWrapperActivity 继承自 getApplicationContext()ContextWrapper implements it as :

@Override
public Context  getApplicationContext() {
    return mBase.getApplicationContext(); // mBase is a Context
}

ContextWrapperonly public constructor 是:

 public  ContextWrapper(Context base) {
     mBase = base;
 } 

ContextThemeWrapperwe have

 public  ContextThemeWrapper() {
     super(null);
 }

并且由于 Activity 没有定义显式构造函数,因此上面的构造函数被调用 - mBase == null 在 Activity 的构造函数中 - 繁荣。

来自4.2.2_r1的链接

【讨论】:

    【解决方案2】:

    等待onCreate结束调用该方法。

    public class MainActivity extends BaseActivity { 
    
        public onCreate(Bundle savedInstanceState) {
            super(savedInstanceState);
            getApplicationContext(); //activity has a context now
        }
    }
    

    【讨论】:

    • 我发现 - 我的问题不是 getApplicationContext(); 返回 null 而是它抛出。这是我的问题 - 可能是关于此事的一些理论 :) - 我相信很多人都因为缺乏这方面的文档而陷入困境 - 有资格获得错误报告
    • 查看Activity的源码。我的猜测是会调用一个上下文并生成 NPE。
    • 您误解了链接。这是Activity继承的impl。
    • return mBase.getApplicationContext(); 点击 --> public abstract Context getApplicationContext(); :D
    猜你喜欢
    • 2015-09-19
    • 2012-04-24
    • 1970-01-01
    • 2016-08-31
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多