สาเหตุArrayIndexOutOfBoundsException
อะไร
หากคุณคิดว่าตัวแปรเป็น "กล่อง" ที่คุณสามารถวางค่าได้อาร์เรย์คือชุดของกล่องที่วางไว้ถัดจาก eachother โดยที่จำนวนกล่องนั้นเป็นจำนวนเต็ม จำกัด และชัดเจน
สร้างอาร์เรย์เช่นนี้
final int[] myArray = new int[5]
สร้างแถว 5 int
กล่องแต่ละถือครองอีกด้วย กล่องแต่ละกล่องมีดัชนีตำแหน่งในชุดของกล่อง ดัชนีนี้เริ่มต้นที่ 0 และสิ้นสุดที่ N-1 โดยที่ N คือขนาดของอาร์เรย์ (จำนวนกล่อง)
หากต้องการดึงค่าใดค่าหนึ่งจากกล่องชุดนี้คุณสามารถอ้างอิงค่าผ่านดัชนีเช่นนี้
myArray[3]
ซึ่งจะให้ค่าของกล่องที่ 4 ในชุด (เนื่องจากกล่องแรกมีดัชนี 0)
An ArrayIndexOutOfBoundsException
เกิดจากความพยายามที่จะดึงกล่อง "ที่ไม่มีอยู่ออก" โดยการส่งดัชนีที่สูงกว่าดัชนีของ "กล่อง" ล่าสุดหรือค่าลบ
จากตัวอย่างการรันของฉันตัวอย่างโค้ดเหล่านี้จะสร้างข้อยกเว้นดังกล่าว:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
วิธีการหลีกเลี่ยง ArrayIndexOutOfBoundsException
เพื่อป้องกันArrayIndexOutOfBoundsException
มีจุดสำคัญที่ควรพิจารณา:
วนลูป
เมื่อวนลูปผ่านอาร์เรย์ตรวจสอบให้แน่ใจเสมอว่าดัชนีที่คุณดึงมามีขนาดเล็กกว่าความยาวของอาร์เรย์อย่างเคร่งครัด (จำนวนกล่อง) ตัวอย่างเช่น
for (int i = 0; i < myArray.length; i++) {
สังเกตว่า<
ไม่ผสม=
ในนั้น ..
คุณอาจถูกล่อลวงให้ทำสิ่งนี้:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
ทำไม่ได้ ติดกับด้านบน (ถ้าคุณต้องการใช้ดัชนี) และมันจะช่วยให้คุณเจ็บปวดมาก
หากเป็นไปได้ให้ใช้ foreach:
for (int value : myArray) {
ด้วยวิธีนี้คุณจะไม่ต้องคิดถึงดัชนีเลย
เมื่อวนลูปสิ่งที่คุณทำไม่เคยเปลี่ยนค่าของ iterator ห่วง (ที่นี่: i
) ที่เดียวที่ควรเปลี่ยนค่าคือให้ลูปทำงานต่อไป การเปลี่ยนแปลงเป็นอย่างอื่นก็แค่เสี่ยงต่อข้อยกเว้นและในกรณีส่วนใหญ่ไม่จำเป็น
ดึง / อัปเดต
เมื่อดึงองค์ประกอบโดยพลการของอาเรย์ให้ตรวจสอบเสมอว่าเป็นดัชนีที่ถูกต้องกับความยาวของอาเรย์:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}