สาเหตุ java.lang.ArrayIndexOutOfBoundsException คืออะไรและฉันจะป้องกันได้อย่างไร

Apr 05 2011

อะไรArrayIndexOutOfBoundsExceptionหมายและวิธีการที่ฉันจะกำจัดมันได้หรือไม่

นี่คือตัวอย่างโค้ดที่ทำให้เกิดข้อยกเว้น:

String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
    System.out.println(names[i]);
}

คำตอบ

306 JonSkeet Apr 05 2011 at 22:57

พอร์ตการโทรแรกของคุณควรเป็นเอกสารที่อธิบายไว้อย่างชัดเจนพอสมควร:

โยนเพื่อระบุว่ามีการเข้าถึงอาร์เรย์ด้วยดัชนีที่ผิดกฎหมาย ดัชนีเป็นลบหรือมากกว่าหรือเท่ากับขนาดของอาร์เรย์

ตัวอย่างเช่น:

int[] array = new int[5];
int boom = array[10]; // Throws the exception

ส่วนวิธีหลีกเลี่ยง ... อืมอย่าทำอย่างนั้น ระมัดระวังดัชนีอาร์เรย์ของคุณ

ปัญหาหนึ่งที่บางครั้งผู้คนพบคือคิดว่าอาร์เรย์เป็นแบบ 1 ดัชนีเช่น

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

สิ่งนี้จะพลาดองค์ประกอบแรก (ดัชนี 0) และเกิดข้อยกเว้นเมื่อดัชนีเท่ากับ 5 ดัชนีที่ถูกต้องที่นี่รวม 0-4 ข้อความที่ถูกต้องและเป็นสำนวนforที่นี่จะเป็น:

for (int index = 0; index < array.length; index++)

(สมมติว่าคุณต้องการดัชนีแน่นอนหากคุณสามารถใช้การปรับปรุงสำหรับลูปแทนได้ให้ทำเช่นนั้น)

54 BalusC Apr 05 2011 at 22:59
if (index < 0 || index >= array.length) {
    // Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
    // Yes, you can safely use this index. The index is present in the array.
    Object element = array[index];
}

ดูสิ่งนี้ด้วย:

  • บทช่วยสอน Java - พื้นฐานภาษา - อาร์เรย์

อัปเดต : ตามข้อมูลโค้ดของคุณ

