今天在做一道题目:将"hello java"每个单词的首字母转换成大写其余还是小写字母(不许直接输出Hello Word 要用代码实现)时,同桌突然突然问我为何他的代码中抛出了异常:
他的代码如下:
public class Shuchudaxie {
public static void main(String[] args) {
String str = "aa aaaaaa"; //中间是两个空格
String[] newstr = str.split(" ");//用一个空格进行拆分
String str2 = "";
for (int i = 0; i < newstr.length; i++) {
str2 += (newstr.substring(0,1).toUpperCase()+ newstr.substring(1,newstr.length())+" ");
}
}
}
运行后结果如下:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.substring(String.java:1907)
at com.lmm.A1.Shuchudaxie.main(Shuchudaxie.java:10)
经过我仔细分析,终于发现了原因:
原来在进行字符串拆分时,newstr数组长度一共为3,数组元素分别为aa, "", aaaaaa. 当for循环遍历到索引1的空字符串元素时,
newstr[1]的实际长度为0,但是因为调用了newstr.substring(0,1).,所以在此处抛出了异常。我通过查看java底层代码发现,substrinf()方法源代码中有以下这种情况。
if (endIndex > value.length) { //value.length为字符串实际长度在本题中为0,endIndex为用户定义的要截取的最大索引,本题中为1
throw new StringIndexOutOfBoundsException(endIndex);
}
所以抛出了索引越界
|
|