JavaRush /จาวาบล็อก /Random-TH /คอฟฟี่เบรค #220. วิธีแก้ไขข้อยกเว้นใน Java - คำแนะนำโดยละ...

คอฟฟี่เบรค #220. วิธีแก้ไขข้อยกเว้นใน Java - คำแนะนำโดยละเอียด

เผยแพร่ในกลุ่ม
ที่มา: JavaTechOnline บทช่วยสอนนี้จะช่วยให้คุณเรียนรู้วิธีแก้ไขข้อยกเว้นทั่วไปใน Java นอกจากทฤษฎีแล้ว คุณจะเห็นตัวอย่างโค้ดเพื่อแก้ไขปัญหาดังกล่าว คอฟฟี่เบรค #220.  วิธีแก้ไขข้อยกเว้นใน Java - คำแนะนำโดยละเอียด - 1เช่นเดียวกับภาษาโปรแกรมอื่นๆ นักพัฒนา Java อาจพบข้อผิดพลาดหรือข้อยกเว้นเมื่อเขียนโค้ด ควรคำนึงถึงข้อยกเว้นอย่างจริงจังเนื่องจากเหตุการณ์ดังกล่าวใช้เวลานาน อย่างไรก็ตาม ด้วยความรู้เพียงเล็กน้อย คุณสามารถเร่งการแก้ไขปัญหาส่วนใหญ่เหล่านี้ได้ ดังนั้น เรามาเรียนรู้วิธีแก้ไขข้อยกเว้นทั่วไปใน Java กันดีกว่า

แนวทางทั่วไปสำหรับการหลีกเลี่ยงข้อยกเว้นใน Java

เพื่อหลีกเลี่ยงไม่ให้มีข้อยกเว้นใดๆ ใน Java สิ่งสำคัญคือต้องเข้าใจและปฏิบัติตามแนวทางการเขียนโค้ด:
  1. ตรวจสอบอินพุตของผู้ใช้ทุกครั้งก่อนที่จะนำไปใช้ในโค้ดของคุณ
  2. ใช้try-catch , Throws , Throw Blocks ขึ้นอยู่กับสิ่งที่เหมาะสมสำหรับสถานการณ์เฉพาะ
  3. อย่าละเลยข้อความในโค้ดเกี่ยวกับการประมวลผลและข้อผิดพลาด ซึ่งจะช่วยระบุและแก้ไขปัญหา
  4. อย่าลืมบันทึกข้อยกเว้นเพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่อง คุณสามารถใช้ข้อความบันทึกเพื่อช่วยระบุปัญหาได้
  5. ปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในการเขียนโค้ดเพื่อหลีกเลี่ยงข้อยกเว้นและทดสอบโค้ดของคุณอย่างละเอียด
  6. อัปเดตการพึ่งพา API ของคุณเพื่อให้แน่ใจว่าคุณใช้ไลบรารีและเฟรมเวิร์กเวอร์ชันล่าสุดและเสถียรที่สุด
  7. ใช้เครื่องมือและกรอบการทดสอบที่จำเป็นเพื่อระบุปัญหาที่อาจเกิดขึ้นในโค้ดของคุณก่อนที่จะทำให้เกิดข้อยกเว้น
  8. ตรวจสอบประสิทธิภาพและบันทึกของแอปพลิเคชันของคุณเพื่อระบุและแก้ไขปัญหาได้อย่างรวดเร็ว
  9. ติดตามแนวทางปฏิบัติด้านความปลอดภัยที่ดีที่สุดเพื่อให้แน่ใจว่าโค้ดของคุณปลอดภัยและได้รับการปกป้องจากการโจมตีที่อาจเกิดขึ้น
  10. จัดทำเอกสารรหัสของคุณและข้อยกเว้นอย่างละเอียดเพื่อให้นักพัฒนารายอื่นเข้าใจและบำรุงรักษาได้ง่ายขึ้น

รายการข้อยกเว้นที่พบบ่อยที่สุดใน Java

Java มีรายการข้อยกเว้นที่ค่อนข้างยาว ลองดูสิ่งที่พบบ่อยที่สุด:

NullPointerException