for (int i = 0; i<=name.length; i++) {

ดัชนีจะรวมความยาวของอาร์เรย์ สิ่งนี้อยู่นอกขอบเขต คุณต้องแทนที่โดย<=<

for (int i = 0; i < name.length; i++) {
24 aioobe Apr 05 2011 at 23:15

จากบทความที่ยอดเยี่ยมนี้: ArrayIndexOutOfBoundsException ในสำหรับลูป

เพื่อสรุปสั้น ๆ :

ในการทำซ้ำครั้งสุดท้ายของ

for (int i = 0; i <= name.length; i++) {

iจะเท่ากับname.lengthซึ่งเป็นดัชนีที่ผิดกฎหมายเนื่องจากดัชนีอาร์เรย์เป็นศูนย์

รหัสของคุณควรอ่าน

for (int i = 0; i < name.length; i++) 
                  ^
18 OctavianA.Damiean Apr 05 2011 at 22:55

หมายความว่าคุณกำลังพยายามเข้าถึงดัชนีของอาร์เรย์ซึ่งไม่ถูกต้องเนื่องจากไม่ได้อยู่ระหว่างขอบเขต

ตัวอย่างเช่นสิ่งนี้จะเริ่มต้นอาร์เรย์จำนวนเต็มดั้งเดิมด้วยขอบเขตบน 4

int intArray[] = new int[5];

โปรแกรมเมอร์นับจากศูนย์ ตัวอย่างเช่นนี้จะโยนArrayIndexOutOfBoundsExceptionเป็นขอบเขตบนคือ 4 และไม่ใช่ 5

intArray[5];
12 Makoto Oct 17 2015 at 04:45

เพื่อหลีกเลี่ยงข้อยกเว้นนอกขอบเขตของดัชนีอาร์เรย์เราควรใช้คำสั่งขั้นสูงforที่ไหนและเมื่อใดที่ทำได้

แรงจูงใจหลัก (และกรณีการใช้งาน) คือเมื่อคุณทำซ้ำและคุณไม่ต้องการขั้นตอนการทำซ้ำที่ซับซ้อน คุณจะไม่สามารถใช้ขั้นสูงforเพื่อเลื่อนไปข้างหลังในอาร์เรย์หรือทำซ้ำในทุกองค์ประกอบอื่น ๆ

คุณรับประกันได้ว่าจะไม่มีองค์ประกอบที่จะวนซ้ำเมื่อทำเช่นนี้และตัวอย่าง [แก้ไข] ของคุณจะถูกแปลงได้อย่างง่ายดาย

รหัสด้านล่าง:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

... เทียบเท่ากับสิ่งนี้:

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}
12 Tobb Jan 19 2016 at 23:55

สาเหตุArrayIndexOutOfBoundsExceptionอะไร

หากคุณคิดว่าตัวแปรเป็น "กล่อง" ที่คุณสามารถวางค่าได้อาร์เรย์ก็คือชุดของกล่องที่วางไว้ข้างๆกันโดยที่จำนวนกล่องเป็นจำนวนเต็ม จำกัด และชัดเจน

การสร้างอาร์เรย์เช่นนี้:

final int[] myArray = new int[5]

สร้างแถว 5 กล่องแต่ละกล่องมีintไฟล์. แต่ละกล่องมีดัชนีตำแหน่งในชุดของกล่อง ดัชนีนี้เริ่มต้นที่ 0 และสิ้นสุดที่ N-1 โดยที่ N คือขนาดของอาร์เรย์ (จำนวนกล่อง)

ในการดึงค่าใดค่าหนึ่งจากชุดของกล่องนี้คุณสามารถอ้างถึงผ่านดัชนีได้ดังนี้:

myArray[3]

ซึ่งจะให้ค่าของกล่องที่ 4 ในซีรีส์ (เนื่องจากกล่องแรกมีดัชนี 0)

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];
}
7 Madhusudanchowdary Jun 21 2017 at 11:57

ในโค้ดของคุณคุณได้เข้าถึงองค์ประกอบตั้งแต่ดัชนี 0 จนถึงความยาวของสตริงอาร์เรย์ name.lengthให้จำนวนสตริงอ็อบเจ็กต์ในอาร์เรย์ของอ็อบเจ็กต์สตริงคือ 3 แต่คุณสามารถเข้าถึงได้สูงสุดดัชนี 2 name[2]เท่านั้นเนื่องจากอาร์เรย์สามารถเข้าถึงได้จากดัชนี 0 ไปยังname.length - 1ตำแหน่งที่คุณได้รับname.lengthจำนวนอ็อบเจ็กต์

แม้ในขณะที่ใช้forห่วงคุณได้เริ่มต้นด้วยดัชนี zero name.length - 1และคุณควรจะจบลงด้วยการ ในอาร์เรย์ a [n] คุณสามารถเข้าถึงรูปแบบ [0] ถึง [n-1]

ตัวอย่างเช่น:

String[] a={"str1", "str2", "str3" ..., "strn"};

for(int i=0; i<a.length(); i++)
    System.out.println(a[i]);

ในกรณีของคุณ:

String[] name = {"tom", "dick", "harry"};

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n');
}
6 nIKHIL Jan 16 2018 at 19:13

สำหรับอาร์เรย์ที่คุณกำหนดความยาวของอาร์เรย์คือ 3 (เช่น name.length = 3) แต่เนื่องจากเก็บองค์ประกอบโดยเริ่มจากดัชนี 0 จึงมีดัชนีสูงสุด 2

