java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1

我正在学习Java,我不知道这里有什么问题。 为什么会发生这种错误? 我没有看到任何错误,直到我在第二个“for”循环之前写入“count = 0”行时才实际工作。

这是错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:1

这就是错误发生的地方:

if(mots.get(j).startsWith(searchPhrase.substring(0,1))){ 

这是整个代码:

 import java.util.*; public class Test { public static void main(String[] args) { List mots = new ArrayList(); List saida = new ArrayList(); mots.add("un"); mots.add("deux"); mots.add("trois"); String searchPhrase = "aaasdeuxctsundesle"; int count = 0; int countAnula = 0; int azul = 0; String anula = "-"; //Tem que fazer cast para char depois String frase = searchPhrase; for (int i = 0; i < frase.length(); i++) { count = 0; for (int j = 0; j < mots.size(); j++) { if (mots.get(j).startsWith(searchPhrase.substring(0,1))) { for (int t = 0; t < mots.get(j).length(); t++) { if (searchPhrase.charAt(t) == mots.get(j).charAt(t)) { azul ++; } else { break; } } if (azul == mots.get(j).length()) { saida.add(mots.get(j)); searchPhrase = searchPhrase.substring(mots.get(j).length()); j = 0; azul = 0; } else { searchPhrase = searchPhrase.substring(1); saida.add(anula); j = 0; azul = 0; } } else { count ++; } } if (count == mots.size()) { searchPhrase = searchPhrase.substring(1); saida.add(anula); count = 0; } } for (int g = 0; g < saida.size(); g++) { System.out.println(saida.get(g)); } } } 

首先,祝贺Java入门。 这是一种令人惊叹的语言,可能性无穷无尽。 以下是修复错误的方法。

第一步是准确理解你的错误意味着什么,所以让我们开始吧!

java.lang.StringIndexOutOfBoundsException: String index out of range: 1

抛出的exception类型是StringIndexOutOfBoundsException。 无论何时获得IndexOutOfBoundsException(或其任何类型),都意味着您正在尝试访问不存在的数组中的索引。 通过调用substring方法,您将字符串数组中的字符串分开,并选择字符A到B(在您的情况下为0到1)。 如果字符1不存在,但您尝试访问它,则会抛出此错误。

因此,您获得此错误的原因是您尝试在少于1个字符的String上执行substring(0,1) ,也就是空字符串甚至是空字符串。

另外,给你一个快速提示。 通常,如果方法体延伸12行,则应创建新方法。 这将极大地提高代码的可读性。 我花了一段时间才找到适合您修复的地方:-)

更改

 if (mots.get(j).startsWith(searchPhrase.substring(0, 1))) { 

 if (searchPhrase != null && searchPhrase.length() > 0 && mots.get(j).startsWith(searchPhrase.substring(0, 1))) { 

通过执行此操作,您可以在执行substring方法之前检查字符串的长度是否足够

正如@ray所说,检查exception消息表明当searchPhrase为空字符串时会出现问题。 在这种情况下,我们尝试从size = 0的空字符串中请求substring(0, 1) ,因此我们将获得StringIndexOutOfBoundsException 。 为避免这种情况,我们可以先检查并确认searchPhrase的大小> 0

因此,快速解决方法是将行替换为if (mots.get(j).startsWith(searchPhrase.substring(0, 1))) { to if (searchPhrase.length() > 0 && mots.get(j).startsWith(searchPhrase.substring(0, 1))) {

同样,您可能希望更改if (count == mots.size()) { to if (searchPhrase.length() > 0 && count == mots.size()) {

我修改了上面两行,可以毫无例外地运行代码。 输出是:

 - - - - deux - - - un - - - - -