【问题标题】:I don't understand why I am getting an index out of bound exception? [duplicate]我不明白为什么我的索引越界异常? [复制]
【发布时间】:2013-11-12 15:07:38
【问题描述】:

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

线程“main”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);
  }      
}

【问题讨论】:

  • i &lt;= s.length()... 真的,您应该至少在发布问题之前调试您的代码。

标签: java indexoutofboundsexception


【解决方案1】:
for(int i = 0; i <= s.length(); i++){

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

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

编辑:

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

【讨论】:

  • 我认为解释为什么s.length() 越界会很有用。否则,你给出的答案没有解释。
  • 这个解释不太对。 length() 为 10 的字符串有 10 个字符,索引为 0 到 9。last index 始终为 length() - 1
  • @IanMcLaird:是的,我的意思是索引,已更新。随时更新(我不是以英语为母语的人)
【解决方案2】:

你的问题在这里:

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() 的角色,该角色不存在。这就是您收到异常的原因。

【讨论】:

    【解决方案3】:

    String 内部使用数组,数组索引的有效范围是从 0length-1for 循环中的代码将尝试访问 array[length] 元素,这将抛出 ArrayIndexOutOfBoundException

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

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

    应该是

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

    【讨论】:

    • 不是数组;这是String。 :)
    【解决方案4】:

    您需要进行以下 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() 代替,例如

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

    控制台输出:

    Percent of spaces is 14.285714285714286
    

    【讨论】:

      【解决方案5】:

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

      public static void countSpaces(String s){ 双倍计数 = 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);
        }
      

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2013-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多