2010-11-19 41 views
2

benim Android App aşağıdaki kodu var:ArrayIndexOutOfBoundsException neden burada gerçekleşiyor?

Event[] events = retrieveEvents(); 
if (events != null && events.length>0) { 
    int eventNr = getFromUserInput(); 
    eventNr = eventNr % events.length; 
    Event event = events[eventNr]; 
} 

retrieveEvents() internetten bazı Event s alır, bu nedenle bu bir olsa boş veya null olmak başarısız olabilir. Kullanıcı, hangi Event görüntüleneceğini seçebilir, istisnai durumdan kaçınmak için, eventNr'un sınırlar içinde olduğundan emin olmak için modulo işlemini kullanıyorum. Bu, BUT:

üzerinde test ettiğim tüm aygıtlarda düzgün çalışıyor. Diğer kullanıcılardan (dizi erişimi) ArrayIndexOutOfBoundsException'u attığında hata raporları alıyorum. Bu nasıl olabilir? Hangi koşulda kontrolsüz kaldım? Benim hatam nerede?

Unutmayın: retrieveEvents() ve getFromUserInput() işlevinin her ikisi de geçersiz verileri döndürebilir, ancak her durumu kontrol ettiğimi düşünüyorum, bu yüzden benim suçum nerede?

+0

Yani bir ArrayIndexOutOfBoundsException aldınız? Hangi hatta? Olay olayı = olaylar [eventNr]; satır? – aioobe

+1

@aioobe: Evet, dedi ki "ikinci son satırın (dizi erişimi) atar ..." * –

+0

İstisnadaki indeks nedir? – starblue

cevap

7

eventNr'un hiçbir zaman olumsuz olmadığından emin oldunuz mu? Çek, alıntılanmış kodunuzda yok. Örneğin, eventNr, -1 ve events.length ise, 0, -1 % 5 = -1 ve tabi ki events[-1] sınırlarının dışında kalmaktadır.

+0

Hayır, ama olsa bile, sorun nerede olurdu? – theomega

+0

@theomega: Eğer 'eventNr' ise,' -1 've 'events.length'' 5', '-1% 5 = -1' ve' olaylar [-1] 'dır. –

+0

bir indeks (eventNr) -x (-5% 4 = -1) – teemitzitrone

2

Bu dişli bir uygulama mı? RetrieveEvents() her zaman aynı diziye bir başvuru döndürüyor olabilir, ancak dizi gerçek zamanlı olarak değiştiriliyor olabilir mi? Eğer öyleyse, bu senin sorunun olabilir.

+0

Uygulama düşünülmemiş olmasına rağmen, bunun bir eş zamanlılık-problemi olabilse de, bunu araştırmak zorundayım. – theomega

+0

İyi nokta. Alıntı yapılan kodların tümü * yerel vars gibi görünür, ancak bu sadece bir kodlama kodu olayı olabilir. En azından sormak için iyi bir soru. –