是一个java的初学者,不知道为什么这个代码运行时报错,编译器显示String s1=s.substring(start,loc);出错

package pk1;

import java.util.Scanner;

public class 字符串 {

public static void main(String[] args) {

    Scanner in=new Scanner(System.in);
    String s=in.nextLine();
    String sum=" ";
    int loc=0;
    int start=0;
    while(loc<s.length()) {
        loc=s.indexOf(' ',loc+1);
        String s1=s.substring(start,loc);
        start=loc+1;
        sum+=s1.length()+" ";
    }
    System.out.println(sum.trim());
}

}
以下是题目
题目内容:
你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it's”算一个单词,长度为4。注意,行中可能出现连续的空格。
输入格式:
输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。
输出格式:
在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。
输入样例:
It's great to see you here.
输出样例:
4 5 2 3 3 4

报错信息是什么,贴一下

用切割方法,if匹配到空格就切割

img


这个地方取不到空格就会给loc赋值为-1,在下一步截取的时候会出现数组越界,这个你要判断字符串有没有匹配到空格

java.lang.StringIndexOutOfBoundsException 数组越界异常 教给你一个识别bug的方法 java不是有命名规则吗 按照命名规则加空格 StringIndexOutOfBoundsException 变成 String Index Out Of Bounds Exception 然后你就知道是什么bug了 这个bug的名字很显而易见 就是你想要的数字超过了数组的最大值 就出现这个异常了 出现的问题是在这一行 String s1=s.substring(start,loc); 但实际出现的问题是在这里 loc = s.indexOf(' ', loc + 1); 当到最后一位的时候 这里算出来的结果是-1 indexOf这个方法我去看了一下 是从哪个位置朝后检索这个字符 然而当你到最后一段的时候是没有空格的 然后抛出索引越界 -1 接下来你的String s1=s.substring(start,loc); 去从start位置开始 到 -1这个位置进行截取 自然就报错了 解决的办法

    while (loc < s.length()) {
        loc = s.indexOf(' ', loc + 1);
        if (loc == -1) {
            loc = s.length();
        }
        String s1 = s.substring(start, loc);
        start = loc + 1;
        sum += s1.length() + " ";
    }