NullPointerException เป็นประเภทของ ข้อยกเว้นRuntimeException มันเกิดขึ้นเมื่อเราพยายามใช้ตัวแปรอ้างอิงที่มีค่าว่าง ซึ่งหมายความว่าชี้ไปที่วัตถุหรือตัวแปรที่มีค่าเป็นnull ข้อผิดพลาดดังกล่าวสามารถเกิดขึ้นได้เมื่อเราพยายามเรียกใช้เมธอดหรือเข้าถึงฟิลด์ของอ็อบเจ็กต์ที่ยังไม่ได้เตรียมใช้งาน หรือเมื่อเราส่งค่าnullเป็นพารามิเตอร์ไปยังเมธอดที่ไม่สามารถจัดการได้ เพื่อป้องกันไม่ให้NullPointerException ถูกส่งออกไป คุณสามารถตรวจสอบว่าตัวแปรอ้างอิงเป็น null หรือไม่โดยใช้ตัว ดำเนินการ == หากเป็นกรณีนี้ จะต้องจัดการกรณีว่างอย่างถูกต้อง หรืออีกทางหนึ่ง เราสามารถกำหนดค่าเริ่มต้นให้กับตัวแปรของเราเป็นค่าเริ่มต้น (หากเป็นไปได้) เพื่อให้แน่ใจว่าเราจะไม่พบกับการอ้างอิงที่เป็นโมฆะ อีกวิธีในการหลีกเลี่ยงNullPointerExceptionคือการใช้ คลาส Optional ใน Java ตัวเลือกคือวัตถุคอนเทนเนอร์ที่อาจมีหรือไม่มีค่าที่ไม่ใช่ค่าว่าง ใช้เพื่อแสดงการมีอยู่หรือไม่มีค่า คล้ายกับการใช้ค่า Null เพื่อแสดงการไม่มีค่า หากโปรแกรมเมอร์พยายามเข้าถึงค่าว่างของ ออบเจ็กต์ Optionalโปรแกรมจะไม่เกิดNullPointerExceptionแต่จะส่งกลับออบ เจ็กต์ Optional ว่าง แทน กล่าวอีกนัยหนึ่ง Optional บังคับให้โปรแกรมเมอร์จัดการกรณีที่ค่าหายไป ซึ่งช่วยหลีกเลี่ยง NullPointerException

IndexOutOfBoundsException

IndexOutOfBoundsExceptionเป็นข้อยกเว้นรันไทม์ที่เกิดขึ้นเมื่อดัชนีที่ใช้ในการเข้าถึงอาร์เรย์หรือคอลเลกชันเป็นค่าลบหรือมากกว่าหรือเท่ากับขนาดของอาร์เรย์หรือคอลเลกชัน เพื่อป้องกันไม่ให้ข้อยกเว้นนี้เกิดขึ้น เราต้องตรวจสอบให้แน่ใจว่าดัชนีที่ใช้ในการเข้าถึงอาร์เรย์หรือคอลเลกชันนั้นอยู่ภายในขอบเขตของมัน กล่าวคือ จะต้องมากกว่าหรือเท่ากับศูนย์และน้อยกว่าขนาดของอาร์เรย์หรือคอลเลกชัน

ArrayIndexOutOfBoundsException

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

StringIndexOutOfBoundsException

StringIndexOutOfBoundsExceptionเป็น ชนิด IndexOutOfBoundsExceptionที่ถูกส่งออกมาเมื่อมีการพยายามเข้าถึงอักขระในสตริงที่มีดัชนีที่ไม่ถูกต้อง เช่นเดียวกับArrayIndexOutOfBoundsException ก่อนหน้านี้ โปรดจำไว้ว่าใน Java ดัชนีของสตริงเริ่มต้นที่0และสิ้นสุดที่length()-1โดยที่length()คือจำนวนอักขระในสตริง หากคุณพยายามเข้าถึงอักขระที่ดัชนีนอกช่วงนี้ คุณอาจพบStringIndexOutOfBoundsException หากคุณพบStringIndexOutOfBoundsExceptionคุณควรตรวจสอบโค้ดของคุณเพื่อให้แน่ใจว่าคุณใช้ดัชนีที่ถูกต้องเมื่อเข้าถึงอักขระในสตริง

ClassCastException

ข้อยกเว้นนี้เกิดขึ้นเมื่อเราพยายามแปลงออบเจ็กต์เป็นประเภทที่ไม่เข้ากันกับประเภทจริง ในการแก้ปัญหาเช่นนี้ สิ่งสำคัญคือต้องแน่ใจว่าโปรแกรม Java ของคุณพยายามส่งอ็อบเจ็กต์ไปยังคลาสที่เป็นอินสแตนซ์เท่านั้น คุณสามารถตรวจสอบประเภทของออบเจ็กต์ได้โดยใช้ ตัวดำเนินการ instanceofก่อนที่จะใช้การแคสต์

