在我们的应用中注册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那么它是什么?
答案 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),这样可以摆脱错误,但这不是我推荐的。