2013-12-23 31 views
2

我認爲下面的問題會很愚蠢(我只是編碼方面的初學者),但我已經坐了很長時間,最後決定放棄它。我有一個方法作爲getName()在類級別訪問string.xml文件並從那裏獲取條目。Android中的奇異NullPointerException

CODE:

public String getName() 
    { 
     String name = null; 
     try { 
      System.out.println("Inside getName"); 
      String app_id = MainActivity.this.getResources().getString(R.string.app_id); 
      System.out.println(app_id); 
      fb = new Facebook(app_id); 
      System.out.println("Before the JSON"); 
      String jsonUser = fb.request("me"); 
      System.out.println("Successful in fb.request"); 
      obj=Util.parseJson(jsonUser); 
      System.out.println("Successful in parsejson"); 
      name = obj.optString("username"); 
} catch... 
} 

當我打電話上述方法中,它在

String app_id = getString(R.string.app_id); 

有趣和最好的部分返回空指針異常是,我有完全相同的線在所述的onCreate()方法如下:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.name_text_view); 
     b = (ImageView) findViewById(R.id.postbutton); 
     snap = (ImageView) findViewById(R.id.camera_image_view); 
     sp = getPreferences(MODE_PRIVATE); 
     **String app_id = getString(R.string.app_id);** 
     fb = new Facebook(app_id); 
     System.out.println("The app_id is " + app_id); 
     String access_token = sp.getString("access_token", null); 
     long expires = sp.getLong("access_expires", 0); 
} 

This不會拋出任何空指針異常。我的問題是,爲什麼它只在方法getName()上拋出NullPointerException。它與R的範圍有什麼關係?我完全迷失在這裏,感到非常尷尬的發佈這樣的問題,但也無法接受這一事實,它拋出我這個愚蠢的錯誤。任何幫助將瘋狂讚賞傢伙!

UPDATE:

logcat的:

12-26 17:24:07.330: W/dalvikvm(23184): threadid=1: thread exiting with uncaught exception (group=0x4118d438) 
12-26 17:24:07.330: E/AndroidRuntime(23184): FATAL EXCEPTION: main 
12-26 17:24:07.330: E/AndroidRuntime(23184): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.facebook_integration/com.example.facebook_integration.SQLiteDemoActivity}: java.lang.NullPointerException 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2099) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread.access$600(ActivityThread.java:138) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.os.Looper.loop(Looper.java:137) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread.main(ActivityThread.java:4954) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at java.lang.reflect.Method.invokeNative(Native Method) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at java.lang.reflect.Method.invoke(Method.java:511) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at dalvik.system.NativeStart.main(Native Method) 
12-26 17:24:07.330: E/AndroidRuntime(23184): Caused by: java.lang.NullPointerException 
12-26 17:24:07.330: E/AndroidRuntime(23184): at com.example.facebook_integration.SQLiteDemoActivity.onCreate(SQLiteDemoActivity.java:33) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.Activity.performCreate(Activity.java:5252) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082) 
12-26 17:24:07.330: E/AndroidRuntime(23184): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2038) 
12-26 17:24:07.330: E/AndroidRuntime(23184): ... 11 more 

更新2:

的strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <string name="app_name">Facebook_Integration</string> 
    <string name="action_settings">Settings</string> 
    <string name="app_id">594458613962731</string> 
    <string name="hello_world">Hello world!</string> 
    <string name="title_activity_snap__image_view">Snap_ImageView</string> 
    <string name="album_name">San_Pictures</string> 
    <string name="title_activity_android_custom_gallery">AndroidCustomGalleryActivity</string> 
    <string name="title_activity_full_screen">FullScreen</string> 
    <string name="title_activity_sqlite_demo">SQLiteDemoActivity</string> 

</resources> 

更新3:

正如我處理與Facebook我認爲這個問題是與創建Facebook的對象(FB)的情況下,所以我評論說行,然後再次嘗試,但它仍然說的NullPointerException在

String app_id = MainActivity.this.getResources().getString(R.string.app_id); 

如果有人處理過這樣的情況,請讓我知道。