ดังนั้นแทนที่จะเป็น 'i ** <= name.length' คุณควรเขียน 'i <** name.length' เพื่อหลีกเลี่ยง 'ArrayIndexOutOfBoundsException'

4 SatyendraKumar Oct 25 2017 at 14:38

คำถามง่ายๆนี้มีมาก แต่ฉันแค่อยากจะเน้นคุณลักษณะใหม่ใน Java ซึ่งจะหลีกเลี่ยงความสับสนทั้งหมดเกี่ยวกับการจัดทำดัชนีในอาร์เรย์แม้แต่สำหรับผู้เริ่มต้น Java-8 ได้สรุปงานการทำซ้ำให้คุณ

int[] array = new int[5];

//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });

//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })

ประโยชน์ของอะไร? สิ่งหนึ่งคือความสามารถในการอ่านเช่นภาษาอังกฤษ ประการที่สองคุณไม่จำเป็นต้องกังวลเกี่ยวกับไฟล์ArrayIndexOutOfBoundsException

3 roottraveller Mar 06 2017 at 16:00

คุณได้รับArrayIndexOutOfBoundsExceptionเนื่องจากi<=name.lengthส่วนหนึ่ง name.lengthส่งคืนความยาวของสตริงnameซึ่งเท่ากับ 3 ดังนั้นเมื่อคุณพยายามเข้าถึงname[3]จึงผิดกฎหมายและมีข้อยกเว้น

รหัสที่แก้ไข:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i < name.length; i++) { //use < insteadof <=
  System.out.print(name[i] +'\n');
}

ซึ่งกำหนดไว้ในข้อกำหนดภาษา Java :

public finalข้อมูลlengthซึ่งมีจำนวนขององค์ประกอบของอาร์เรย์ lengthอาจเป็นบวกหรือศูนย์

3 Johny Mar 08 2017 at 19:56

นั่นคือลักษณะของข้อยกเว้นประเภทนี้เมื่อโยนใน Eclipse ตัวเลขสีแดงหมายถึงดัชนีที่คุณพยายามเข้าถึง ดังนั้นรหัสจะมีลักษณะดังนี้:

myArray[5]

เกิดข้อผิดพลาดเมื่อคุณพยายามเข้าถึงดัชนีที่ไม่มีอยู่ในอาร์เรย์นั้น ถ้าอาร์เรย์มีความยาว 3

int[] intArray = new int[3];

จากนั้นดัชนีที่ถูกต้องเท่านั้นคือ:

intArray[0]
intArray[1]
intArray[2]

ถ้าอาร์เรย์มีความยาว 1

int[] intArray = new int[1];

จากนั้นดัชนีเดียวที่ถูกต้องคือ:

intArray[0]

จำนวนเต็มใด ๆ ที่เท่ากับความยาวของอาร์เรย์หรือมากกว่านั้น: อยู่นอกขอบเขต

จำนวนเต็มใด ๆ ที่น้อยกว่า 0: อยู่นอกขอบเขต;

PS: หากคุณต้องการทำความเข้าใจเกี่ยวกับอาร์เรย์และทำแบบฝึกหัดจริงมีวิดีโอที่นี่: บทช่วยสอนเกี่ยวกับอาร์เรย์ใน Java

3 BilltheLizard Jun 13 2018 at 02:41

สำหรับอาร์เรย์หลายมิติการตรวจสอบให้แน่ใจว่าคุณเข้าถึงlengthคุณสมบัติของมิติที่ถูกต้องอาจเป็นเรื่องยุ่งยาก ยกตัวอย่างโค้ดต่อไปนี้:

int [][][] a  = new int [2][3][4];