ข้อยกเว้นอาร์กิวเมนต์ที่ผิดกฎหมาย

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

IllegalStateException

IllegalStateExceptionเป็นประเภทของRuntimeExceptionที่เกิดขึ้นเมื่อวัตถุอยู่ในสถานะที่ไม่เหมาะสมสำหรับการดำเนินการที่กำลังดำเนินการ สิ่งนี้สามารถเกิดขึ้นได้หากมีการเรียกใช้เมธอดบนออบเจ็กต์ที่ไม่อยู่ในสถานะที่คาดไว้ ตัวอย่างเช่น ถ้าเราสร้างวัตถุการเชื่อมต่อฐานข้อมูลแล้วปิดมัน จากนั้นหากเราพยายามสร้าง อ็อบเจ็กต์ Statementในการเชื่อมต่อแบบปิด มันจะส่ง IllegalStateException เนื่องจากเมธอดcreateStatement()จำเป็นต้องมีการเชื่อมต่อแบบเปิด หากคุณพบIllegalStateExceptionคุณควรตรวจสอบโค้ดของคุณเพื่อให้แน่ใจว่าคุณกำลังเรียกใช้เมธอดบนอ็อบเจ็กต์ที่อยู่ในสถานะที่เหมาะสม

ไม่รองรับ OperationException

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

ข้อยกเว้นทางคณิตศาสตร์

ArithmeticExceptionเป็นประเภทของRuntimeExceptionที่เกิดขึ้นเมื่อการดำเนินการทางคณิตศาสตร์สร้างผลลัพธ์ที่ไม่ถูกต้อง ข้อยกเว้นนี้อาจเกิดขึ้นได้เมื่อเราพยายามดำเนินการทางคณิตศาสตร์ด้วยอาร์กิวเมนต์ที่ไม่ถูกต้องหรือไม่ถูกต้อง เช่น เมื่อพยายามหารด้วยศูนย์ เพื่อแก้ปัญหานี้ เราสามารถดำเนินการตรวจสอบอินพุตและตรวจสอบให้แน่ใจว่าอาร์กิวเมนต์ตรงตามเงื่อนไขที่กำหนดก่อนดำเนินการทางคณิตศาสตร์

ข้อยกเว้นด้านความปลอดภัย

SecurityExceptionเป็นประเภทของRuntimeExceptionที่เกิดขึ้นเมื่อมีการละเมิดความปลอดภัยเกิดขึ้นระหว่างการทำงานของโปรแกรม ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อโปรแกรมพยายามดำเนินการที่ไม่ได้รับอนุญาตตามนโยบายความปลอดภัย ในการแก้ปัญหา เราต้องแน่ใจว่าเราสามารถเข้าถึงทรัพยากรและดำเนินการตามที่เราได้รับอนุญาตโดยเฉพาะ

NumberFormatException

NumberFormatExceptionเป็นประเภทของRuntimeExceptionที่ถูกส่งออกมาเมื่อมีการเรียกใช้เมธอดเพื่อแปลงสตริงเป็นรูปแบบตัวเลข แต่สตริงไม่อยู่ในรูปแบบที่เหมาะสม เพื่อแก้ไขปัญหานี้ เราต้องตรวจสอบอินพุตของผู้ใช้ก่อนที่จะพยายามแปลงข้อมูล ตรวจสอบโค้ดของคุณเพื่อให้แน่ใจว่าคุณกำลังพยายามแปลงสตริงที่มีการจัดรูปแบบอย่างเหมาะสมสำหรับประเภทตัวเลขเป้าหมาย

ข้อยกเว้นขัดจังหวะ

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

ไฟล์ NotFoundException

FileNotFoundException เป็นข้อยกเว้นที่ตรวจสอบซึ่งเกิดขึ้นเมื่อโปรแกรมพยายามเข้าถึงไฟล์ที่ไม่มีอยู่หรือไม่พบในตำแหน่งที่ระบุ อาจปรากฏขึ้นหากไฟล์สะกดผิด ย้ายหรือลบ หรือแม้แต่เมื่อโปรแกรมไม่มีสิทธิ์ที่จำเป็นในการเข้าถึงไฟล์ เพื่อแก้ไขข้อผิดพลาด คุณสามารถดำเนินการตรวจสอบอินพุตเพื่อให้แน่ใจว่าเส้นทางของไฟล์ถูกต้อง และโปรแกรมมีสิทธิ์ที่จำเป็นในการเข้าถึงไฟล์

