【问题标题】:ArrayIndexOutOfBoundsException for my PrintList function and I have no idea why我的 PrintList 函数的 ArrayIndexOutOfBoundsException 我不知道为什么
【发布时间】:2013-11-07 22:33:28
【问题描述】:

我正在编写一个非常简单的程序,它会在用户达到当前数组的限制时自动扩展数组。

问题是我在运行 PrintList 方法时收到 java.lang.ArrayIndexOutOfBoundsException,我真的不知道为什么。如果我使用大于数组(例如 500)的随机数,它会完美运行,但如果我使用

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

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

我遇到了一个令人讨厌的异常。我该如何处理?为什么我首先会得到它?

非常感谢您的帮助!

这是我的程序的源代码:

public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    int index = 0;
    String[] randomString = new String[1];

    while (index <= randomString.length) {

        out.println("Enter your string");
        String input = keyboard.next();
        randomString[index] = input;
        PrintArray(randomString);
        index++;

        if (index >= randomString.length) {
            ExtendArray(randomString);
            continue;
        }
    }
}

public static void ExtendArray(String[] stringArray) {

    String[] secondArray = new String[stringArray.length * 2];
    // Copy first array into second array
    for (int i = 0; i < stringArray.length; i++) {
        stringArray[i] = secondArray[i];
        stringArray = secondArray;
    }
}

public static void PrintArray(String[] stringArray) {
    for (int i = 0; i < stringArray.length; i++) {
        out.println(" " + stringArray[i]);
    }
}

【问题讨论】:

  • 附注:Java 方法名称应为 lowerCamelCase()。
  • 谢谢汤加,我不知道。我先学的是 C#,除了方法之外的所有东西都是小写的。

标签: java arrays exception for-loop printing


【解决方案1】:

您应该将randomString 数组换成双倍长度的新数组。您创建一个新数组并将旧数组的内容复制到新数组,但不要对新数组执行任何操作。

我想您希望ExtendArray 方法返回新数组,并将randomString 变量设置为新数组。

【讨论】:

    【解决方案2】:

    您需要从ExtendArray 函数返回您的第二个数组:

    public static String[] ExtendArray(String[] stringArray) {
    
        String[] secondArray = new String[stringArray.length * 2];
        // Copy first array into second array
        for (int i = 0; i <= stringArray.length; i++) {
            stringArray[i] = secondArray[i];
        }
        return secondArray;
    }
    

    在你的主要:

    randomString = ExtendArray(randomString);
    

    你的 while 条件也应该是:

    while (index < randomString.length)
    

    【讨论】:

      【解决方案3】:

      Java 在您尝试使用的方法中不起作用。 Java 中的所有内容都是按值传递的,除非它是对象中的数据点。您尝试使用的是通过引用传递,这在 Java 中是不可能的。

      您正在尝试做的是一个已经存在的称为 Vector 的数据结构:http://docs.oracle.com/javase/7/docs/api/java/util/Vector.html

      我建议这样做:(不确定它是否能正常工作,因为我目前的 PC 没有开发工具):

      public static String[] ExtendArray(String[] stringArray) {
      
          String[] secondArray = new String[stringArray.length * 2];
          // Copy first array into second array
          for (int i = 0; i < stringArray.length; i++) {
              secondArray[i] = stringArray[i];
          }
      
          return secondArray;
      }
      

      然后在 main 中这样调用它:

      randomString = ExtendArray(randomString);
      

      关于向量,这是它在 Vector 类中的工作方式:

      public void incrementCount(int count){
          int increment = (count * 2);
          Object newElementData [] = new Object[increment];
          for(int i = 0; i < count; i++)
          {
              newElementData[i] = elementData[i];
          }
      
          elementData = new Object[increment];
      
          elementData = newElementData;
      }
      

      在这种情况下,elementData 是原始数组,newElementData 是一个临时数组,作用于边界。

      【讨论】:

      • 应该是secondArray[i] = stringArray[i];
      • 你太棒了!非常感谢楼主!
      【解决方案4】:

      你的 PrintArray 方法不会出错,你在之前的那一行就得到了错误!

      randomString[index] = input;
      

      因为如果你这样做

      index <= randomString.length
      

      最后一次迭代超出范围,长度为 10 的字符串的值在 0-9 之间。您必须将 while 循环更改为

      index < randomString.length
      

      您的 ExtendArray 方法也不起作用!

      【讨论】:

      • 那我怎样才能让它发挥作用呢?
      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2016-10-26
      • 2020-11-01
      • 2017-06-21
      • 1970-01-01
      相关资源
      最近更新 更多