0

我正在阅读 Android Facebook 教程:https ://developers.facebook.com/docs/howtos/androidsdk/3.0/fetch-user-data/

在这段代码中:

private String buildUserInfoDisplay(GraphUser user) {

        StringBuilder userInfo = new StringBuilder("");
        Log.d("Graphuser:user",user.toString());
        Log.d("StringBuilder:userInfo",userInfo.toString());
        // Example: typed access (name)
        // - no special permissions required
        Log.d("Name: ",String.format("Name: %s\n\n", user.getName()));

        userInfo.append(String.format("Name: %s\n\n", user.getName()));

        // Example: typed access (birthday)
        // - requires user_birthday permission
        //userInfo.append(String.format("Birthday: %s\n\n", user.getBirthday()));

        // Example: partially typed access, to location field,
        // name key (location)
        // - requires user_location permission
        //userInfo.append(String.format("Location: %s\n\n", user.getLocation().getProperty("name")));

        // Example: access via property name (locale)
        // - no special permissions required
        userInfo.append(String.format("Locale: %s\n\n", user.getProperty("locale")));

     // Get a list of languages from an interface that
     // extends the GraphUser interface and that returns
     // a GraphObject list of MyGraphLanguage objects.
     GraphObjectList<MyGraphLanguage> languages = (user.cast(MyGraphUser.class)).getLanguages();
     Log.d("Languages",languages.toString());
     if (languages.size() > 0) {
         ArrayList<String> languageNames = new ArrayList<String> ();
         // Iterate through the list of languages
         for (MyGraphLanguage language : languages) {
             // Add the language name to a list. Use the name
             // getter method to get access to the name field.
             languageNames.add(language.getName());
         }                      

         //userInfo.append(String.format("Languages: %s\n\n", languageNames.toString()));
     }

        return userInfo.toString();
    }

userInfo.append()函数导致空指针异常。有没有人遇到过这个?我检查了我的代码是否与教程中的代码相同。

/* 更新 - 附加 Logcat */

03-16 17:59:18.154: W/dalvikvm(1189): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
03-16 17:59:18.204: E/AndroidRuntime(1189): FATAL EXCEPTION: main
03-16 17:59:18.204: E/AndroidRuntime(1189): java.lang.NullPointerException
03-16 17:59:18.204: E/AndroidRuntime(1189):     at net.myname.myapp.MainFragment.buildUserInfoDisplay(MainFragment.java:84)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at net.myname.myapp.MainFragment.access$2(MainFragment.java:56)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at net.myname.myapp.MainFragment$2.onCompleted(MainFragment.java:125)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at com.facebook.Request$1.onCompleted(Request.java:264)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at com.facebook.Request$4.run(Request.java:1240)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at android.os.Handler.handleCallback(Handler.java:615)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at android.os.Looper.loop(Looper.java:137)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at android.app.ActivityThread.main(ActivityThread.java:4745)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at java.lang.reflect.Method.invokeNative(Native Method)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at java.lang.reflect.Method.invoke(Method.java:511)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-16 17:59:18.204: E/AndroidRuntime(1189):     at dalvik.system.NativeStart.main(Native Method)
03-16 17:59:18.354: D/dalvikvm(1189): GC_CONCURRENT freed 423K, 6% free 8428K/8903K, paused 107ms+76ms, total 316ms
4

2 回答 2

1

当用户没有在 facebook 上提供该信息时,代码会失败。使用 try 和 catch 包装代码以获取 java.lang.NullPointerException

于 2013-03-19T00:00:34.040 回答
0

这可能与您的线程安全有关buildUserInfoDisplay,因为 StringBuilder 不应该像那样失败。可能有不同的线程同时访问该函数,这导致了 NPE(StringBuilder 内部?)。

尝试同步方法或使用StringBuffer而不是StringBuilder,这是线程安全的。

Ps.:哇,这就像为荣耀而写作:)

于 2013-03-16T23:09:37.363 回答