สาเหตุ java.lang.ArrayIndexOutOfBoundsException คืออะไรและฉันจะป้องกันได้อย่างไร
อะไรArrayIndexOutOfBoundsException
หมายและวิธีการที่ฉันจะกำจัดมันได้หรือไม่
นี่คือตัวอย่างโค้ดที่ทำให้เกิดข้อยกเว้น:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
คำตอบ
พอร์ตการโทรแรกของคุณควรเป็นเอกสารที่อธิบายไว้อย่างชัดเจนพอสมควร:
โยนเพื่อระบุว่ามีการเข้าถึงอาร์เรย์ด้วยดัชนีที่ผิดกฎหมาย ดัชนีเป็นลบหรือมากกว่าหรือเท่ากับขนาดของอาร์เรย์
ตัวอย่างเช่น:
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++)
(สมมติว่าคุณต้องการดัชนีแน่นอนหากคุณสามารถใช้การปรับปรุงสำหรับลูปแทนได้ให้ทำเช่นนั้น)
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++) {
จากบทความที่ยอดเยี่ยมนี้: ArrayIndexOutOfBoundsException ในสำหรับลูป
เพื่อสรุปสั้น ๆ :
ในการทำซ้ำครั้งสุดท้ายของ
for (int i = 0; i <= name.length; i++) {
i
จะเท่ากับname.length
ซึ่งเป็นดัชนีที่ผิดกฎหมายเนื่องจากดัชนีอาร์เรย์เป็นศูนย์
รหัสของคุณควรอ่าน
for (int i = 0; i < name.length; i++)
^
หมายความว่าคุณกำลังพยายามเข้าถึงดัชนีของอาร์เรย์ซึ่งไม่ถูกต้องเนื่องจากไม่ได้อยู่ระหว่างขอบเขต
ตัวอย่างเช่นสิ่งนี้จะเริ่มต้นอาร์เรย์จำนวนเต็มดั้งเดิมด้วยขอบเขตบน 4
int intArray[] = new int[5];
โปรแกรมเมอร์นับจากศูนย์ ตัวอย่างเช่นนี้จะโยนArrayIndexOutOfBoundsException
เป็นขอบเขตบนคือ 4 และไม่ใช่ 5
intArray[5];
เพื่อหลีกเลี่ยงข้อยกเว้นนอกขอบเขตของดัชนีอาร์เรย์เราควรใช้คำสั่งขั้นสูง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");
}
สาเหตุ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];
}
ในโค้ดของคุณคุณได้เข้าถึงองค์ประกอบตั้งแต่ดัชนี 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');
}
สำหรับอาร์เรย์ที่คุณกำหนดความยาวของอาร์เรย์คือ 3 (เช่น name.length = 3) แต่เนื่องจากเก็บองค์ประกอบโดยเริ่มจากดัชนี 0 จึงมีดัชนีสูงสุด 2
ดังนั้นแทนที่จะเป็น 'i ** <= name.length' คุณควรเขียน 'i <** name.length' เพื่อหลีกเลี่ยง 'ArrayIndexOutOfBoundsException'
คำถามง่ายๆนี้มีมาก แต่ฉันแค่อยากจะเน้นคุณลักษณะใหม่ใน 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
คุณได้รับ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
อาจเป็นบวกหรือศูนย์
นั่นคือลักษณะของข้อยกเว้นประเภทนี้เมื่อโยนใน 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
สำหรับอาร์เรย์หลายมิติการตรวจสอบให้แน่ใจว่าคุณเข้าถึง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
เพื่อความเรียบง่าย)
กรณีที่พบบ่อยที่สุดที่ฉันเคยเห็นสำหรับ 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 และคอนโทรลเลอร์ของคุณเพื่อหาผู้ต้องสงสัย
ArrayIndexOutOfBoundsException เมื่อใดก็ตามที่มีข้อยกเว้นนี้หมายความว่าคุณกำลังพยายามใช้ดัชนีของอาร์เรย์ที่อยู่นอกขอบเขตหรือในเงื่อนไข Lay Man ที่คุณกำลังร้องขอมากกว่าที่คุณได้เริ่มต้น
เพื่อป้องกันสิ่งนี้ตรวจสอบให้แน่ใจเสมอว่าคุณไม่ได้ร้องขอดัชนีที่ไม่มีอยู่ในอาร์เรย์เช่นถ้าความยาวอาร์เรย์เท่ากับ 10 ดัชนีของคุณจะต้องอยู่ในช่วงระหว่าง 0 ถึง 9
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);
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
}
สำหรับอาร์เรย์ใด ๆ ที่มีความยาว n องค์ประกอบของอาร์เรย์จะมีดัชนีตั้งแต่ 0 ถึง n-1
หากโปรแกรมของคุณพยายามเข้าถึงองค์ประกอบใด ๆ (หรือหน่วยความจำ) ที่มีดัชนีอาร์เรย์มากกว่า n-1 Java จะโยนArrayIndexOutOfBoundsException
ดังนั้นนี่คือสองวิธีที่เราสามารถใช้ในโปรแกรมได้
การรักษาจำนวน:
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++; }
วิธีที่ดีกว่าไปกับแต่ละลูปในวิธีนี้โปรแกรมเมอร์ไม่จำเป็นต้องกังวลเกี่ยวกับจำนวนองค์ประกอบในอาร์เรย์
for(String str : array) { System.out.println(str); }
ตามรหัสของคุณ:
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');
}
แต่ละรายการในอาร์เรย์เรียกว่าองค์ประกอบและแต่ละองค์ประกอบเข้าถึงได้โดยดัชนีตัวเลข ดังแสดงในภาพประกอบก่อนหน้านี้เลขขึ้นต้นด้วย 0 ตัวอย่างเช่นองค์ประกอบที่ 9 จะเข้าถึงได้ที่ดัชนี 8
IndexOutOfBoundsException ถูกโยนเพื่อระบุว่าดัชนีของการจัดเรียงบางอย่าง (เช่นอาร์เรย์ไปยังสตริงหรือเวกเตอร์) อยู่นอกช่วง
อาร์เรย์ X ใด ๆ สามารถเข้าถึงได้ตั้งแต่ [0 ถึง (X.length - 1)]
ฉันเห็นคำตอบทั้งหมดที่นี่เพื่ออธิบายวิธีทำงานกับอาร์เรย์และวิธีหลีกเลี่ยงดัชนีนอกขอบเขต ฉันเองหลีกเลี่ยงอาร์เรย์โดยเสียค่าใช้จ่ายทั้งหมด ฉันใช้คลาส Collections ซึ่งหลีกเลี่ยงความโง่เขลาทั้งหมดที่ต้องจัดการกับดัชนีอาร์เรย์โดยสิ้นเชิง โครงสร้างแบบวนซ้ำทำงานได้อย่างสวยงามด้วยคอลเลกชันที่รองรับโค้ดที่เขียนเข้าใจและดูแลรักษาได้ง่ายขึ้น
ถ้าคุณใช้ความยาวของอาร์เรย์เพื่อย้ำการควบคุมของสำหรับห่วงเสมอจำไว้ว่าดัชนีของรายการแรกในอาร์เรย์คือ0 ดังนั้นดัชนีขององค์ประกอบสุดท้ายในอาร์เรย์จึงมีค่าน้อยกว่าความยาวของอาร์เรย์
ArrayIndexOutOfBoundsException
ชื่ออธิบายว่าหากคุณพยายามเข้าถึงค่าที่ดัชนีซึ่งอยู่นอกขอบเขตของขนาด Array จะเกิดข้อยกเว้นดังกล่าวขึ้น
ในกรณีของคุณคุณสามารถลบเครื่องหมายเท่ากับออกจาก for loop ของคุณได้
for(int i = 0; i<name.length; i++)
ตัวเลือกที่ดีกว่าคือการวนซ้ำอาร์เรย์:
for(String i : name )
System.out.println(i);
ข้อผิดพลาดนี้เกิดขึ้นในช่วงเวลาที่เกินขีด จำกัด ของการทำงานลองพิจารณาตัวอย่างง่ายๆเช่นนี้
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' จะเกิดขึ้นฉันหวังว่าคุณจะได้รับ ความคิดขอบคุณ!
คุณสามารถใช้ทางเลือกในรูปแบบการทำงานเพื่อหลีกเลี่ยง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