尝试遍历字符串时出现 java.lang.StringIndexOutOfBoundsException
Posted
技术标签:
【中文标题】尝试遍历字符串时出现 java.lang.StringIndexOutOfBoundsException【英文标题】:java.lang.StringIndexOutOfBoundsException when trying to iterate through a string 【发布时间】:2019-05-25 22:11:05 【问题描述】:我正在尝试编写一个接受用户输入并将其转换为莫尔斯电码的应用程序
功能代码:
public static String[] stringToMorseSequence(String stringOfLetters)
int lenStringOfLetters = stringOfLetters.length();
String output[] = new String[1];
String compInterpreted = "";
for(int i = 0; i < lenStringOfLetters; i++)
String focus = String.valueOf(stringOfLetters.charAt(i));
String nextCharacter = "";
if (i != lenStringOfLetters)
nextCharacter = String.valueOf(stringOfLetters.charAt(i + 1));
else
nextCharacter = "END";
if (focus == " ")
compInterpreted = compInterpreted + "#";
else
String morseSequence = processCharacter(focus);
if (morseSequence == "")
else if (i == lenStringOfLetters)
compInterpreted = compInterpreted + "!";
else if (nextCharacter != "END")
if (nextCharacter != " ")
compInterpreted = compInterpreted + morseSequence + "@";
else
compInterpreted = compInterpreted + morseSequence;
Log.i("MORSE","Computer interpretable morse sequence = " + compInterpreted);
output[0] = compInterpreted;
String prettySequence = "";
for(int i = 0; i-1 < output[0].length(); i++)
switch(String.valueOf(output[0].charAt(i)))
case("#"):
prettySequence = prettySequence + " ";
case("@"):
prettySequence = prettySequence + " ";
default:
prettySequence = prettySequence + output[0].charAt(i);
Log.i("MORSE","Human interpretable morse sequence = " + prettySequence);
output[1] = prettySequence;
return output;
我似乎收到了这个异常
E/androidRuntime: FATAL EXCEPTION: main
Process: me.merhlim.jessica.morsecode, PID: 5687
java.lang.StringIndexOutOfBoundsException: length=10; index=10
at java.lang.String.charAt(Native Method)
at me.merhlim.jessica.morsecode.MorseProcessing.stringToMorseSequence(MorseProcessing.java:16)
at me.merhlim.jessica.morsecode.texttomorse$7.onClick(texttomorse.java:112)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:108)
我知道这是一个逻辑错误,但我不确定这个错误在哪里,或者如何解决它。如错误消息所述,尝试解析字符串中的特定字符时出现索引错误,但我不确定要触发此错误的逻辑不正确
我是 java 新手,而且是深夜,所以也许我只是没有完全理解我正在编写的逻辑中的问题
如果这些信息不足以回答我的问题,我可以提供更多信息
感谢您抽出宝贵时间阅读本文,如果您能提供帮助,我们将不胜感激 -杰西卡
【问题讨论】:
提示:i != lenStringOfLetters
永远为真。
另外,否则 if (i == lenStringOfLetters) 永远不会为真。
线索在异常文本中。字符串的长度为length=10
,您要求的索引为index=10
。由于索引是从 0 开始的,因此与长度相同或大于长度的索引会导致此异常。
【参考方案1】:
当 i 为 9 且小于长度 10 时,调用
nextCharacter = String.valueOf(stringOfLetters.charAt(i + 1));
将尝试让角色位于第 10 位。但是,字符串的长度只有 10,最后一个字符在位置 9,这会导致字符串索引超出范围异常。你可能想改变这个
if (i != lenStringOfLetters)
到
if (i != lenStringOfLetters-1)
【讨论】:
我改变了它,我现在似乎正在接受这个问题 E/AndroidRuntime: 致命异常: 主进程: me.merhlim.jessica.morsecode, PID: 7864 java.lang.ArrayIndexOutOfBoundsException: length=1;索引=1 这是一个不同的问题吗?还是同一个的一部分? @Merhlim 哪一行是异常抛出? @Merhlim 现在是在这一行抛出的异常吗?for(int i = 0; i-1 < output[0].length(); i++)
以上是关于尝试遍历字符串时出现 java.lang.StringIndexOutOfBoundsException的主要内容,如果未能解决你的问题,请参考以下文章
尝试通过函数参数将正文发送到 API 时出现 KeyError
尝试结合使用 jQuery 的 window.open 函数和 for 循环来遍历数组时出现问题
mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.Stri
Caused by: javax.el.PropertyNotFoundException: Property [userName] not found on type [java.lang.Stri