IOข้อยกเว้น

IOExceptionเป็นข้อยกเว้นที่ได้รับการตรวจสอบใน Java ซึ่งแสดงถึงข้อผิดพลาดที่พบขณะดำเนินการอินพุตหรือเอาต์พุต เช่น การอ่านหรือการเขียนไฟล์หรือซ็อกเก็ตเครือข่าย สาเหตุอาจเกิดขึ้นได้จากหลายสาเหตุ เช่น ไฟล์ที่ระบุหายไปหรือไม่สามารถเข้าถึงได้ ข้อผิดพลาดของเครือข่าย หรือการอนุญาตไม่เพียงพอ ในการแก้ไขปัญหา คุณต้องดำเนินการหลายอย่าง เช่น การตรวจสอบข้อความแสดงข้อผิดพลาด การจัดการข้อยกเว้นโดยใช้try-catchการปิดทรัพยากร การตรวจสอบสิทธิ์ของไฟล์ และอื่นๆ

ไม่มีSuchMethodException

NoSuchMethodExceptionเป็นข้อยกเว้นที่เกิดขึ้นเมื่อรันไทม์เมื่อเราพยายามเรียกเมธอดที่ไม่มีอยู่ในคลาส ข้อยกเว้นนี้มักจะเกิดขึ้นถ้าเราเรียกเมธอดโดยใช้Class.getMethod()หรือClass.getDeclaredMethod()และไม่พบชื่อเมธอดที่ระบุในคลาสหรืออินเทอร์เฟซ ข้อยกเว้นอาจเกิดขึ้นได้เมื่อเราพยายามเรียกใช้เมธอดโดยใช้ คลาส java.lang.reflect.Methodและไม่มีชื่อเมธอดที่ระบุอยู่ในวัตถุ เพื่อหลีกเลี่ยงข้อยกเว้นนี้ ต้องแน่ใจว่าได้เรียกวิธีการที่ถูกต้องพร้อมกับลายเซ็นวิธีการที่ถูกต้องและตัวระบุการเข้าถึง

NoSuchFieldException

NoSuchFieldExceptionเป็นข้อยกเว้นรันไทม์ที่เกิดขึ้นเมื่อเราพยายามเข้าถึงฟิลด์ที่ไม่ได้อยู่ในคลาส ข้อยกเว้นนี้มักจะเกิดขึ้นเมื่อเราเรียกใช้เมธอดโดยใช้Class.getField()หรือClass.getDeclaredField()และไม่พบชื่อฟิลด์ที่ระบุในคลาสหรืออินเทอร์เฟซ นอกจากนี้ยังสามารถเรียกได้หากเราพยายามเข้าถึงฟิลด์โดยใช้ คลาส java.lang.reflect.Fieldและไม่มีชื่อฟิลด์ที่ระบุอยู่ในวัตถุ เพื่อหลีกเลี่ยงข้อยกเว้นนี้ ตรวจสอบให้แน่ใจว่าคุณเข้าถึงฟิลด์ที่ถูกต้องด้วยชื่อที่ถูกต้องและตัวแก้ไขการเข้าถึง หากคุณกำลังเข้าถึงฟิลด์ส่วนตัว อย่าลืมใช้ เมธอด getDeclaredField ( ) แทน เมธอดgetField()

ข้อยกเว้นการเข้าถึงที่ผิดกฎหมาย

