2011-06-07 3 views
1

J'ai un problème étrange ...étrange NullPointerException

Mon fichier strings.xml contient:

<?xml version="1.0" encoding="utf-8?> 
<resources> 
    <string name="building_name">My House</string> 
</resources> 

Eh bien, mon R contient:

[...] 
public static final class String { 
    public static final int building_name=0x7f02383; 
} 
[...] 

Alors, quand je tente d'appeler cette chaîne dans mon code comme ceci:

private final String BUILDING_NAME = getString(R.string.building_name); 

J'ai cette erreur:

java.lang.RuntimeException: Unable to instanciate activity ComponentInfo{...}:   java.lang.NullPointerException 
{...} 
    caused by: java.lang.NullPointerException 

à {la ligne où j'instancier building_name}

Quel est le problème avec mon code S'il vous plaît aider

+0

Avez-vous importé votre classe R, pas la classe android.R? – Egor

+0

C'est bon j'ai trouvé la solution, merci! (regardez les autres réponses) – Greg

Répondre

9

Vous ne pouvez pas appeler getString avant votre activité a été initialisé. C'est parce que getString est le même que context.getResources().getString(). Et le contexte n'est pas initialisé.

Donc, fondamentalement, vous ne pouvez pas attribuer de valeur aux variables statiques de cette manière.

Mais il existe un moyen d'utiliser des chaînes de ressources dans vos variables statiques. Pour cela, créez votre application (voir this et this), puis récupérez le contexte à partir de là. Voici un court exemple:

<manifest ...> 
    ... 
    <application android:name="com.mypackage.MyApplication" ... > 
     ... 
    </application> 
    ... 
</manifest> 

Ensuite, créez le fichier MyApplication.java:

public class MyApplication extends Application 
{ 
    private static MyApplication s_instance; 

    public MyApplication() 
    { 
     s_instance = this; 
    } 

    public static Context getContext() 
    { 
     return s_instance; 
    } 

    public static String getString(int resId) 
    { 
     return getContext().getString(resId);  
    } 
} 

et ensuite utiliser pour obtenir des ressources de chaîne:

private final String BUILDING_NAME = MyApplication.getString(R.string.building_name); 

Vous pouvez même le faire statique sapin des champs.

+0

+1, impressionnant - J'ai moi-même une version de cette erreur. Bonne explication. – orip

2

En utilisant cela pourrait vous aider à

getResources().getString(R.string.building_name); 

Cela fonctionne pour moi

2

Il y a des cas où cela se produit, pour la même que vous devriez essayer quelques étapes ci-dessous:

  1. Essayez pour nettoyer votre projet.
  2. Vérifiez si le fichier de classe android.R est importé ou non, s'il est importé, supprimez-le et importez votre fichier de classe R.
  3. Essayez d'utiliser la méthode getResources(). GetString (R.string.myString).