UPDATE 4:

MyApp的結構:

以下是我的應用程序的要點

1.登錄到Facebook上。

2.拍照。

3.存儲在數據庫中拍攝的照片的用戶名和路徑。

最初,我的主要活動有Facebook圖像,它會將我登錄到Facebook並檢索用戶名,從而在同一主要活動的textview中設置它。 第二個攝像頭按鈕,將我帶到相機拍照。 拍完照片後,第三項活動應顯示用戶名和圖片存儲路徑(這是我無法再次獲取用戶名的地方)。

+0

可以肯定的是,可以檢查R.java是否在'public static final class string'下有'app_id' – Sudhee

+0

它是在「public static final class String」裏面的!感謝您的考慮。 – San

+0

你是從廣播接收機還是服務中調用getName? – Sudhee

回答

2

在這裏,你應該提供的應用程序或活動方面得到像下面的資源價值:

String app_id=youractivity.this.getString(R.string.app_name); 

這種方式是非常簡單的。希望這有助於...

+0

將嘗試這個並回到雅。 – San

+0

對不起。沒有變化,錯誤依然存在,讓我發瘋。謝謝你的努力。 – San

+0

這很奇怪。 –

1

首先必須檢查您的strings.xml文件APP_ID是正確的。

而且如果是則改變

String app_id = getResources().getString(R.string.app_id); 
+0

我已經在strings.xml中檢查了app_id,它安全無恙。試過,但沒有用。不管怎麼說,多謝拉。多謝。 – San

1

我發現這發生在我身上帶着一個破碎的佈局。無需擔心。我盡我所能爲您提供解決方案

解決方案

確保任何事情R.鏈接不破。修復XML文件中的所有錯誤。如果ADK中的任何內容被破壞,則R不會再生。

如果你以某種方式碰到某個東西並在你的活動中創建了導入android.R,請將其刪除。 運行項目 - >清潔。這將刪除並重新生成R和BuildConfig。

確保項目 - > Build自動打勾。如果沒有,通過菜單 - >項目 - >生成項目手動構建它。

等待幾秒鐘,錯誤消失。

如果它不工作,刪除裏面的東西的/GEN/文件夾

如果還是不行,請嘗試用鼠標右鍵單擊您的項目 - > Android的工具 - >修復項目屬性。

檢查您的* .properties文件(在您的應用程序文件夾的根文件夾中),並確保其中的鏈接沒有損壞。

右鍵單擊您的項目>屬性> Android。

查看頁面右側的Project Build Target和Library部分。您的構建目標應該與AndroidManifest.xml中的目標匹配。因此,如果它在AndroidManifest中設置爲17,請確保目標名稱是Android 4.2。如果您的圖書館在參考下有一個X,請刪除並重新添加該圖書館,直到出現綠色勾號。如果您移動了幾個文件和文件夾,可能會發生這種情況。

如果R不重新

,當你有一個破碎的XML文件,這通常會發生什麼事做。

檢查你的XML文件中的錯誤,主要在/RES/文件夾

常見的地方是/佈局//價值/特別是如果你已經改變了他們的一個最近

檢查AndroidManifest.xml中,我發現我經常改變字符串,而忘記了字符串名稱從AndroidManifest.xml中改變。

檢查Android SDK中內建工具安裝。 窗口 - > Android SDK管理器 - >工具 - > Android SDK構建工具

確保在更新Android SDK工具時,您還要更新Android SDK平臺工具和Android ASK構建工具。如果它們不匹配,構建會自動失敗。

如果找不到問題,請右鍵單擊/gen/- >從本地歷史記錄恢復... - >打勾R.java - >單擊還原。這並不能解決問題,但它會清除額外的錯誤,使問題更容易找到。

希望它能幫助你。 :)

+0

我不能感謝你足夠的朋友。我已經完成了你所提供的每一步,但仍然存在這個愚蠢的問題。非常感謝你爲此付出努力和啓發我。保持這種精神。 – San

1

我不知道什麼問題究竟,但我可以爲您提供更好的解決方案