IllegalAccessExceptionเป็นข้อยกเว้นรันไทม์ที่เกิดขึ้นเมื่อเราพยายามเข้าถึงฟิลด์หรือเมธอดในคลาส แต่เราไม่มีสิทธิ์การเข้าถึงที่จำเป็น ข้อยกเว้นนี้มักจะปรากฏขึ้นเมื่อเราพยายามเข้าถึงฟิลด์หรือเมธอดส่วนตัวจากภายนอกคลาส หรือเมื่อเราพยายามเข้าถึงฟิลด์หรือเมธอดที่ได้รับการป้องกันจากคลาสที่ไม่ใช่คลาสย่อยของคลาสดั้งเดิม นอกจากนี้ยังสามารถเรียกได้เมื่อพยายามเข้าถึงฟิลด์หรือเมธอดที่ถูกทำเครื่องหมายว่าไม่พร้อมใช้งานโดยคลาสjava.lang.reflect.AccessibleObject เพื่อหลีกเลี่ยงปัญหานี้ ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ที่จำเป็นในฟิลด์หรือวิธีการที่คุณพยายามเข้าถึง หากฟิลด์หรือเมธอดเป็นแบบส่วนตัว คุณอาจจำเป็นต้องใช้การสะท้อนกลับและตั้งค่าAccessObjectเป็นจริง (เพื่อเข้าถึง) อย่างไรก็ตาม ควรระมัดระวังเมื่อใช้การสะท้อนกลับเพื่อเข้าถึงฟิลด์หรือเมธอดส่วนตัว เนื่องจากอาจทำลายการห่อหุ้มและทำให้ความสมบูรณ์ของคลาสลดลง

ตรวจสอบข้อผิดพลาด

VerifyError เป็นข้อผิดพลาดรันไทม์ที่เป็นคลาสย่อยของ LinkageError มันเกิดขึ้นเมื่อ Java Virtual Machine (JVM) พบไฟล์คลาสที่ละเมิดกฎการตรวจสอบบางอย่าง เมื่อคลาส Java ถูกคอมไพล์ คอมไพลเลอร์จะตรวจสอบว่าโค้ดไบต์เป็นไปตามกฎและข้อจำกัดบางอย่างหรือไม่ เช่น ความปลอดภัยของประเภทและการใช้สแต็กและตัวแปรโลคัลอย่างเหมาะสม หากไฟล์คลาสละเมิดกฎเหล่านี้ JVM จะส่งVerifyErrorเมื่อโหลดและตรวจสอบคลาสขณะรันไทม์ เพื่อหลีกเลี่ยงVerifyErrorตรวจสอบให้แน่ใจว่าโค้ดของคุณเป็นไปตามไวยากรณ์และความหมายของภาษา Java ที่ถูกต้อง หากคุณพบVerifyErrorคุณควรตรวจสอบโค้ดของคุณเพื่อให้แน่ใจว่าถูกต้อง และไม่มีการละเมิดกฎการตรวจสอบไบต์ Java

ข้อผิดพลาด OutOfMemory

OutOfMemoryErrorเป็นคลาสย่อยของ Errorซึ่งเป็น ประเภท Throwableที่นำเสนอปัญหาร้ายแรงที่ไม่สามารถแก้ไขได้ในขณะรันไทม์ แม้ว่า Java 8 จะมีการปรับปรุงบางอย่างในการรวบรวมขยะและการจัดการหน่วยความจำ แต่คุณยังคงพบ OutOfMemoryError หากแอปพลิเคชันของคุณใช้หน่วยความจำมากเกินไปหรือจัดการการใช้หน่วยความจำไม่ถูกต้อง เพื่อหลีกเลี่ยงOutOfMemoryErrorคุณต้องจัดการการใช้หน่วยความจำในแอปพลิเคชัน Java ของคุณอย่างเหมาะสม สิ่งนี้เกี่ยวข้องกับการใช้โครงสร้างข้อมูลและอัลกอริธึมที่ใช้หน่วยความจำอย่างมีประสิทธิภาพ หลีกเลี่ยงการสร้างวัตถุที่ไม่จำเป็น และการลบวัตถุอย่างเหมาะสมเมื่อไม่ต้องการอีกต่อไป นอกจากนี้ คุณสามารถเพิ่มขนาดฮีปสูงสุดสำหรับ JVM ได้โดยใช้ แฟล็ก -Xmxเมื่อรันโปรแกรม Java ของคุณ

ข้อผิดพลาด StackOverflow

