2011-05-25 96 views
1

我收到一个空指针异常,试图在用户选择不同的语言环境时尝试获取新的活动。它似乎在标记的意图行中发生。 (!我是小白这么简单的解释请) 感谢使用意图的空指针异常

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 [email protected] 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 [email protected] (uid=10024 pid=898) 

全班看起来是这样的:

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 
+1

plz在这里添加您的日志, – 2011-05-25 11:52:35

+0

什么是'Prefs',是它还是'Prefs.this' null? – forsvarir 2011-05-25 11:55:41

+0

只是打印“l”来控制和检查你进入它并且还把你的日志 – Sumant 2011-05-25 11:57:35

回答

1

Prefs活动没有填充,你可能已经在com.silifeform.android.Us.onOptionsItemSelected()自己实例化它(我猜的实现仍然类似于您发布here的一个)。正如我在回复你所提到的问题时已经指出的那样,如果Prefs类没有被Android实例化(和管理),你不能认为它正常工作(特别是从Context开始的所有方法),因为它没有正确启动。再次应用相同的策略,请使用您传递给changeLocale的单独的Context对象来解决此问题。

+0

谢谢斯蒂芬,的确,同样的问题再次出现。我不太了解如何使用上下文。我一直试图弄清楚,但正如你所看到的,我还没有。我会尝试使用上下文对象,谢谢。 – Broo 2011-05-25 12:31:37

+0

它不工作因为我不明白如何传递上下文。我已经实例化了字段变量中的Prefs对象,并试图在com.silifeform.android.Us.onOptionsItemSelected()中使用它,但我真的只是猜测在这个阶段。对不起,我真的很感谢你的耐心和帮助:) – Broo 2011-05-25 12:49:00

+0

作为一个快速的脸就像上次一样:将一个Context类型的参数添加到'changeLocale'中,并通过'onOptionsItemSelected()并在新的Intent()调用中使用该新参数作为第一个参数。 – Stephan 2011-05-25 13:19:48