【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 3 errorjava.lang.ArrayIndexOutOfBoundsException: 3 错误
【发布时间】:2014-05-02 14:54:05
【问题描述】:

我有以下代码,我得到了java.lang.ArrayIndexOutOfBoundsException

//divides ACode by 10 as many times as specified by the DecimalDigitPosition 
public static int getDecimalDigit(int ACode, int decimalDigitPosition) {
    if (decimalDigitPosition == 0)
        return ACode;
    else {
        ACode = ACode / (10 * decimalDigitPosition);
        int remainder = ACode % 10;
        return remainder;
    }
}

我怀疑这条线...

digit[i] = getDecimalDigit(samples[i].getValue(), 0);

在下面的代码中,这可能是导致此异常的原因。

//start a method to decode the message.
public static void decodeMessage(String filename) {
    Sound s = new Sound(filename);
    SoundSample[] samples = s.getSamples();
    int[] digit = new int[3];
    String message = "";
    int sampleIndex = 0;
    boolean nullReached = false;
    while (!nullReached) {
        int asciiValue = 0;
        for (int i = sampleIndex; i < sampleIndex + 3; i++) {
            if (i < samples.length) {
                // this line could be the cause of error..
                digit[i] = getDecimalDigit(samples[i].getValue(), 0);
                asciiValue += digit[i - sampleIndex] * (((i - sampleIndex) == 0) 
                ? 1 
                : ((i - sampleIndex) * 10));
            } else {
                for (int j = 0; j < 3; j++) {
                    digit[j] = 0;
                }
                break;
            }
        }
        if (digit[0] == digit[1] 
        && digit[1] == digit[2] 
        && digit[2] == 0) 
        nullReached = true;
        message += (char) asciiValue;
    }
}

堆栈跟踪:

java.lang.ArrayIndexOutOfBoundsException: 3 在 project.decodeMessage(project.java:107) 在 project.main(project.java:33) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav‌​a:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​2) >

【问题讨论】:

  • 哪些行会抛出这些错误?你可以发布堆栈跟踪吗?
  • 如果您认为问题出在代码的某个部分,通常最好只包含该部分:)
  • 这里是错误代码:java.lang.ArrayIndexOutOfBoundsException: 3 at project.decodeMessage(project.java:107) at project.main(project.java:33) at sun.reflect.NativeMethodAccessorImpl。 invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:第597章)
  • 和泰勒,你说得对,哈哈,我没想到。现在编辑代码

标签: java indexoutofboundsexception


【解决方案1】:

问题可能出在您的decodeMessage 方法中。我已经剪掉了一些代码来隔离问题:

int[] digit = new int[3];
while (!nullReached)
{
    for (int i = sampleIndex; i < sampleIndex + 3; i++)
    {
        if (i < samples.length)
        {
            digit[i] = getDecimalDigit(samples[i].getValue(), 0);   // This should be the line that throws the exception                
        }               
    }           
    sampleIndex += 3;           
}

第二次通过while 循环,sampleIndex 将是3,所以i 将从3 开始。然后您尝试取消引用digit[i],即digit[3]。因为digit[]int[3],所以digit[3] 超出了数组的范围。

也许你想这样做:

digit[i-sampleIndex] = getDecimalDigit(samples[i].getValue(), 0);

【讨论】:

  • 好的,所以错误就在我想的地方。我该如何编辑这个?我在想可能改变 3 的 int 值或 sampleIndex 值?
  • 我编辑了我的答案以提供可能的解决方案。我无法运行代码,也没有花时间尝试了解它在做什么,所以我不确定我的解决方案是否会产生您想要的行为,但它应该消除 OOB 异常。
  • 我的代码试图解码一个音频文件,其中隐藏了一条文本消息。您提供的修复允许代码正确编译和执行!但它会乱码(类似于 dingbats 字体的文本乱码)消息而不是显示文本。
猜你喜欢
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
相关资源
最近更新 更多