for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){
        for(int k = 0; k < a[j].length; k++){
            System.out.print(a[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}

แต่ละมิติมีความยาวแตกต่างกันดังนั้นจุดบกพร่องที่ละเอียดอ่อนก็คือลูปตรงกลางและด้านในใช้lengthคุณสมบัติของมิติเดียวกัน (เพราะa[i].lengthเหมือนกันa[j].length)

ควรใช้วงในแทนa[i][j].length(หรือa[0][0].lengthเพื่อความเรียบง่าย)

2 KyriSarantakos Apr 05 2011 at 23:06

กรณีที่พบบ่อยที่สุดที่ฉันเคยเห็นสำหรับ ArrayIndexOutOfBoundsExceptions ที่ดูลึกลับนั่นคือดูเหมือนว่าจะไม่ได้เกิดจากโค้ดการจัดการอาร์เรย์ของคุณเองเป็นการใช้ SimpleDateFormat พร้อมกัน โดยเฉพาะอย่างยิ่งใน servlet หรือคอนโทรลเลอร์:

public class MyController {
  SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

  public void handleRequest(ServletRequest req, ServletResponse res) {
    Date date = dateFormat.parse(req.getParameter("date"));
  }
}

หากสองเธรดเข้าสู่เมธอด SimplateDateFormat.parse () ร่วมกันคุณจะเห็น ArrayIndexOutOfBoundsException หมายเหตุ: ส่วนการประสานของJavadoc ชั้นเรียนสำหรับ SimpleDateFormat

ตรวจสอบให้แน่ใจว่าไม่มีตำแหน่งใดในโค้ดของคุณที่เข้าถึงคลาสที่ไม่ปลอดภัยของเธรดเช่น SimpleDateFormat ในลักษณะพร้อมกันเช่นใน servlet หรือคอนโทรลเลอร์ ตรวจสอบตัวแปรอินสแตนซ์ทั้งหมดของ servlets และคอนโทรลเลอร์ของคุณเพื่อหาผู้ต้องสงสัย

2 sgrpwr Sep 15 2018 at 17:29

ArrayIndexOutOfBoundsException เมื่อใดก็ตามที่มีข้อยกเว้นนี้หมายความว่าคุณกำลังพยายามใช้ดัชนีของอาร์เรย์ที่อยู่นอกขอบเขตหรือในเงื่อนไข Lay Man ที่คุณกำลังร้องขอมากกว่าที่คุณได้เริ่มต้น

เพื่อป้องกันสิ่งนี้ตรวจสอบให้แน่ใจเสมอว่าคุณไม่ได้ร้องขอดัชนีที่ไม่มีอยู่ในอาร์เรย์เช่นถ้าความยาวอาร์เรย์เท่ากับ 10 ดัชนีของคุณจะต้องอยู่ในช่วงระหว่าง 0 ถึง 9

2 Noname Dec 14 2018 at 07:08

ArrayIndexOutOfBounds หมายความว่าคุณกำลังพยายามทำดัชนีตำแหน่งภายในอาร์เรย์ที่ไม่ได้รับการจัดสรร

ในกรณีนี้:

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • name.length คือ 3 เนื่องจากอาร์เรย์ถูกกำหนดด้วยวัตถุ 3 String
  • เมื่อเข้าถึงเนื้อหาของอาร์เรย์ตำแหน่งจะเริ่มจาก 0 เนื่องจากมี 3 รายการจึงหมายถึง name [0] = "tom", name [1] = "dick" และ name [2] = "harry
  • เมื่อคุณวนซ้ำเนื่องจากฉันสามารถน้อยกว่าหรือเท่ากับ name.length ได้แสดงว่าคุณพยายามเข้าถึงชื่อ [3] ซึ่งไม่สามารถใช้ได้

จะได้รับรอบนี้ ...

  • ใน for loop ของคุณคุณสามารถทำ i <name.length. วิธีนี้จะป้องกันการวนซ้ำเพื่อตั้งชื่อ [3] และจะหยุดที่ชื่อ [2] แทน

    for(int i = 0; i<name.length; i++)

  • ใช้สำหรับแต่ละลูป

    String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }

  • ใช้ list.forEach (การดำเนินการของผู้บริโภค) (ต้องใช้ Java8)

    String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);

  • แปลงอาร์เรย์เป็นสตรีม - นี่เป็นตัวเลือกที่ดีหากคุณต้องการดำเนินการ 'การดำเนินการ' เพิ่มเติมกับอาร์เรย์ของคุณเช่นตัวกรองแปลงข้อความแปลงเป็นแผนที่ ฯลฯ (ต้องใช้ Java8)

    String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);

