سؤال
حصلت على الرمز التالي في تطبيق Android-App:
Event[] events = retrieveEvents();
if (events != null && events.length>0) {
int eventNr = getFromUserInput();
eventNr = eventNr % events.length;
Event event = events[eventNr];
}
RetrieveEvents () يحصل على بعض Event
S من الإنترنت ، بحيث يمكن أن يفشل على الرغم من أن يكون فارغًا أو null
. يمكن للمستخدم تحديد أي Event
للعرض ، لتجنب الاستثناء ، أستخدم عملية Modulo لضمان ملف eventNr
هو داخل الحدود. هذا يعمل بشكل جيد على أي أجهزة اختبرتها ولكن:
أحصل على تقارير الأخطاء من مستخدمين آخرين حيث يرمي السطر الأخير الثاني (الوصول إلى الصفيف) ArrayIndexOutOfBoundsException
. كيف يمكن أن يحدث هذا؟ ما هي الحالة التي تركتها دون رادع؟ أين خطأي؟
تذكر retrieveEvents()
و ال getFromUserInput()
يمكن أن تُرجع الوظيفة كلاهما بيانات غير صالحة ، لكنني أعتقد أنني راجعت كل حالة ، فأين خطأي؟
المحلول
هل تأكد من ذلك eventNr
ليس سلبيا أبدا؟ الشيك ليس في الرمز المقتبس. المشكلة هي أنه إذا ، على سبيل المثال ، eventNr
هو -1
و events.length
هو 5 ، -1 % 5 = -1
وبالطبع events[-1]
خارج الحدود.
نصائح أخرى
هل هذا تطبيق خيوط؟ هل من الممكن أن تعيد RetrieveEvents () دائمًا إشارة إلى نفس الصفيف ، ولكن يتم تعديل الصفيف في الوقت الفعلي؟ إذا كان الأمر كذلك ، فقد تكون هذه مشكلتك.