【问题标题】:String index out of range exception and for loop is not working字符串索引超出范围异常和 for 循环不起作用
【发布时间】:2013-08-16 19:15:44
【问题描述】:

我得到了第一个 for 循环的正确输出:for(int i=0;i<=name.length();i++),但不知道为什么我没有得到这个循环的任何输出:for(int i=name.length();i>=0;i--)。执行时我收到一条错误消息,指出索引超出范围。

我检查了错误here,但我不明白。

public class runner {
    public static void main(String[] args) {
        String name = "java";
        System.out.println(".length method()" + name.length());// executing
                                                                // .length()
                                                                // method
        System.out.println(".charAt method()" + name.charAt(5));
        for (int i = 0; i <= name.length(); i++) {
            System.out.println(name.charAt(i));
        }
        for (int j = name.length(); j >= 0; j--) {
            System.out.println(name.charAt(j));
        }
    }
}

输出

j
a
v
a

【问题讨论】:

  • for 循环条件中将 &lt;= 更改为 &lt;
  • 在Java中,类名要大写(Runner而不是runner),粘贴代码前请运行格式化程序。
  • 为了简化下面的所有答案,索引从 0 开始,这意味着最大可访问索引是长度为 1。因此,索引必须在 0
  • 这也可能很有趣。 stackoverflow.com/questions/3925130/…

标签: java


【解决方案1】:

问题是i&lt;=name.length();

你想要i&lt;name.length();,因为长度超出了 String 中包装的 char 数组的范围。

同理,需要将第二个for循环改为

for(int j=name.length()-1 ;j>=0;j--){

【讨论】:

    【解决方案2】:

    数组是 0-indexed,将 &lt;= 更改为 &lt;

    你每次打电话都会收到这个错误

    name.charAt(name.length())
    

    【讨论】:

      【解决方案3】:

      您有超出范围的异常,因为 Java 数组索引从零开始。例如,如果您有长度 = 5 的数组,则第一个元素的索引将为 0,最后一个元素的索引将为 4(长度 - 1)。

      换行

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

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

      和线

      for(int j=name.length();j>=0;j--){
      

      for(int j=name.length()-1;j>=0;j--){
      

      【讨论】:

        【解决方案4】:

        其他答案已经指出,索引在 java(和大多数其他编程语言)中从零开始。

        由于您似乎是 java 新手,这里是一个没有显式使用索引的示例。

        import java.util.ArrayList;
        import java.util.Collections;
        import java.util.List;
        
        public class Test
        {
        
          public static void main(String[] args)
          {
            String name = "java";
        
            System.out.println("NORMAL ORDER\n");
        
            for (char c : name.toCharArray()) // for each loop
              System.out.println(c);
        
            System.out.println("\nREVERSE ORDER\n");
        
            List<Character> chars = new ArrayList<Character>(); // it's not possible to use primitive types as generic parameter
        
            for (char c : name.toCharArray()) // we fill the chars list
              chars.add(c); // autoboxing from char to Character
        
            Collections.reverse(chars);
        
            for (char c : chars)
              System.out.println(c);
          }
        }
        

        输出

        NORMAL ORDER
        
        j
        a
        v
        a
        
        REVERSE ORDER
        
        a
        v
        a
        j
        

        【讨论】:

          【解决方案5】:

          永远记得检查数组可以拥有的最高索引。在您的情况下,name.length() 函数返回字符串名称的大小。

          假设您的字符串是“JAVA”,它包含 4 个字符。所以name.length() 将返回 4。

          但请注意,每个字符的索引是:

          'J' - 0
          
          'A' - 1
          
          'V' - 2
          
          'A' - 3
          

          当您将索引计数器设置为 4 时,它会尝试访问数组边界中不存在的内容。因此引发了ArrayIndexOutOfBoundsException

          为了解决您的问题,请将所有name.length() 调用转入name.length() - 1。或者修改for循环不包括计数器等于name.length()的情况

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-23
            • 2017-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多