【问题标题】:Index out of bounds error索引越界错误
【发布时间】:2014-06-06 07:29:39
【问题描述】:

我的代码有问题。我可以告诉我为什么我得到一个索引越界错误。此代码假设将 2 字节数组合并为一个。根据“list[position] = byteAdd[t];”但我无法弄清楚出了什么问题。这些数组初始化为 200 字节大小。

Scanner input = new Scanner(System.in); 
System.out.println("Enter a web Address");
String net = input.nextLine();
String nets [] = net.split("\\.");
byte[] length = new byte [200];
byte[] byteAdd= new byte[200];
int bytelength = byteAdd.length*2;
byte[] list = new byte [200]; 

for (int i = 0 ; i<nets.length; i++ )
{
    length[i]= (byte)(double) ( nets[i].length());  
    System.out.println(length[i]);
}

for (int i = 0 ; i<nets.length; i++ )
{
    byteAdd = nets[i].getBytes();
}

int position= 0 , max= 0;  

for (int i = 0 ; i<bytelength; i++)
{
    list[position]=length[i];
    position++;
    for (int t = 0 ; t<length[i]; t++)
    {
        list[position] = byteAdd[t];
        System.out.println(t+"   "+length[i]);
        System.out.println("Array lenght" + list.length);
        //System.out.println(t+"inner" + position);
        position++;
    }
    //System.out.println(i+"outter");
}

这是堆栈跟踪吗?

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3 在 test.test.main(test.java:51)

错误在这一行list[position] = byteAdd[t];

【问题讨论】:

  • 哪一行抛出异常? bytelength 的值是多少?
  • 堆栈跟踪(您在这里拥有的最有价值的信息,您忘记向我们展示)显示您尝试访问的索引并标识发生错误的行。当您阅读并检查代码时,您发现了什么?
  • 您在哪一行得到异常?
  • @brianChiem 那么是访问list 或访问byteAdd 时的错误吗?当您打印positiont 的值时,此时哪一个是“3”? “3”是这两个数组之一的无效索引。找出原因,找出原因,然后修复它。

标签: java loops indexoutofboundsexception


【解决方案1】:

您的list = new byte [200]; 声明大小列表200

bytelength 的大小是200*2 = 400

所以当你说

for (int i = 0 ; i<bytelength; i++)

这意味着

for (int i = 0 ; i<400; i++) //whereas all array is limited to size 200 and that's throwing exception!

所以,在您的增量指针position++ 中,它的值最高为 399,而数组大小被限制为 200

所以list[position] 上升到list[201-400] // should be truncated at 200

【讨论】:

    【解决方案2】:

    position++ 在同一循环中的两个不同位置有时会导致其自身的值高于数组长度。因此,当您尝试将其用作循环的索引时,当您使用该位置值来索引超出范围的数组索引时,可能会引发 INDEXOUTOFBOUNDS 异常。因此,您可能想要这样做: 在使用它之前检查位置的值(如果它小于数组长度)或改变你的逻辑。如果您能更清楚地了解您想要做什么,我们可以提供帮助。

    【讨论】:

    • 我的意思是该语句是导致该错误的原因。因为他在两个不同的地方增加位置的值,它会超过数组长度。最好在使用它来索引数组之前检查是否 position
    • 1.虽然最终可能是这样,但我们不知道,因为我们不知道list 的长度,也不知道异常的来源(可能是length[i]byteAdd[t])。 2.正确的解决方案通常是修复逻辑,使索引永远不会超过长度,而不是盲目地做边界检查。
    • 我已经修改了我的答案。我应该更好地构建我的答案。但后来我只想指出错误的原因是什么。这是使用指针++造成的逻辑错误
    • 您有什么建议我可以在不使用位置的情况下完成相同的任务吗?
    • 我觉得最好能把完整的代码贴在这里。
    猜你喜欢
    • 2015-03-22
    • 2013-10-13
    • 2015-01-10
    • 2014-01-27
    • 2017-03-23
    • 2020-04-23
    • 2011-12-13
    相关资源
    最近更新 更多