Android: 调用新意图时出现空指针异常

7

当我尝试通过意图调用新活动时,出现错误:

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

我的活动有一个按钮,点击它会进入这个方法:

public void onClickChangeActivity() {

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

    }

在类的开头创建 public static Context 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>

日志记录器:

 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)

使用Intent intent = new Intent(RecyclerViewActivity.this, Details.class); 如果变量context有效,则需要将其设置为final变量并像onClickChangeActivity(context)一样使用。 - Santiago
1
Try with context = this; - Jonathan García
@Santiago 刚刚尝试了一下,但是还是出现了同样的错误。 - Akash Magoon
请粘贴您的活动代码和清单。 - Ofir Ohayon
检查我的答案,告诉我它是否有效。 - Ofir Ohayon
显示剩余6条评论
4个回答

8
问题是您试图从适配器中调用活动方法:
RecyclerViewActivity recyclerViewActivity = new RecyclerViewActivity();
recyclerViewActivity.onClickChangeActivity();

您应该将此代码替换为适配器类中的代码。在适配器构造函数中添加以下行:
public RecycleViewAdapter(......, Context context){
    ...your code.
    this.mContext=context;
}

在adapter方法中的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 a null object reference - Akash Magoon
有些东西没有正确初始化。请放置您的logcat。 - Gustavo Morales
为了做到这一点,我需要将onClickChangeActivity方法设为静态的? - Akash Magoon
不,检查上面的最后编辑答案。我希望这能解决你的问题。 - Gustavo Morales
你是否在从Activity传递Context到Adapter后,使用该Context来调用Adapter上的方法以调用Activity上的方法?请问,你能否发布更新后的代码? - Gustavo Morales
2020年的Senk Bro。 - Евгений Половинкин

3

试试这个:

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

使用 RecyclerViewActivity.this 代替 context


确实应该可以。您不需要ApplicationContext,因为每个Activity本身就是一个上下文。因此,RecyclerViewActivity.this应该可以工作。 - Matthias
1
我尝试了一下。我遇到了这个错误:**java.lang.NullPointerException: 尝试在一个空对象引用上调用虚拟方法 'java.lang.String android.content.Context.getPackageName()'**。 - Akash Magoon
你能放一下你的Logcat吗? - ramin eftekhari
您尚未定义详细活动! - ramin eftekhari

2
解决方案:
在适配器类中创建一个私有静态上下文private static Context context; 在你的inCreateViewHolder()方法中,将context实例化为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;
    }

这就是我遇到空指针异常的原因。由于某些原因,当我创建一个带有context参数的构造函数时,context仍然为null。在上述类中实例化context解决了这个问题!感谢回答的所有人。

1

你正在尝试启动Details.class -

但是我在你的清单文件中没有找到任何与此活动有关的引用。

请添加

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

确保您的清单文件中Details类继承自Activity类。

我的类名以前叫做CrimeDetails,但是后来我把它改成了Details,但没有更改清单。然后我只是改成了.Details,但仍然无法正常工作。仍然出现相同的错误。 - Akash Magoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接