gpt4 book ai didi

android - 使用 Intent 的空指针异常

转载 作者:行者123 更新时间:2023-11-30 04:40:12 25 4
gpt4 key购买 nike

当用户选择不同的语言环境时,我尝试启动新 Activity 时遇到空指针异常。它似乎发生在标记的 Intent 行中。 (我是菜鸟所以简单的解释!)谢谢

public void changeLocale(String locale){
try{
String l=locale;
if(l.equals("uk")){
this.isUk=true;
Log.i(Log_tag,"isUk is true");
//Toast.makeText(this, "UK region selected in Prefs", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UK.class);//<---ERROR IS OCCURING HERE
startActivity(intent);
}else if(l.equals("eu")){
this.isEu=true;
Toast.makeText(this, "EU region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, EU.class);
startActivity(intent);
}else if(l.equals("us")){
this.isUs=true;
Toast.makeText(this, "Us region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, US.class);
startActivity(intent);
}else if (l.equals("")){
Log.i(Log_tag,"no locale passed in");
finish();
}
}catch (NullPointerException e){
Log.i(Log_tag, "Null Pointer Error in changeLocale()"+e);
finish();
}
}

我的 logcat 是这样说的:

05-25 11:55:57.851: WARN/KeyCharacterMap(898): No keyboard for id 0
05-25 11:55:57.861: WARN/KeyCharacterMap(898): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

05-25 11:56:01.522: INFO/(898): UK selected in UsFM
05-25 11:56:01.543: INFO/(898): editRegion() started
05-25 11:56:01.642: INFO/(898): isUk is true
05-25 11:56:01.642: INFO/(898): Null Pointer Error in changeLocale()java.lang.NullPointerException

05-25 11:56:01.953: INFO/NotificationService(69): enqueueToast pkg=com.silifeform.android callback=android.app.ITransientNotification$Stub$Proxy@4380ba08 duration=0
05-25 11:56:01.995: INFO/ActivityManager(69): Starting activity: Intent { cmp=com.silifeform.android/.Us }

05-25 11:56:02.182: WARN/InputManagerService(69): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@438d8b88 (uid=10024 pid=898)

整个类(class)看起来是这样的:

package com.silifeform.android;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class Prefs extends Activity {
public static final String PREFS_NAME="LocalePrefs";
private String region;
public boolean isUk;
public boolean isUs;
public boolean isEu;
private String Log_tag;

@Override
protected void onCreate(Bundle state) {
super.onCreate(state);

//restore prefs
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");

this.region=myRegion;
changeLocale(getRegion(this));
}


@Override
protected void onResume() {
super.onResume();
changeLocale(getRegion(this));
}

public void editRegion(Context cxt, String sregion) {
setRegion(sregion);
Log.i(Log_tag,"editRegion() started");
SharedPreferences settings = cxt.getSharedPreferences(PREFS_NAME,0);
SharedPreferences.Editor ed = settings.edit();
ed.clear();
ed.putString(this.region,sregion);
ed.commit();
changeLocale(sregion);
}

public String getRegion(Context cxt){
SharedPreferences settings= cxt.getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(this.region,"us");
return myRegion;
}

public void setRegion(String region) {
this.region = region;
}


public void changeLocale(String locale){
try{
String l=locale;
if(l.equals("uk")){
this.isUk=true;
Log.i(Log_tag,"isUk is true");
Log.i(Log_tag,l);
//Toast.makeText(this, "UK region selected in Prefs", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UkFuelMoney.class);
startActivity(intent);
}else if(l.equals("eu")){
this.isEu=true;
Toast.makeText(this, "EU region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, EuFuelMoney.class);
startActivity(intent);
}else if(l.equals("us")){
this.isUs=true;
Toast.makeText(this, "Us region D selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, UsFuelMoney.class);
startActivity(intent);
}else if (l.equals("")){
Log.i(Log_tag,"no locale passed in");
finish();
}
}catch (NullPointerException e){
Log.i(Log_tag, "Null Pointer Error in changeLocale()"+e);
finish();
}
}

@Override
protected void onStop() {
super.onStop();
SharedPreferences settings = getPreferences(0);
SharedPreferences.Editor ed = settings.edit();
ed.putString(region,region);
ed.commit();

}
}

谢谢基诺。堆栈跟踪看起来像这样:

05-25 12:10:44.162: WARN/System.err(961): java.lang.NullPointerException
05-25 12:10:44.172: WARN/System.err(961): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120)
05-25 12:10:44.182: WARN/System.err(961): at android.content.ComponentName.<init>(ComponentName.java:75)
05-25 12:10:44.182: WARN/System.err(961): at android.content.Intent.<init>(Intent.java:2302)
05-25 12:10:44.182: WARN/System.err(961): at com.silifeform.android.Prefs.changeLocale(Prefs.java:68)
05-25 12:10:44.192: WARN/System.err(961): at com.silifeform.android.Prefs.editRegion(Prefs.java:46)
05-25 12:10:44.192: WARN/System.err(961): at com.silifeform.android.Us.onOptionsItemSelected(Us.java:347)
05-25 12:10:44.192: WARN/System.err(961): at android.app.Activity.onMenuItemSelected(Activity.java:2096)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:825)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:813)
05-25 12:10:44.202: WARN/System.err(961): at com.android.internal.view.menu.MenuDialogHelper.onClick(MenuDialogHelper.java:120)
05-25 12:10:44.212: WARN/System.err(961): at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:884)
05-25 12:10:44.212: WARN/System.err(961): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
05-25 12:10:44.212: WARN/System.err(961): at android.widget.ListView.performItemClick(ListView.java:3246)
05-25 12:10:44.222: WARN/System.err(961): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1635)
05-25 12:10:44.222: WARN/System.err(961): at android.os.Handler.handleCallback(Handler.java:587)
05-25 12:10:44.222: WARN/System.err(961): at android.os.Handler.dispatchMessage(Handler.java:92)
05-25 12:10:44.232: WARN/System.err(961): at android.os.Looper.loop(Looper.java:123)
05-25 12:10:44.232: WARN/System.err(961): at android.app.ActivityThread.main(ActivityThread.java:4203)
05-25 12:10:44.242: WARN/System.err(961): at java.lang.reflect.Method.invokeNative(Native Method)
05-25 12:10:44.242: WARN/System.err(961): at java.lang.reflect.Method.invoke(Method.java:521)
05-25 12:10:44.242: WARN/System.err(961): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
05-25 12:10:44.252: WARN/System.err(961): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
05-25 12:10:44.252: WARN/System.err(961): at dalvik.system.NativeStart.main(Native Method)
05-25 12:10:44.252: INFO/(961): Null Pointer Error in changeLocale()java.lang.NullPointerException

最佳答案

您的 Prefs Activity 未填充,因为您可能已经在 com.silifeform.android.Us.onOptionsItemSelected() 中自己实例化了它(我想实现仍然相似到您发布的 here )。正如我在回答你提到的问题时已经指出的那样,如果 Prefs 类没有被 Android 实例化(和管理),你不能假设它工作正常(尤其是来自 Context) 因为它没有正确启动。再次应用相同的策略,使用传递给 changeLocale 的单独 Context 对象来解决此问题。

关于android - 使用 Intent 的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6124006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com