Minecraft เกิดข้อผิดพลาด IndexOutOfBoundsException: วิธีแก้ไขในเวอร์ชัน Java
เมื่อMinecraft Java Edition เกิดข้อผิดพลาด และรายงานข้อความIndexOutOfBoundsException ให้เริ่มต้นด้วยรายงานข้อผิดพลาดล่าสุด จากนั้นทดสอบในโปรไฟล์ที่สะอาดซึ่งใช้เวอร์ชันเกมเดียวกัน ข้อผิดพลาดนี้หมายความว่าโค้ดพยายามอ่านไอเทมในตำแหน่งที่ไม่ถูกต้องในรายการ อาร์เรย์ หรือโครงสร้างที่คล้ายกัน มันไม่ได้ระบุว่าม็อดใดมีปัญหา และไม่ใช่สัญญาณโดยอัตโนมัติว่าโลกของคุณเสียหายหรือคุณต้องการ RAM เพิ่ม สำรองข้อมูลโลกก่อนทำการทดสอบ ใช้การติดตามสแต็กเพื่อจำกัดสาเหตุ และเปลี่ยนตัวแปรทีละตัว
ข้อผิดพลาด IndexOutOfBoundsException หมายความว่าอย่างไร
ในภาษา Java ข้อผิดพลาด `Java runtime exception` IndexOutOfBoundsExceptionจะเกิดขึ้นเมื่อดัชนีอยู่นอกช่วงที่ถูกต้องสำหรับโครงสร้างข้อมูล ตัวอย่างเช่น รายการที่มี 12 รายการจะมีตำแหน่งตั้งแต่ 0 ถึง 11 การพยายามอ่านตำแหน่งที่ 12 จะอยู่นอกช่วงนั้น ข้อความที่ระบุในรายงานของ Minecraft อาจแตกต่างกันไปตามเวอร์ชันของ Java และโค้ดที่ทำให้เกิดข้อผิดพลาด
ชื่อนี้อธิบายถึงความล้มเหลว ไม่ใช่สาเหตุ อาจเกิดจากบั๊กใน Minecraft, ม็อด, การใช้งานม็อดที่ไม่เข้ากัน, ข้อมูลที่โหลดจากโลก หรือเส้นทางการโหลดทรัพยากร ดังนั้นควรพิจารณาข้ออ้างต่างๆ เช่น “เพิ่ม RAM”, “ลบโลก” หรือ “อัปเดต Java” เป็นเพียงข้อสันนิษฐาน จนกว่ารายงานหรือการทดสอบที่ควบคุมได้จะสนับสนุนข้ออ้างเหล่านั้น
กระบวนการแก้ไขปัญหาแบบสี่ขั้นตอน
1. ป้องกันไฟล์บันทึกและบันทึกเหตุการณ์เมื่อโปรแกรมล่ม
ปิดเกมและคัดลอกโฟลเดอร์โลกที่ได้รับผลกระทบก่อนที่จะเปิดเกมอีกครั้ง เก็บสำเนาไว้ในที่อื่นที่ไม่ใช่savesไดเร็กทอรีที่ใช้งานอยู่ และอย่าใช้เครื่องมือซ่อมแซมโลกกับสำเนาเพียงชุดเดียว จดบันทึกสิ่งที่เกิดขึ้นก่อนที่เกมจะล่ม เช่น การเปิดเกม การเข้าร่วมเซิร์ฟเวอร์ การเปิดโลก การเปลี่ยนมิติ การโหลดพื้นที่ใดพื้นที่หนึ่ง หรือการโหลดแพ็กทรัพยากรใหม่ รายละเอียดเหล่านี้จะช่วยให้คุณสามารถจำลองความล้มเหลวได้ในภายหลัง
2. เปิดรายงานข้อผิดพลาดล่าสุดและตรวจสอบลำดับการทำงานของโปรแกรม (stack trace)
ภาพแสดงตัวอย่างรายงานข้อผิดพลาดจากโปรแกรมจัดการไฟล์ภายในโฟลเดอร์ crash-reports โดยเส้นทางโฟลเดอร์และชื่อไฟล์อาจแตกต่างกันไปตามการติดตั้ง
รายงานข้อผิดพลาดมักจะถูกเก็บไว้ในcrash-reportsโฟลเดอร์ภายในไดเร็กทอรีของเกม ตำแหน่งเริ่มต้นทั่วไป%appdata%\.minecraft\crash-reportsบน Windows, ~/Library/Application Support/minecraft/crash-reportsmacOS และ~/.minecraft/crash-reportsLinux ไดเร็กทอรีเกมที่กำหนดเองหรือตัวเรียกใช้งานของบุคคลที่สามอาจใช้ตำแหน่งที่แตกต่างกัน ให้เปิดโฟลเดอร์ของเกมจากตัวเรียกใช้งานนั้น หากไม่มีการเขียนรายงานข้อผิดพลาด ให้เก็บรักษาlogs/latest.logเอาต์พุตคอนโซลของตัวเรียกใช้งานไว้ด้วย
นี่เป็นเพียงตัวอย่างรูปแบบบันทึกการทำงาน ไม่ใช่รายงานข้อผิดพลาดจริง โปรดดูรายละเอียดข้อผิดพลาดและข้อมูลการติดตามการทำงานจริงจากเซสชันของคุณ
ในรายงานข้อผิดพลาด ให้ค้นหาบรรทัดที่เกิดข้อยกเว้นและอ่านเฟรมสแต็กที่อยู่ใกล้เคียง นอกจากนี้ ให้มองหาCaused by:เธรดหรืองานที่ระบุในรายงาน และคลาสหรือเมธอดใด ๆ ที่มีรหัสโมดูลอยู่ด้วย เบาะแสเหล่านี้สามารถชี้ไปยังโค้ดที่เกี่ยวข้องกับข้อผิดพลาดได้ แต่โมดูลที่ระบุในรายงานการติดตามอาจไม่ใช่สาเหตุหลักเพียงอย่างเดียวเสมอไป โมดูลอื่นอาจให้ข้อมูลที่ไม่เข้ากันหรือเปลี่ยนแปลงเส้นทางโค้ดเดียวกันก็ได้
3. เปรียบเทียบกับโปรไฟล์ที่ว่างเปล่าในเวอร์ชัน Minecraft เดียวกัน
การเปรียบเทียบโปรไฟล์จะมีประโยชน์ก็ต่อเมื่อเวอร์ชันของ Minecraft ยังคงเหมือนเดิมเท่านั้น มุมมองในตัวเรียกใช้งานนี้เป็นเพียงตัวอย่างเท่านั้น
ลองเปิดโปรไฟล์ที่ไม่ได้รับการดัดแปลงใดๆ โดยใช้เวอร์ชัน Minecraft เดียวกัน แล้วทำซ้ำการกระทำแบบเดียวกันในโลกทดสอบใหม่ เก็บโปรไฟล์เดิมและไฟล์บันทึกไว้เหมือนเดิม หากโปรไฟล์ที่ไม่ได้รับการดัดแปลงทำงานได้ ในขณะที่โปรไฟล์ที่ได้รับการดัดแปลงเกิดข้อผิดพลาด ให้ตรวจสอบความขัดแย้งของ ม็อด ตัวโหลด การพึ่งพา และการตั้งค่าต่างๆ หากทั้งสองโปรไฟล์เกิดข้อผิดพลาด ปัญหาอาจอยู่ที่การติดตั้งเกม กราฟิก หรือเส้นทางการโหลดทรัพยากร หรือบั๊กเฉพาะเวอร์ชันของเกม การตรวจสอบเฉพาะข้อผิดพลาดอย่างเดียวไม่สามารถแยกแยะความเป็นไปได้เหล่านี้ได้
หากเกิดข้อผิดพลาดเฉพาะในโลกที่มีอยู่แล้วโลกเดียว ให้ลองทดสอบสำเนาของโลกนั้นและสังเกตว่าข้อผิดพลาดเกิดขึ้นตามตำแหน่ง เอนทิตี หรือแพ็กข้อมูลใดเป็นพิเศษ หลีกเลี่ยงการบันทึกโลกหลังจากเปิดโดยไม่มีม็อดที่เกี่ยวข้อง: เนื้อหาของม็อดที่หายไปอาจถูกลบหรือเปลี่ยนแปลงเมื่อโหลดและบันทึกโลก
4. แยกม็อดโดยไม่ต้องลบออก
การย้ายไฟล์ JAR ของม็อดไปยังโฟลเดอร์ที่อยู่ระดับเดียวกันจะทำให้การทดสอบสามารถย้อนกลับได้ ในขณะที่ยังคงเก็บไฟล์เหล่านั้นไว้นอกไดเร็กทอรีม็อดที่ใช้งานอยู่
ตรวจสอบให้แน่ใจว่าม็อดทุกตัวรองรับเวอร์ชัน Minecraft ของคุณและตัวโหลดที่คุณใช้ เช่น Fabric, Forge หรือ NeoForge API และส่วนประกอบที่จำเป็นต้องตรงกันด้วย ในการทดสอบ ให้ย้ายไฟล์ JAR ของม็อดจากmodsโฟลเดอร์ที่ใช้งานอยู่ไปยังโฟลเดอร์ย่อยอื่น เช่นmods-disabled; อย่าลบไฟล์เหล่านั้น เรียกใช้โปรไฟล์เดิมและทำซ้ำขั้นตอน หากปัญหาหยุดลง ให้กู้คืนไฟล์ทีละกลุ่มเล็กๆ จนกว่าจะเกิดปัญหาขึ้นอีกครั้ง จากนั้นจึงค่อยแก้ไขกลุ่มสุดท้าย อัปเดตหรือลบเฉพาะส่วนประกอบที่ไม่เข้ากัน และใช้หน้าดาวน์โหลดของผู้สร้างม็อดหรือคำแนะนำของผู้ดูแลแพ็กม็อด
อย่าใช้ม็อดที่สร้างมาสำหรับตัวโหลดที่แตกต่างกัน และอย่าคิดว่าม็อดเวอร์ชันล่าสุดจะเข้ากันได้กับเวอร์ชันเกมเก่า หากการโหลดทรัพยากรใหม่เป็นสาเหตุ ให้ปิดใช้งานแพ็กทรัพยากรที่เกี่ยวข้องชั่วคราวในโปรไฟล์ที่คัดลอกมา แล้วเปรียบเทียบส่วนการโหลดใหม่ในรายงาน
เลือกวิธีแก้ไขถัดไปจากหลักฐานที่มีอยู่
สิ่งที่คุณสังเกตเห็น สิ่งที่ต้องตรวจสอบต่อไป
โปรไฟล์ที่ไม่มีการแก้ไขใช้งานได้ปกติ แต่โปรไฟล์ที่มีการแก้ไขทำให้โปรแกรมหยุดทำงาน ตัวโหลด, เวอร์ชันของม็อด, API ที่จำเป็น และการผสมผสานของม็อด ควรนำม็อดกลับมาใช้ทีละกลุ่มเล็กๆ
อุบัติเหตุครั้งนี้เกิดขึ้นในโลกหนึ่ง แต่ไม่ใช่โลกทดสอบใหม่ สำเนาของไฟล์บันทึกเกม, แพ็กข้อมูล, บล็อกหรือเอนทิตี้ที่ขึ้นอยู่กับม็อด และตำแหน่งที่ระบุชื่อไว้ใกล้กับข้อความแสดงข้อผิดพลาด
รายงานชี้ให้เห็นถึงปัญหาการแสดงผลหรือการโหลดทรัพยากรใหม่ ทดสอบส่วนประกอบกราฟิก, เชเดอร์ หรือชุดทรัพยากรทีละอย่างบนโปรไฟล์ที่คัดลอกมา
การเล่นแบบหลายผู้เล่นเท่านั้นที่จะทำให้เกิดความล้มเหลว ขอให้เจ้าของเซิร์ฟเวอร์ตรวจสอบรายงานของเซิร์ฟเวอร์และเปรียบเทียบเวอร์ชันของไคลเอ็นต์ เซิร์ฟเวอร์ โหลดเดอร์ และม็อด
ไม่มีรายงานอุบัติเหตุปรากฏขึ้น บันทึกไฟล์บันทึกเกมและข้อความแสดงผลจากโปรแกรมเปิดเกมล่าสุดไว้ เพราะอาจมีข้อผิดพลาดล่าสุดก่อนที่กระบวนการจะปิดลง
Java และหน่วยความจำไม่ใช่วิธีแก้ปัญหาที่ใช้ได้กับทุกกรณี
ความไม่ตรงกันของรันไทม์ Java อาจทำให้ Minecraft เวอร์ชันใหม่หรือตัวโหลดม็อดไม่สามารถเริ่มต้นได้ แต่การเปลี่ยน Java ไม่ใช่วิธีแก้ไขทั่วไปสำหรับข้อผิดพลาด index exception ให้ปฏิบัติตามข้อกำหนดสำหรับเวอร์ชันและตัวเรียกใช้งานที่แน่นอน ตัวอย่างเช่น บันทึกการเผยแพร่ Minecraft Java Edition 1.20.5 ของ Mojang ระบุว่าเวอร์ชันนี้ต้องการ Java 21 และมี Microsoft OpenJDK 21.0.3 รวมอยู่ด้วย นั่นเป็นข้อกำหนดเฉพาะเวอร์ชัน ไม่ได้หมายความว่า Minecraft ทุกเวอร์ชันต้องติดตั้ง Java แยกต่างหากเหมือนกัน หากคุณใช้ตัวเรียกใช้งานอย่างเป็นทางการ ให้ทดสอบรันไทม์ที่มาพร้อมกับตัวเรียกใช้งานก่อน ตัวเรียกใช้งานและเซิร์ฟเวอร์แบบกำหนดเองควรปฏิบัติตามข้อกำหนดเวอร์ชันของตนเอง
ในทำนองเดียวกัน การจัดสรรหน่วยความจำเพิ่มเติมไม่ได้ช่วยแก้ไขรายการหรือดัชนีอาร์เรย์ที่ไม่ถูกต้อง ควรเพิ่มหน่วยความจำเฉพาะเมื่อบันทึกรายงานปัญหาเกี่ยวกับหน่วยความจำจริง ๆ เท่านั้น เช่นOutOfMemoryErrorอย่าลบโฟลเดอร์การกำหนดค่าทั้งหมด ลบส่วนต่าง ๆ หรือแก้ไขข้อมูลผู้เล่นโดยอาศัยเพียงชื่อของข้อยกเว้นเท่านั้น
หากต้องการความช่วยเหลือ โปรดแชร์รายงานอย่างปลอดภัย
เมื่อขอความช่วยเหลือจากผู้สร้างม็อด ผู้ดูแลแพ็กม็อด หรือผู้ดูแลระบบเซิร์ฟเวอร์ โปรดระบุเวอร์ชัน Minecraft เวอร์ชันตัวโหลด รายชื่อม็อดที่เกี่ยวข้อง ขั้นตอนที่ทำให้เกิดข้อผิดพลาด และรายงานข้อผิดพลาดฉบับสมบูรณ์หรือบันทึกข้อมูลล่าสุด ลบข้อมูลส่วนตัวออกก่อน เช่น โทเค็นบัญชี ที่อยู่อีเมล และเส้นทางส่วนตัว เก็บสำเนาในเครื่องที่ไม่เปลี่ยนแปลงไว้เพื่อให้คุณสามารถเปรียบเทียบกับรายงานในภายหลังได้
เอกสารอ้างอิง Java API ให้คำจำกัดความของข้อยกเว้น คู่มือการแก้ไขปัญหาของ Fabric อธิบายว่ารายงานข้อผิดพลาดถูกจัดเก็บไว้ที่ใดและวิธีการอ่านส่วนต่างๆ ของรายงานเหล่านั้น และบันทึกของ Mojang เวอร์ชัน 1.20.5 ระบุข้อกำหนดของ Java ในเวอร์ชันนั้น: