获取用户性别的Facebook for Android错误

时间:2015-03-28 14:36:05

标签: android facebook-graph-api facebook-android-sdk

在我们的应用中注册Facebook时,有些用户正在关闭。我们在下面的行中收到了这个堆栈跟踪:

java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=1
at java.lang.String.startEndAndLength(String.java:588)
at java.lang.String.substring(String.java:1475)
at com.yolify.android.Activity_Splash$7.onCompleted(Activity_Splash.java:483)
at com.facebook.Request$1.onCompleted(Request.java:281)
at com.facebook.Request$4.run(Request.java:1666)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
at dalvik.system.NativeStart.main(Native Method)

代码:

String gender = user.getProperty("gender") == null ?  "" :  user.getProperty("gender").toString();
String Gender = gender == null ? "" : gender.substring(0,1).toUpperCase(Locale.ENGLISH)+gender.substring(1);

强制关闭发生在代码的第二行。由于这种情况大约发生在100个注册中,我们无法重现这个问题。如果性别不为null那么它是什么?

1 个答案:

答案 0 :(得分:0)

"如果性别不为空,那么它是什么?" :它可能是null但你把它变成一个空字符串。然后IndexOutOfBoundsException来自尝试在该空字符串上执行子串(1)。

问题在于您使用两种背对背的三元操作。

第一次三元运作

String gender = user.getProperty("gender") == null ? "" : user.getProperty("gender").toString()

基本上是在说

if(user.getProperty("gender") == null){
    gender="";
}
else{
    gender=user.getProperty("gender").toString();
}

到目前为止一切顺利。 第二个三元操作(这是令人困惑的地方。我不知道为什么你写了“字符串性别&#39 ;;我认为你应该替换为'性别')

String Gender = gender == null ? "" : gender.substring(0,1).toUpperCase(Locale.ENGLISH)+gender.substring(1)

基本上是在说

if(gender == null){
    gender = ""; //gender instead of String Gender
}
else{
    gender = gender.substring(0,1).toUpperCase(Locale.ENGLISH) + substring(1)
}

请注意,由于第一个三元操作,第一个条件始终为false。基本上第二个三元操作将总是抛出IndexOutOfBoundsException,因为你的第一个三元操作使用一个空字符串,而你的第二个三元操作试图获得该空字符串的子字符串。一种简单的测试方法是创建一个新的fb帐户,而不是填写性别,然后登录您的应用。

修复:我倾向于避免像瘟疫这样的三元操作,因为即使它们保存了代码行,也很容易混淆,特别是当你有两个背靠背处理相同的变量时。我会用

替换第二个三元操作
if(gender != "") { // Gender exists
    gender = gender.substring(0,1).toUpperCase(Locale.ENGLISH);
}
else{
    // gender us "" so do whatever
}

这是最正确的方式"我能想到处理这件事。您也可以尝试在第二个三元操作中摆脱+ substring(1),这样可以摆脱错误,但这不是我推荐的。