-3

这是上一年的考试题,有错误,但我似乎无法理解为什么?我不断收到此错误:

线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:21

public class SwimmingPool{ 

  public static void countSpaces(String s){
    int count = 0;

    for(int i = 0; i <= s.length(); i++){
      if(s.charAt(i) == ' '){
        count++;
      }
    }
    System.out.println("Percent of spaces is" + count /
    s.length());
  }

  public static void main (String[] args){

    String s = "lefhg aljdfgh liauh h";
    countSpaces(s);
  }      
}
4

5 回答 5

4
for(int i = 0; i <= s.length(); i++){

应该是(注意它只是小于符号,而不是小于等于):

for(int i = 0; i < s.length(); i++){

编辑:

String索引从零开始并上升到String length() -1. 如果您使用<=s.length(),您将在字符串末尾查找一个索引(当 = 条件检查发生时)。

于 2013-11-12T15:08:17.980 回答
1

你的问题在这里:

for(int i = 0; i <= s.length(); i++)

它应该是:

for(int i = 0; i < s.length(); i++) //note that it is LESS THAN 

字符串索引在 Java 中是从 0 开始的,从0到运行string.length() - 1。因此,您正在尝试访问string.length()不存在的 location 的角色。这就是您遇到异常的原因。

于 2013-11-12T15:09:58.430 回答
0

您需要进行以下 2 项更改:

1 改变

 for(int i = 0; i <= s.length(); i++){

 for(int i = 0; i < s.length(); i++){

2 count / s.length()需要改变。如果这样做,在您的示例中它将为零。

改为使用100.0 *count / s.length()for,例如

System.out.printf("Percent of spaces is " + 100.0 *count / s.length());

控制台中的输出:

Percent of spaces is 14.285714285714286
于 2013-11-12T15:15:40.993 回答
0

首先,我们可以访问“s.length-1”而不是“s.length”,因为我们得到了异常。其次,要获得“count /s.length()”的百分比是很困难的,因为两者都是 int 数据类型,并且结果是十进制的,它被四舍五入并显示为 0。如果我们将 count 声明为加倍,然后我们可以得到确切的百分比。

public static void countSpaces(String s){ double count = 0.0;

    for(int i = 0; i < s.length(); i++){
      if(s.charAt(i) == ' '){
        count++;
      }
    }
    System.out.println("Percent of spaces is" + count /
    s.length());
  }

  public static void main (String[] args){

    String s = "lefhg aljdfgh liauh h";
    countSpaces(s);
  }
于 2013-11-12T15:39:58.570 回答
0

String内部使用数组和数组索引的有效范围是 from0length-1。您在for循环中的代码将尝试访问该array[length]元素,该元素将抛出ArrayIndexOutOfBoundException.

因此,将您的 for 循环条件更改为仅迭代到长度为 1 的索引(最后一个元素)。

for(int i = 0; i <= s.length(); i++)

应该

for(int i = 0; i < s.length(); i++)
于 2013-11-12T15:10:10.623 回答