1 adn.911 Nov 30 2017 at 23:41

ArrayIndexOutOfBoundsExceptionหมายความว่าคุณกำลังพยายามเข้าถึงดัชนีของอาร์เรย์ที่ไม่มีอยู่หรืออยู่นอกขอบเขตของอาร์เรย์นี้ ดัชนีอาร์เรย์เริ่มต้นจาก0และสิ้นสุดที่ความยาว - 1

ในกรณีของคุณ

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

ArrayIndexOutOfBoundsExceptionเกิดขึ้นเมื่อคุณพยายามเข้าถึงองค์ประกอบที่จัดทำดัชนี name.length ซึ่งไม่มีอยู่ (ดัชนีอาร์เรย์สิ้นสุดที่ความยาว -1) เพียงแค่แทนที่ <= ด้วย <จะช่วยแก้ปัญหานี้ได้

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}
1 Mohit Nov 11 2016 at 15:21

สำหรับอาร์เรย์ใด ๆ ที่มีความยาว n องค์ประกอบของอาร์เรย์จะมีดัชนีตั้งแต่ 0 ถึง n-1

หากโปรแกรมของคุณพยายามเข้าถึงองค์ประกอบใด ๆ (หรือหน่วยความจำ) ที่มีดัชนีอาร์เรย์มากกว่า n-1 Java จะโยนArrayIndexOutOfBoundsException

ดังนั้นนี่คือสองวิธีที่เราสามารถใช้ในโปรแกรมได้

  1. การรักษาจำนวน:

    for(int count = 0; count < array.length; count++) {
        System.out.println(array[count]);
    }
    

    หรือคำสั่งวนซ้ำอื่น ๆ เช่น

    int count = 0;
    while(count < array.length) {
        System.out.println(array[count]);
        count++;
    }
    
  2. วิธีที่ดีกว่าไปกับแต่ละลูปในวิธีนี้โปรแกรมเมอร์ไม่จำเป็นต้องกังวลเกี่ยวกับจำนวนองค์ประกอบในอาร์เรย์

    for(String str : array) {
        System.out.println(str);
    }
    
1 AbhishekAgarwal Mar 26 2018 at 15:08

ตามรหัสของคุณ:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

หากคุณตรวจสอบ System.out.print (name.length);

คุณจะได้รับ 3;

นั่นหมายถึงความยาวของชื่อคุณคือ 3

ลูปของคุณกำลังทำงานจาก 0 ถึง 3 ซึ่งควรจะเป็น "0 ถึง 2" หรือ "1 ถึง 3"

ตอบ

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}
1 ZiadM Oct 18 2018 at 16:24

แต่ละรายการในอาร์เรย์เรียกว่าองค์ประกอบและแต่ละองค์ประกอบเข้าถึงได้โดยดัชนีตัวเลข ดังแสดงในภาพประกอบก่อนหน้านี้เลขขึ้นต้นด้วย 0 ตัวอย่างเช่นองค์ประกอบที่ 9 จะเข้าถึงได้ที่ดัชนี 8

IndexOutOfBoundsException ถูกโยนเพื่อระบุว่าดัชนีของการจัดเรียงบางอย่าง (เช่นอาร์เรย์ไปยังสตริงหรือเวกเตอร์) อยู่นอกช่วง

อาร์เรย์ X ใด ๆ สามารถเข้าถึงได้ตั้งแต่ [0 ถึง (X.length - 1)]

1 JohnCzukkermann Nov 14 2018 at 01:08

