如何解决Android中的StringIndexOutOfBoundsException问题

14

这是我的logcat报告:

java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=2
at java.lang.String.startEndAndLength(String.java:583)
at java.lang.String.substring(String.java:1464)
at com.buzzador.profile.getValidPhoneNumber(profile.java:1966)
at com.buzzador.profile.setDataForServer(profile.java:1717)
at com.buzzador.profile$5.onClick(profile.java:236)
at android.view.View.performClick(View.java:4377)
at android.view.View$PerformClick.run(View.java:18044)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5306)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)

我认为问题出在这个函数里:

public String getValidPhoneNumber (String phoneNumber, String country)
{
    String csValidPhoneNumber = "";

    phoneNumber = getPhoneNumberWithoutReqularExpresions(phoneNumber);
    phoneNumber = phoneNumber.replaceFirst ("^0*", "");

    String csCountryCode = getCountryCode(country);

    String csAppendedCode = phoneNumber.substring(0, csCountryCode.length());
    if(csAppendedCode.equals(csCountryCode))
    {
        csValidPhoneNumber = "+" + phoneNumber;
        return csValidPhoneNumber;
    }

    csValidPhoneNumber = "+" + csCountryCode + phoneNumber;

    return csValidPhoneNumber;
}

你的代码中 profile.java:1966 是哪一行? - Kevin Robatel
@Kevinrob 这是 'profile.java:1966' 行的代码。String csAppendedCode = phoneNumber.substring(0, csCountryCode.length()); - Farhan Shah
2个回答

14

你确定phoneNumber不等于""吗? 你要检查phoneNumber是否比csCountryCode.length()更长。

String csAppendedCode = phoneNumber.length() > csCountryCode.length() ? phoneNumber.substring(0, csCountryCode.length()) : "";

这是正确的答案。要检查 phoneNumber != ""; - Mohammed Ali

1
一个字符串的最后一个索引是string.length()-1,但您正在尝试使用string.length()访问不存在的索引,这就是为什么会出现此异常的原因...
java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=2

现在,你应该更改这一行...
String csAppendedCode = phoneNumber.substring(0, csCountryCode.length());

到这个...

String csAppendedCode = phoneNumber.substring(0, csCountryCode.length()-1);

不是一个有效的答案!如果 csCountryCode 的长度大于 phoneNumber 的长度会怎么样? - Gopal Gopi
length() 方法总是返回 lastindex+1 的值,因此当您尝试使用 lastIndex+1 访问 String 的最后一个索引时,您将始终收到 StringIndexOutOfBoundsException 异常。 - Hamid Shatu
1
尝试运行以下程序:String string = "Android"; System.out.println(string.substring(0, string.length()));,不会抛出任何异常。 - Gopal Gopi
1
@HamidShatu 不对。请阅读Java API文档:substring(int start, int end):返回一个新的字符串,该字符串是此字符串的子字符串。子字符串从指定的beginIndex开始,并延伸到索引endIndex-1处的字符**。你的答案是错误的。 - BackSlash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接