嘗試保存在共享偏好這個應用程序ID,然後你可以隨時隨地訪問它。

或作出任何類的靜態字符串(我總是對所有的常量靜態變量一類特殊的),然後你可以調用從任何時間任何地點也:)

+0

它不是保存或從任何變量獲取數據的問題。它的錯誤只是因爲字符串結果ID而發生。 – Avijit

+0

謝謝Tarek,但我試圖找到這個錯誤的邏輯原因。當然,你的想法是整潔和完美的,但爲什麼會發生沒有堅實的理由! – San

+0

如果您使用的是Eclipse,您可以期待任何事情:D我的朋友曾經在像您這樣的xml文件中編輯過某些內容,並最終從頭開始重新構建整個應用程序......所以我的建議在做任何事情之前備份您的項目:) –

0

我的基礎上更新修訂回答這個變量:

恐怕創建活動並不僅僅侷限於創造一個活動 對象。接下來是Android系統將執行的各種初始化和設置調用,這將爲該活動提供完整的上下文。 例如:當通過Android系統創建了MainActivity,創建在MainActivity 對象,然後初始化其中也包括結合與資源的 對象。 在應用程序內部創建MainActivity對象時,不會發生這些初始化,因此,您無法訪問資源(以及其他許多事情)。此對象 不是Android Sense中的真實活動對象。它只是MainActivity類的未初始化對象 。

在你的情況下,從資源字符串值是通過訪問時的應用程序,在使用當前的活動範圍內的所有活動 。你可能想要使用 。如果您有需要的活動之間共享信息有不同 方式如下實現這一目標:

  1. 傳遞的信息來回使用意圖上 startActivityForResult() - 首選的方法
  2. 使用一個單獨的與靜態成員類的保存位置,可以 其他 活動訪問的信息(這裏要小心,如果你保存是 相關的活動信息,它會導致崩潰,例如:如果保存 參照TextView在activity1的佈局中,並嘗試訪問 它與不同的佈局活性2,它將使用偏好

希望這澄清了失敗)


  • 爲了更好地回答,我需要完整的結構(不是完整的代碼,只是結構)。

    但是,我可以猜測發生了什麼。我假設你已經創建了一個具有成員函數getName()的特定類,除此之外可能會有。這是我通過查看調用getResources()(MainActivity.this .....)的方式所假設的。我恐怕這不會工作。 Android的對象都是從Android基類繼承而來的,因此有一個與它們相關的上下文。當你有一個單獨的類,使用ApplicationResources()等應用上下文函數的成員函數時,它不會工作,因爲它可能會導致Android應用程序對象沒有實例化的情況,例如:你創建了非Android的對象類並調用getResources(),那麼Android App創建的保證是什麼呢?

    public class MainActivity extends Activity { 
    
        Resources res = this.getResources(); //you cannot use like this 
    

    see here更多

    對此的解決方案是確保你調用創建應用程序後getResources(),第一個進入點在那裏你可以保證:如果你使用getResources像下面出現類似的問題這是你的MainActivity的onCreate()。另外,如果您使用的其他類不從Android基類繼承,請確保運行時環境已通過。

  • +0

    請檢查我的更新。謝謝。 – San

    +0

    我知道有3個活動。 getName()在哪個類中定義? – Sudhee

    +0

    getName()在MainActivity中定義,並在第三個活動中調用。 MainActivity是我的Facebook的詳細信息,並獲得名稱的地方。我也嘗試將名稱(從facebook獲得的用戶名)設置爲另一個字符串變量並將其返回到第三個活動,但返回null!奇怪的呃! – San

    0

    這樣做如下。

    public String getName(Context ctx) 
        { 
         String name = null; 
         try { 
          System.out.println("Inside getName"); 
          **String app_id = ctx.getString(R.string.app_id);** 
    

    您不需要調用getResources。在調用此方法時傳遞Context/ctx,如果您沒有從activity/service/Receiver調用此方法。請將上下文實例保存在靜態變量中。

    +0

    對不起Ankit。也沒有工作。不管怎麼說,多謝拉。 – San

    相關問題