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


298

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

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

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

1
ในการอ้างอิงถึงคำถามสุดท้ายรหัสจะเป็นประโยชน์ คุณเข้าถึงอาเรย์ด้วยดัชนีที่รู้จักหรือคุณต้องเริ่มทำการดีบั๊กเพื่อหาวิธีคำนวณดัชนีเมื่อเกิดข้อผิดพลาดหรือไม่?
justkt

43
แทนที่i <= name.lengthด้วยi < name.length- หรือดีกว่าเขียนการปรับปรุงสำหรับลูป ( for (String aName : name) { ... })
Jean Hominal

1
หมายความว่าคุณต้องการรับองค์ประกอบของอาร์เรย์ที่ไม่มีอยู่ 'i <= name.length' หมายความว่าคุณต้องการรับความยาวขององค์ประกอบ + 1 - ไม่มีอยู่
gbk


ดูArrayIndexOutOfBounds ในห่วง
aioobe

คำตอบ:


296

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

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

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

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

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

บางครั้งปัญหาที่ผู้คนพบเจอคือการคิดว่า

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++)

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


1
ฉันต้องการเพิ่มว่าสำหรับอาร์เรย์หลายมิติที่อาจมีรูปร่างโดยพลการใน Java ลูปซ้อนกันควรตรวจสอบความยาว subarray for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }ที่เกี่ยวข้อง:
Andrey

52
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];
}

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


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

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

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

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

22

จากบทความที่ยอดเยี่ยมนี้: ArrayIndexOutOfBoundsException ในการวนซ้ำ

ที่จะนำมันสั้น ๆ :

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

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

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

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

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

17

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

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

int intArray[] = new int[5];

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

intArray[5];

4
ขอบเขตเป็นข้อ จำกัด ภายในช่วง เช่น; 0-5
John Giotta

11

เพื่อหลีกเลี่ยงข้อยกเว้นดัชนีอาร์เรย์นอกขอบเขตหนึ่งควรใช้คำสั่งที่ปรับปรุง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");
}

11

สาเหตุ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];
}

6

ในรหัสของคุณคุณได้เข้าถึงองค์ประกอบจากดัชนี 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');
}

5

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

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


3

มากสำหรับคำถามง่ายๆนี้ แต่ฉันแค่อยากจะเน้นคุณสมบัติใหม่ใน 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

คุณได้รับ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');
}

มันกำหนดไว้ในข้อกำหนดภาษาจาวา :

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


3

ดัชนี Array ไม่อยู่ในขอบเขตข้อยกเว้น

นั่นคือลักษณะของข้อยกเว้นประเภทนี้เมื่อถูกโยนใน 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

สำหรับอาร์เรย์หลายมิติอาจเป็นเรื่องยุ่งยากเพื่อให้แน่ใจว่าคุณเข้าถึง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เพื่อความเรียบง่าย)


เพิ่มตัวอย่างรหัสจากเพราะเหตุใดสำหรับลูปของฉันไม่ทำงานเมื่อฉันเปลี่ยนเงื่อนไข (อาร์เรย์หลายมิติ) เนื่องจากคำถามนี้ถูกใช้เป็นเป้าหมายสำหรับคำถามใด ๆ ที่เกี่ยวข้องกับ ArrayIndexOutOfBoundsException
Bill the Lizard

2

กรณีที่พบบ่อยที่สุดที่ฉันเคยเห็นสำหรับ 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 หรือตัวควบคุม ตรวจสอบตัวแปรอินสแตนซ์ทั้งหมดของเซิร์ฟเล็ตและคอนโทรลเลอร์ของคุณ


2

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

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


2

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

ในกรณีนี้:

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

เพื่อให้ได้รอบนี้ ...

  • ในลูป for คุณสามารถทำ 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

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เกิดขึ้นเมื่อคุณพยายามเข้าถึงองค์ประกอบ index.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

สำหรับอาร์เรย์ที่มีความยาว 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. วิธีที่ดีกว่าไปกับ a สำหรับแต่ละ loop ในวิธีนี้โปรแกรมเมอร์ไม่จำเป็นต้องกังวลเกี่ยวกับจำนวนองค์ประกอบในอาร์เรย์

    for(String str : array) {
        System.out.println(str);
    }

1

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

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

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

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

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


1

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


1

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


0

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

ในกรณีของคุณคุณสามารถลบเครื่องหมายเท่ากับสำหรับลูปของคุณ

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

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

for(String i : name )
      System.out.println(i);

0

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

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 ความยาว -2) องค์ประกอบสุดท้ายของอาร์เรย์จะถูกพิมพ์ .. เมื่อค่า 'i' ไปที่ (numberArray.length-1) ไม่มีค่าสำหรับการพิมพ์ .. ในจุดนั้นจะเกิด 'ArrayIndexOutOfBoundsException' หวังว่าคุณจะได้รับ ความคิดขอขอบคุณ!


0

คุณสามารถใช้ตัวเลือกในรูปแบบการทำงานเพื่อหลีกเลี่ยง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

-4

คุณไม่สามารถทำซ้ำหรือเก็บข้อมูลมากกว่าความยาวของอาร์เรย์ของคุณ ในกรณีนี้คุณสามารถทำสิ่งนี้:

for (int i = 0; i <= name.length - 1; i++) {
    // ....
}

หรือสิ่งนี้:

for (int i = 0; i < name.length; i++) {
    // ...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.