为什么ArrayList.set()会在没有任何异常的情况下留下方法?

时间:2012-06-24 12:27:24

标签: java android exception android-emulator

我在Android虚拟机(模拟器,Android 2.1)上进行开发时遇到问题。这不是解决问题,而是解决问题。我所拥有的是这种方法:

private void storeData(int crmValue, int crmTouch, int heartrate) {
    // Store in data or ring buffer
    waitCRM.add(crmValue);
    waitTouch.add(crmTouch);
    waitHeart.add(heartrate);
}

wait ***是用户定义的类RingBuffer的实例变量。这个类的add方法如下:

public void add(E o) {
    buffer.set(index, o);
    index++;
    if (index == capacity) {
        index = 0;
    }
    if (length < capacity) {
        length++;
    }
}

在这种情况下,E是一个Integer,缓冲区是一个ArrayList,容量是60,索引是0,因为这是第一个add()调用。

当然ArrayList / buffer此时为空,buffer.set()可能不正确,因为这会返回当前值。实际上buffer.add()并没有解决问题,但这只是一个要解决的细节。现在不应该打扰你。

每100毫秒(atFixedRate)在ScheduledFuture(计时器)中调用storeData()方法。只要计时器不会因为IF而调用storeData(),一切都按预期工作。但是,只要第一次调用storeData()......

...程序在waitCRM.add(crmValue)期间离开方法storeData();

...取消定时器(其他线程恢复工作)

...并且在控制台或LogCat中找不到任何异常或其他任何内容

鉴于没有错误消息,我花了几个小时才发现这么多。所以这是我的问题:如何以及在什么情况下Java / Android会停止显示任何错误的线程?

感谢您的任何想法!

1 个答案:

答案 0 :(得分:1)

对我而言,您似乎在add(E o)中遇到异常,由于某种原因您在logcat中看不到。

如果查看http://docs.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html#set(int,java.lang.Object中的文档,方法set()是错误的

  

使用指定的元素替换此列表中指定位置的元素。

     

抛出:   IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 || index&gt; = size())。

所以使用set你应该得到一个IndexOutOfBoundsException,因为你还没有任何元素,index == 0,size == 0和index&gt; = size == true

但是add(int index,Object element)应该可行,并且你说你得到同样的问题......

在你的add方法的代码中放一个日志或断点,看看它退出的是哪一行。