ฉันเห็นคำตอบทั้งหมดที่นี่เพื่ออธิบายวิธีทำงานกับอาร์เรย์และวิธีหลีกเลี่ยงดัชนีนอกขอบเขต ฉันเองหลีกเลี่ยงอาร์เรย์โดยเสียค่าใช้จ่ายทั้งหมด ฉันใช้คลาส Collections ซึ่งหลีกเลี่ยงความโง่เขลาทั้งหมดที่ต้องจัดการกับดัชนีอาร์เรย์โดยสิ้นเชิง โครงสร้างแบบวนซ้ำทำงานได้อย่างสวยงามด้วยคอลเลกชันที่รองรับโค้ดที่เขียนเข้าใจและดูแลรักษาได้ง่ายขึ้น

1 SachithraDilshan Apr 12 2019 at 09:43

ถ้าคุณใช้ความยาวของอาร์เรย์เพื่อย้ำการควบคุมของสำหรับห่วงเสมอจำไว้ว่าดัชนีของรายการแรกในอาร์เรย์คือ0 ดังนั้นดัชนีขององค์ประกอบสุดท้ายในอาร์เรย์จึงมีค่าน้อยกว่าความยาวของอาร์เรย์

MadhusudanSharma May 17 2018 at 10:27

ArrayIndexOutOfBoundsException ชื่ออธิบายว่าหากคุณพยายามเข้าถึงค่าที่ดัชนีซึ่งอยู่นอกขอบเขตของขนาด Array จะเกิดข้อยกเว้นดังกล่าวขึ้น

ในกรณีของคุณคุณสามารถลบเครื่องหมายเท่ากับออกจาก for loop ของคุณได้

for(int i = 0; i<name.length; i++)

ตัวเลือกที่ดีกว่าคือการวนซ้ำอาร์เรย์:

for(String i : name )
      System.out.println(i);
GT_hash Jul 17 2018 at 10:03

ข้อผิดพลาดนี้เกิดขึ้นในช่วงเวลาที่เกินขีด จำกัด ของการทำงานลองพิจารณาตัวอย่างง่ายๆเช่นนี้

class demo{
  public static void main(String a[]){

    int[] numberArray={4,8,2,3,89,5};

    int i;

    for(i=0;i<numberArray.length;i++){
        System.out.print(numberArray[i+1]+"  ");
    }
}

ในตอนแรกฉันได้เริ่มต้นอาร์เรย์เป็น 'numberArray' จากนั้นองค์ประกอบอาร์เรย์บางส่วนจะถูกพิมพ์โดยใช้สำหรับลูป เมื่อลูปทำงานเวลา 'i' ให้พิมพ์องค์ประกอบ (numberArray [i + 1] .. (เมื่อค่า i เป็น 1 จะมีการพิมพ์องค์ประกอบ numberArray [i + 1]) .. สมมติว่าเมื่อ i = (numberArray. length-2) องค์ประกอบสุดท้ายของอาร์เรย์จะถูกพิมพ์ออกมา .. เมื่อค่า 'i' ไปที่ (numberArray.length-1) จะไม่มีค่าสำหรับการพิมพ์ในจุดนั้น 'ArrayIndexOutOfBoundsException' จะเกิดขึ้นฉันหวังว่าคุณจะได้รับ ความคิดขอบคุณ!

AndreyLavrukhin Sep 17 2019 at 19:16

คุณสามารถใช้ทางเลือกในรูปแบบการทำงานเพื่อหลีกเลี่ยงNullPointerExceptionและArrayIndexOutOfBoundsException:

String[] array = new String[]{"aaa", null, "ccc"};
for (int i = 0; i < 4; i++) {
    String result = Optional.ofNullable(array.length > i ? array[i] : null)
            .map(x -> x.toUpperCase()) //some operation here
            .orElse("NO_DATA");
    System.out.println(result);
}

เอาท์พุต:

AAA
NO_DATA
CCC
NO_DATA