【问题标题】:Android: Null Pointer Exception when calling new intentAndroid:调用新意图时出现空指针异常
【发布时间】:2015-06-25 19:41:44
【问题描述】:

尝试通过意图调用新活动时收到错误消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference

我的Activity有一个按钮,点击后会转到这个方法:

public void onClickChangeActivity() {

        Intent intent = new Intent(context , Details.class);
        startActivity(intent);

    }

public static Context 上下文在类的开头创建,然后在我的 onCreate 中实例化为 context = getApplicationContext();

我也尝试过 context = getBaseContext() 和 context = RecyclerViewActivity.this(RecyclerViewActivity 是我当前类的名称)

对我为什么收到此 NullP 有任何帮助吗?我已经尝试了所有相关的 StackOverFlow 答案。此外,我的清单包括我的活动。

onClickChangeActivity 正在从我的 RecyclerViewerAdapter 类中调用:

View.OnClickListener getPersonClickListener(final int position) {
        return new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                RecyclerViewActivity recyclerViewActivity = new RecyclerViewActivity();
                recyclerViewActivity.onClickChangeActivity();
            }
        };

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.akash.android_test" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- <activity -->
        <!-- android:name=".DataFetcher" -->
        <!-- android:label="@string/title_activity_data_fetcher" > -->
        <!-- </activity> -->
        <activity
            android:name=".Crime"
            android:label="@string/title_activity_crime"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".RecyclerViewActivity"
            android:label="@string/title_activity_recycler_view"
            android:screenOrientation="portrait" >
        </activity>
        <activity
            android:name=".Details"
            android:label="@string/title_activity_crime_details"
            android:parentActivityName=".RecyclerViewActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="RecyclerViewActivity" />
        </activity>
    </application>

</manifest>

LogCat:

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
            at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132)
            at android.content.ComponentName.<init>(ComponentName.java:77)
            at android.content.Intent.<init>(Intent.java:4160)
            at com.bah.baltimoreopendata.android_baltimoreopendata.RecyclerViewActivity.onClickChangeActivity(RecyclerViewActivity.java:265)
            at com.bah.baltimoreopendata.android_baltimoreopendata.RecycleViewAdapter$1.onClick(RecycleViewAdapter.java:121)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

【问题讨论】:

  • 你试过onClickChangeActivity(context)吗?
  • 使用 Intent 意图 = new Intent(RecyclerViewActivity.this, Details.class);如果有效,则变量上下文需要是最终变量并使用 onClickChangeActivity(context)
  • 尝试使用 context = this;
  • @Santiago 刚刚尝试过,但同样的错误。
  • @JonathanGarcía 也试过了,同样的错误。

标签: java android android-intent


【解决方案1】:

问题是您正试图从 适配器 调用 activity 方法:

RecyclerViewActivity recyclerViewActivity = new RecyclerViewActivity();
recyclerViewActivity.onClickChangeActivity();

您应该在适配器类中替换此代码。在适配器 constructor 中添加以下行:

public RecycleViewAdapter(......, Context context){
    ...your code.
    this.mContext=context;
}

并在 getPersonClickListener 适配器方法中:

View.OnClickListener getPersonClickListener(final int position) {
    return new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(mContext instanceof RecyclerViewActivity){
                ((RecyclerViewActivity)mContext).onClickChangeActivity();
            }
        }
    };

当您在 RecyclerViewActivity 上调用 onClickChangeActivity 方法时:

public void onClickChangeActivity() {
    Intent intent = new Intent(RecyclerViewActivity.this, Details.class);
    startActivity(intent);
}

并确保 Details.class 扩展了 Activity。

【讨论】:

  • 我试过了。我收到此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on an null object reference
  • 有些东西没有正确初始化。把你的 logcat
  • 为了做到这一点,我需要将 onClickChangeActivty 设为静态?
  • 不,请检查上面的最后编辑答案。我希望这可以解决您的问题。
  • 您是否将 Context 从 Activity 传递给 Adapter,然后使用此 Context 调用 Adapter 上的方法来调用 Activity 上的方法?请问,你能发布你的代码更新吗?
【解决方案2】:

试试这个:

Intent intent = new Intent(RecyclerViewActivity.this , Details.class);
startActivity(intent);

使用RecyclerViewActivity.this 而不是context

【讨论】:

  • 这应该确实有效。您不需要 ApplicationContext,因为每个 Activity 本身就是一个上下文。因此 RecyclerViewActivity.this 应该可以工作。
  • 我试过了。我收到此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on an null object reference
  • 你能放你的logcat吗?
  • 你没有定义Details Activity!!
【解决方案3】:

解决办法:

在适配器类中创建一个private static Context context;

在您的 inCreateViewHolder() 中,将上下文实例化为 viewGroup.getContext():

@Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        PersonViewHolder pvh = new PersonViewHolder(v);
        context = viewGroup.getContext();
        return pvh;
    }

这就是我得到空指针异常的原因。出于某种原因,我创建一个带有上下文的构造函数,上下文仍然为空。在上面的类中实例化上下文就可以了!感谢所有回答的人。

【讨论】:

    【解决方案4】:

    你正在尝试启动 Details.class -

    但我在您的清单中找不到任何对此活动的引用。

    请补充

    <activity android:name=".Details"</activity>
    

    到您的清单并确保 Details 扩展了 Activity。

    【讨论】:

    • 我的班级名称以前是 CrimeDetails,但后来我在不更改清单的情况下将其更改为 Details。但是只是将其更改为 .Details ,它仍然无法正常工作。仍然出现同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多