StackOverflowErrorเป็นข้อผิดพลาดประเภทหนึ่งที่เกิดขึ้นเมื่อขนาดสแต็กที่โปรแกรมต้องการเกินจำนวนหน่วยความจำที่จัดสรรไว้ มันสามารถเกิดขึ้นได้เมื่อโปรแกรมเรียกใช้เมธอดที่ซ้อนกันมากเกินไป หรือเมื่อเมธอดเรียกตัวเองซ้ำหลายครั้งเกินไป ส่งผลให้เกิดการวนซ้ำไม่สิ้นสุด Java Virtual Machine (JVM) จัดสรรหน่วยความจำจำนวนคงที่สำหรับสแต็กการดำเนินการ ซึ่งใช้เพื่อติดตามการเรียกเมธอดและตัวแปรภายในเครื่อง เมื่อสแต็ก โอเวอร์โฟลว์ JVM จะส่งStackOverflowError เพื่อหลีกเลี่ยงStackOverflowErrorสิ่งสำคัญคือต้องแน่ใจว่าโปรแกรม Java ของคุณใช้การเรียกซ้ำและการเรียกเมธอดอย่างเพียงพอ หากคุณพบStackOverflowErrorคุณสามารถลองเพิ่มขนาดสแต็กได้โดยใช้ แฟล็ก -Xssเมื่อรันโปรแกรม Java ของคุณ

การร้องขอ TargetException

InvocationTargetExceptionเป็นข้อยกเว้นที่ถูกตรวจสอบซึ่งถูกส่งโดยกลไกการสะท้อนของ Java เป็นส่วนหนึ่งของ แพ็คเกจ java.lang.reflect.InvocationTargetExceptionและใช้เพื่อระบุว่ามีข้อยกเว้นเกิดขึ้นระหว่างการเรียกใช้เมธอดหรือคอนสตรัคเตอร์ เมื่อเมธอดหรือคอนสตรัคเตอร์ถูกเรียกใช้โดยใช้กลไกการสะท้อนของ Java เมธอดinrigg() ของ คลาสjava.lang.reflect.Methodหรือjava.lang.reflect.Constructor จะถูกเรียก ว่า หากเมธอดหรือตัวสร้างที่เรียกใช้ส่งข้อยกเว้นเมธอดinurge()จะจับและรวมไว้ในInvocationTargetException ข้อยกเว้นนี้จะถูกส่งไปยังผู้เรียกของเมธอดinake( ) ในการแก้ไขInvocationTargetExceptionเราจำเป็นต้องจับมัน รับข้อยกเว้นที่สาเหตุที่แท้จริงโดยใช้ เมธอด getCause()และจัดการข้อยกเว้นที่สาเหตุที่แท้จริงตามลำดับ โปรดทราบว่าสาเหตุที่แท้จริงอาจเป็นข้อยกเว้นที่ตรวจสอบหรือข้อยกเว้นรันไทม์ ดังนั้นโปรดจัดการให้ถูกต้อง

วิธีแก้ไขข้อยกเว้นที่พบบ่อยที่สุดใน Java

วิธีแก้ไข NullPointerException.mq4

สถานการณ์สมมติ:คุณมีวิธีการที่เข้าถึงวัตถุที่มีค่า null
String title= null;
System.out.println(title.length()); // Это вызовет NullPointerException
โซลูชัน # 1:ตรวจสอบว่าวัตถุนั้นเป็นโมฆะก่อนใช้งานหรือไม่
if(title!= null) {
   System.out.println(title.length());
} else {
   System.out.println("title is null");
}
โซลูชัน # 2:ใช้ทางเลือกเพื่อ หลีกเลี่ยงNullPointerException
Optional<String> optionalTitle = Optional.ofNullable(getTitle());
if (optionalTitle.isPresent()) {
   String title= optionalTitle.get();
   System.out.println("Title: " + title);
} else {
   System.out.println("Title is not available.");
}

วิธีการแก้ไข ArrayIndexOutOfBoundsException.js

สถานการณ์สมมติ:คุณกำลังพยายามเข้าถึงอาร์เรย์ที่ดัชนีที่อยู่นอกขอบเขต
int[] numbers = {4, 5, 6};
System.out.println(numbers[3]);   // Это вызовет ArrayIndexOutOfBoundsException
วิธีแก้ไข:ตรวจสอบความยาวของอาร์เรย์ก่อนที่จะเข้าถึง และตรวจสอบให้แน่ใจว่าคุณใช้ดัชนีที่ถูกต้อง
int[] numbers = {4, 5, 6};
if (numbers.length > 3) {
   System.out.println(numbers[3]);
} else {
   System.out.println("ArrayIndexOutOfBoundsException: Please use valid indexes of the Array");
}

วิธีแก้ไข ClassCastException

