android调用方法空指针异常,关于java:android:调用新的intent时,空指针异常

在Android应用中,开发者遇到了尝试启动新活动时的NullPointerException。问题出现在通过Intent尝试从RecyclerViewAdapter调用RecyclerViewActivity的方法onClickChangeActivity()。适配器中的onClickChangeActivity方法尝试实例化RecyclerViewActivity并直接调用其方法,导致错误。解决方案涉及在适配器中存储对上下文的引用,并在适配器内正确调用Activity的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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);

}

公共静态Context上下文是在类的开头创建的,然后在我的onCreate中实例化为context = getApplicationContext();

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

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

从我的RecyclerViewerAdapter类调用onClickChangeActivity:

View.OnClickListener getPersonClickListener(final int position) {

return new View.OnClickListener() {

@Override

public void onClick(View view) {

RecyclerViewActivity recyclerViewActivity = new RecyclerViewActivity();

recyclerViewActivity.onClickChangeActivity();

}

};

清单文件:

package="com.test.akash.android_test">

android:minSdkVersion="16"

android:targetSdkVersion="21" />

android:name="android.permission.WRITE_EXTERNAL_STORAGE"

android:maxSdkVersion="18" />

android:name="android.permission.READ_EXTERNAL_STORAGE"

android:maxSdkVersion="18" />

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme">

android:name=".MainActivity"

android:label="@string/app_name"

android:screenOrientation="portrait">

android:name=".Crime"

android:label="@string/title_activity_crime"

android:screenOrientation="portrait">

android:name=".RecyclerViewActivity"

android:label="@string/title_activity_recycler_view"

android:screenOrientation="portrait">

android:name=".Details"

android:label="@string/title_activity_crime_details"

android:parentActivityName=".RecyclerViewActivity">

android:name="android.support.PARENT_ACTIVITY"

android:value="RecyclerViewActivity" />

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.(ComponentName.java:77)

at android.content.Intent.(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 intent = new Intent(RecyclerViewActivity.this,Details.class); 如果可行,则变量上下文需要是最终变量,并像onClickChangeActivity(context)一样使用

尝试使用context = this;

@圣地亚哥只是尝试了,虽然同样的错误。

@JonathanGarca刚才也尝试过,同样的错误。

粘贴您的活动代码和清单

OK @AkashMagoon发布调用onClickChangeActivity方法的方法,也许您的按钮未正确声明

@圣地亚哥它不是按钮,而是通过我编写的RecyclerView创建的卡片列表。 卡已正确声明,并且onClickChangeActivity被击中(我将日志放入其中进行检查。)

@Santiago Ive在上面添加了我的听众

@OfirOhayon清单在上面。 谢谢!

检查我的答案,告诉我是否可行。

问题是您试图从适配器调用活动方法:

RecyclerViewActivity recyclerViewActivity = new RecyclerViewActivity();

recyclerViewActivity.onClickChangeActivity();

您应该在适配器类中替换此代码。在适配器构造函数中,添加以下行:

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:尝试在空对象引用上调用虚拟方法java.lang.String android.content.Context.getPackageName()

某些未正确初始化的内容。把你的logcat

请看上面

请参阅上方的我的编辑回复。

为此,我需要将onClickChangeActivty设为静态?

不,请检查上面的最后一个编辑答案。我希望这可以解决您的问题。

此编辑仍未消除错误!

您是否要将Context从Activity传递到Adapter,然后使用此Context调用Adapter上的方法来调用Activity上的方法?请,您可以发布您的更新代码吗?

尝试这个:

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

startActivity(intent);

使用RecyclerViewActivity.this代替context

这确实应该起作用。您不需要ApplicationContext,因为每个Activity都是上下文本身。因此,RecyclerViewActivity.this应该起作用。

我试过了我收到此错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法java.lang.String android.content.Context.getPackageName()

你能放你的logcat吗?

Logcat发布在上面!

您没有定义详细信息活动!!

解:

在适配器类中,创建一个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;

}

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

您正在尝试启动Details.class-

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

请加

根据您的清单,确保"详细信息"扩展了"活动"。

我的班级名称曾经是CrimeDetails,但是后来我将其更改为Details而不更改清单。但是只是将其更改为.Details,但仍然无法正常工作。仍然出现相同的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值