Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook for Android获取用户性别时出错_Android_Facebook Graph Api_Facebook Android Sdk - Fatal编程技术网

Facebook for Android获取用户性别时出错

Facebook for Android获取用户性别时出错,android,facebook-graph-api,facebook-android-sdk,Android,Facebook Graph Api,Facebook Android Sdk,在我们的应用程序中,一些用户在注册Facebook时遇到了压力。我们在以下行中收到此stacktrace: 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.yol

在我们的应用程序中,一些用户在注册Facebook时遇到了压力。我们在以下行中收到此stacktrace:

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个注册中就有1个出现这种情况,因此我们无法重现这个问题。如果性别不为空,那么它是什么?

“如果性别不为空,那么它是什么?”:它可能为空,但您将其转换为空字符串。然后,试图在该空字符串上执行子字符串(1)时会出现
IndexOutOfBoundsException

问题在于您使用两个背对背三值运算的方式

第一个三值运算

String gender = user.getProperty("gender") == null ? "" : user.getProperty("gender").toString()
基本上是说

if(user.getProperty("gender") == null){
    gender="";
}
else{
    gender=user.getProperty("gender").toString();
}
if(gender == null){
    gender = ""; //gender instead of String Gender
}
else{
    gender = gender.substring(0,1).toUpperCase(Locale.ENGLISH) + substring(1)
}
到目前为止还不错。 第二个三元运算(这就是让人困惑的地方。我不知道你为什么写“字符串性别”;我认为你应该用“性别”替换)

基本上是说

if(user.getProperty("gender") == null){
    gender="";
}
else{
    gender=user.getProperty("gender").toString();
}
if(gender == null){
    gender = ""; //gender instead of String Gender
}
else{
    gender = gender.substring(0,1).toUpperCase(Locale.ENGLISH) + substring(1)
}
注意,由于第一个三元操作,第一个条件始终为假。基本上,如果有人使用了性别为空的facebook帐户,则第二个三元操作将始终抛出IndexOutOfBoundsException,因为第一个三元操作生成一个空字符串,而第二个三元操作试图获取该空字符串的子字符串。一个简单的测试方法是创建一个新的fb帐户,不填写性别,然后登录到你的应用程序

修复方法:我倾向于避免像瘟疫那样的三元操作,因为即使它们可以保存代码行,但很容易混淆,特别是当两个背对背的操作处理相同的变量时。我将用

if(gender != "") { // Gender exists
    gender = gender.substring(0,1).toUpperCase(Locale.ENGLISH);
}
else{
    // gender us "" so do whatever
}
这是我能想到的处理这件事的“最正确的方法”。您也可以尝试在第二个三值运算中去掉+子字符串(1),这样可以去掉错误,但我不推荐这样做