สถานการณ์:คุณกำลังพยายามแปลงออบเจ็กต์เป็นประเภทที่ไม่เข้ากันกับประเภทจริง
Object obj = "Java Exception";
Integer number = (Integer) obj; // Это вызовет ClassCastException
วิธีแก้ไข:ตรวจสอบให้แน่ใจว่าคุณแคสต์ออบเจ็กต์เป็นประเภทที่เข้ากันได้เท่านั้น
Object obj = "Java Exception";
if(obj instanceof Integer) {
   Integer number = (Integer) obj;
   System.out.println(number);
} else {
   System.out.println("Object cannot caste to Integer");
}

วิธีแก้ไข IllegalArgumentException.dll

สถานการณ์จำลอง:คุณส่งผ่านอาร์กิวเมนต์ที่ไม่ถูกต้องไปยังเมธอด
public void printNumber(int number) {
   if(number <= 0) {
      throw new IllegalArgumentException("You cannot pass a negative number or zero");
   }
   System.out.println(number);
}

printNumber(-1); // Это вызовет IllegalArgumentException
วิธีแก้ไข:ตรวจสอบให้แน่ใจว่าคุณส่งอาร์กิวเมนต์ที่ถูกต้องไปยังเมธอดต่างๆ ในกรณีนี้ ให้ส่งผ่านจำนวนบวก
printNumber(1); //  Это успешно напечатает 1.

วิธีแก้ไข IllegalStateException.mq4

สถานการณ์สมมติ:วัตถุอยู่ในสถานะที่ไม่ถูกต้อง
public class Bike {

   private Boolean isStarted;

   public void start() {
      if(isStarted) {
        throw new IllegalStateException("Bike is already started");
      }
      isStarted = true;
      System.out.println("Bike started");
   }
}

Bike bike= new Bike();
bike.start();
bike.start(); // Это вызовет IllegalStateException потому что bike is already started
วิธีแก้ไข:ตรวจสอบให้แน่ใจว่าคุณรักษาสถานะของออบเจ็กต์ไว้อย่างถูกต้อง
Bike bike= new Bike();
bike.start();

วิธีแก้ไข UnsupportedOperationException

สถานการณ์จำลอง:คุณใช้การดำเนินการที่วัตถุไม่รองรับ ตัวอย่างหนึ่งที่ได้รับความนิยมคือ เมื่อคุณใช้ การดำเนินการ Remove() กับ คอ ลเลกชันที่ไม่เปลี่ยนรูป คุณจะเห็น ข้อยกเว้น UnsupportedOperationException
List<String> list = Arrays.asList("Java", "Angular", "Spring");
list.add("Python"); // Это вызовет UnsupportedOperationException
เนื่องจาก เมธอด Arrays.asList()ส่งคืนรายการที่ไม่เปลี่ยนรูป จึงไม่รองรับการเพิ่มหรือลบองค์ประกอบ วิธีแก้ไข:ตรวจสอบให้แน่ใจว่าคุณเรียกใช้การดำเนินการที่รองรับบนออบเจ็กต์เท่านั้น
List<String> list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring"));
list.add("Python");
System.out.println(list);

วิธีแก้ไข ArithmeticException.mq4

สถานการณ์ #1:คุณกำลังพยายามดำเนินการหารจำนวนเต็มซึ่งให้ผลลัพธ์เป็นเศษส่วน
int i = 10;
int j = 4;
int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробным
โดยผลลัพธ์ของการดำเนินการหารคือ 2.5 ซึ่งเป็นค่าเศษส่วน เนื่องจากจำนวนเต็มไม่สามารถเก็บค่าเศษส่วนได้ จึง ส่ง ArithmeticException ออก ไป วิธีแก้ไข:เพื่อหลีกเลี่ยงข้อยกเว้นนี้ เราสามารถใช้ชนิดข้อมูลที่รองรับค่าเศษส่วน เช่นdoubleเพื่อจัดเก็บผลลัพธ์ของการดำเนินการหาร นี่คือตัวอย่าง:
int i = 10;
int j = 4;
double k = (double) i/j;
สถานการณ์ #2:คุณพยายามหารด้วยศูนย์ และคุณได้รับข้อยกเว้นนี้ นี่เป็นสถานการณ์ที่พบบ่อยที่สุด
int i = 4;
int j = 0;
int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на ноль
วิธีแก้ปัญหา:จัดการการหารด้วยศูนย์อย่างถูกต้อง ตัวอย่างเช่น รหัสด้านล่างแสดงให้เห็นถึงการประมวลผลที่ถูกต้อง
int i = 4;
int j = 0;
if(j != 0) {
int k = i/j;
System.out.println(k);
} else {
System.out.println("ArithmeticException: Cannot divide by zero");
}

