2011-05-25 2 views
1

Je reçois une exception de pointeur null essayant de démarrer une nouvelle activité lorsque l'utilisateur choisit un environnement local différent. Il semble se produire dans la ligne d'intention comme marqué. (! Je suis un noob si des explications simples s'il vous plaît) MerciException de pointeur nul utilisant l'intention

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

Mon logcat dit ceci:

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) 

La classe entière ressemble à ceci:

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

    } 
} 

Merci Keno. La trace de la pile ressemble à ceci:

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 ajoutez votre journal ici, –

+0

Qu'est-ce que 'Prefs' et est-ce, ou' Prefs.this' null? – forsvarir

+0

il suffit d'imprimer "l" pour consoler et vérifier ce que vous obtenez dans et aussi mettre votre journal – Sumant

Répondre

1

Votre Prefs activité n'est pas peuplée que vous avez probablement instancié vous-même dans com.silifeform.android.Us.onOptionsItemSelected() (je suppose que la mise en œuvre est encore semblable à celui que vous avez posté here). Comme je l'ai déjà souligné en réponse à la question référée, si la classe Prefs n'est pas instanciée (et gérée) par Android, vous ne pouvez pas supposer qu'elle fonctionne correctement (en particulier toutes les méthodes de Context) car elle n'est pas correctement lancée. Encore une fois la même stratégie s'applique, utilisez un objet Context séparé que vous passez à changeLocale pour résoudre ce problème.

+0

Merci Stéphane, oui en effet, le même problème encore une fois. Je ne comprends pas vraiment comment utiliser le contexte. J'ai essayé de comprendre, mais comme vous pouvez le voir, je ne suis pas encore là. Je vais essayer avec l'objet de contexte, merci. – Broo

+0

Ça ne marche pas car je ne comprends pas comment faire passer le contexte. J'ai instancié l'objet Prefs dans les variables de champ, et j'ai essayé de l'utiliser dans com.silifeform.android.Us.onOptionsItemSelected(), mais je ne fais que deviner à ce stade. Désolé, j'apprécie vraiment votre patience et aide avec ceci :) – Broo

+0

Comme une face rapide juste faire la même chose que la dernière fois: Ajouter un paramètre de type Context à 'changeLocale' et passer cela de l'appel dans' onOptionsItemSelected() ' et utiliser ce nouveau paramètre comme premier paramètre dans les appels 'new Intent()'. – Stephan