2011-06-07 45 views
1

我有奇怪的問題......奇怪的NullPointerException

我的文件的strings.xml包含:

​​

好了,我的R含有:

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

所以,當我嘗試調用這個字符串在我的代碼是這樣的:

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

我有這樣的錯誤:

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

在{這裏我實例化的building_name行}

這有什麼錯我的代碼請幫助

+0

你有沒有導入你的R類,而不是android.R類? – Egor 2011-06-07 07:39:03

+0

沒關係我找到了解決方案,謝謝! (看看其他答案) – Greg 2011-06-07 09:06:48

回答

9

你不能叫getString您的活動已前初始化。這是因爲getStringcontext.getResources().getString()相同。上下文未初始化。

所以基本上,你不能以這種方式給靜態變量賦值。

但有一種方法可以在靜態變量中使用資源字符串。爲此,創建您的應用程序(請參閱thisthis),然後從中檢索上下文。下面是一個簡單的例子:

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

然後創建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);  
    } 
} 

,然後用它來獲得字符串資源:

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

你甚至可以做到這一點杉靜領域。

+0

+1,真棒 - 我自己得到了這個錯誤的一個版本。很好的解釋。 – orip 2012-01-12 15:51:47

2

使用這可能幫助你

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

這對我的作品

2

有一些情況下,發生這種情況,對於同你應該嘗試一些步驟如下所述:

  1. 嘗試清理你的項目。
  2. 檢查是否導入了android.R類文件,如果導入了,然後將其刪除並導入您的R類文件。
  3. 嘗試使用getResources()。getString(R.string.myString)方法。