วิธีแก้ไข IndexOutOfBoundsException.mq4

สถานการณ์:คุณกำลังพยายามเข้าถึงคอลเลกชันที่มีดัชนีอยู่ภายนอก
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsException
วิธีแก้ไข:ตรวจสอบขนาดของคอลเลกชันก่อนที่จะเข้าถึงและตรวจสอบให้แน่ใจว่าคุณใช้ดัชนีที่ถูกต้อง
List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
if (list.size() > 3) {
   System.out.println(list.get(3));
} else {
   System.out.println("You are using the Index which is out of bounds");
}

วิธีแก้ไข IOException

สถานการณ์จำลอง:การดำเนินการอินพุต/เอาต์พุตล้มเหลวเนื่องจากไม่สามารถเข้าถึงไฟล์ได้
try {
   File inputFile = new FileReader("pqr.txt");
   BufferedReader reader = new BufferedReader(inputFile);
   String line = reader.readLine();
   System.out.println(line);
} catch (IOException e) {
   e.printStackTrace();
}
วิธีแก้ไข:จัดการข้อผิดพลาด I/O และตรวจสอบให้แน่ใจว่าทรัพยากรปิดอย่างถูกต้อง
File inputFile = new File("pqr.txt");

if (!inputFile.exists() || !inputFile.canRead()) {
 System.out.println("The input file is missing or not readable.");
 return;
}

try {
BufferedReader reader = new BufferedReader(inputFile);
 String line = reader.readLine();
 System.out.println(line);
  reader.close();
} catch (IOException e) {
 e.printStackTrace();
}
โปรดทราบว่าอีกทางเลือกหนึ่ง เราสามารถใช้ คุณสมบัติ try-with-resourceที่นำมาใช้ใน Java 7 เพื่อปิดทรัพยากรโดยอัตโนมัติดังที่แสดงด้านล่าง เราสามารถประกาศทรัพยากรตั้งแต่หนึ่งรายการขึ้นไปใน คำสั่ง tryและ Java จะปิดทรัพยากรโดยอัตโนมัติเมื่อสิ้นสุดบล็อก ไม่ว่าบล็อกจะเสร็จสมบูรณ์ตามปกติหรือมีข้อยกเว้นเกิดขึ้นก็ตาม
try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) {
....
} catch {
....
}

วิธีแก้ไข FileNotFoundException.mq4

สถานการณ์สมมติ:ไม่พบไฟล์ในตำแหน่งที่ระบุ
try {
     BufferedReader reader = new BufferedReader(new FileReader("abc.txt"));
     String line = reader.readLine();
     System.out.println(line);
     reader.close();
} catch (FileNotFoundException | IOException e) {
     System.out.println("An error has occurred while reading the file: " + e.getMessage());
}
วิธีแก้ไข:ตรวจสอบให้แน่ใจว่ามีไฟล์อยู่และคุณมีสิทธิ์ที่เหมาะสมในการเข้าถึงไฟล์นั้น
try {
    File file = new File("abc.txt");
    if(!file.exists()) {
    throw new FileNotFoundException("File not found at the specified location");
    }
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = reader.readLine();
    System.out.println(line);
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

วิธีการแก้ไข NoSuchMethodException.dll

สถานการณ์:หากคุณกำลังพยายามเข้าถึงวิธีการที่ไม่พบ
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass obj = new TestClass();
Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodException
วิธีแก้ไข:ตรวจสอบว่ามีวิธีการอยู่และชื่อวิธีการและลายเซ็นต์นั้นถูกต้อง
public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass  obj = new TestClass();
try {
    Method method = obj.getClass().getMethod("sayHello");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

วิธีการแก้ไข ConcurrentModificationException

สถานการณ์จำลอง:คอลเลกชันเปลี่ยนแปลงในขณะที่กำลังวนซ้ำ
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
for (String str : list) {
  list.remove(str);  // Это вызовет ConcurrentModificationException
}
วิธีแก้ไข:ใช้ตัววนซ้ำเพื่อวนซ้ำคอลเลกชันและแก้ไขโดยใช้วิธีตัววนซ้ำ
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    iterator.remove();
}
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION