如何在android中解决StringIndexOutOfBoundsException

Posted

技术标签:

【中文标题】如何在android中解决StringIndexOutOfBoundsException【英文标题】:how to resolve StringIndexOutOfBoundsException in android 【发布时间】:2014-05-22 05:36:59 【问题描述】:

这是我的 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 @Kevinrob 这是'profile.java:1966'行 String csAppendedCode = phoneNumber.substring(0, csCountryCode.length()); 【参考方案1】:

您确定phoneNumber 不等于""? 您必须检查 phoneNumber 的字符数是否比 csCountryCode.length() 多。

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

【讨论】:

这是正确答案。检查phoneNumber != "";【参考方案2】:

String 的最后一个索引是 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 长度怎么办? length() 始终返回 lastindex+1 值,因此当您尝试使用 lastIndex+1 访问 String 的最后一个索引时,您将始终得到 StringIndexOutOfBoundsException 一次尝试这个String string = "Android"; System.out.println(string.substring(0, string.length()));...不会抛出任何异常... @HamidShatu 否。阅读 java API:substring(int start, int end):返回一个新字符串,它是该字符串的子字符串。子字符串 从指定的 beginIndex 开始并延伸到索引 endIndex - 1 处的字符。你的答案是错误的。

以上是关于如何在android中解决StringIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章

如何解决:Android Studio 中 RunConfiguration 的 Android ClassFormatError

如何使用 Android 11 在 Bash 中解决此错误

如何解决 Android 应用程序受众网络中的质量检查问题?

如何解决在android开发中WebView在线播放视频黑屏啊?

请问在Android中Textview换行显示问题,您如何解决?

如何解决Linkedin在android中的集成