วิธีแก้ไข ClassCastException ใน Java

Withi Kaekhi Classcastexception Ni Java



ใน Java, the “ ClassCastException ” ช่วยในการระบุปัญหาความเข้ากันได้ของประเภท ณ รันไทม์ โดยอนุญาตให้นักพัฒนาสามารถตรวจจับได้ตั้งแต่เนิ่นๆ ในขั้นตอนการพัฒนา นอกจากนี้ยังรับประกันความปลอดภัยของประเภท ป้องกันความไม่สอดคล้องกันในโปรแกรม ClassCastException ช่วยได้มากในขั้นตอนการดีบัก การทดสอบ การแคสต์ประเภทที่ถูกต้อง ฯลฯ

คู่มือนี้สาธิตขั้นตอนการแก้ไข ClassCastException ใน Java







ClassCastException เกิดขึ้นใน Java ได้อย่างไร

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



ตัวอย่างเช่น ไปที่โค้ดด้านล่างเกี่ยวกับ “ ClassCastException ” ในจาวา:



นำเข้า java.io.* ;
นำเข้า java.lang.* ;
นำเข้า java.util.* ;

ระดับ คำแนะนำลินุกซ์ {
// การสร้างคลาสไดรเวอร์
สาธารณะ คงที่ เป็นโมฆะ หลัก ( สตริง [ ] หาเรื่อง )
{
พยายาม {
วัตถุ พ่อแม่ = ใหม่ วัตถุ ( ) ;

สตริง เด็ก = ( สตริง ) พ่อแม่ ;
ระบบ . ออก . พิมพ์ ( เด็ก ) ;
}
จับ ( ข้อยกเว้น ) {
ระบบ . ออก . พิมพ์ ( ) ;
}
}
}

คำอธิบายของรหัสด้านบน:





  • ใน ' พยายาม ” บล็อก ตัวอย่างของวัตถุ “ พ่อแม่ ” ถูกประกาศโดยใช้ “ ใหม่ ' คำสำคัญ.
  • หลังจากนั้นจึงใช้การเรียงพิมพ์โดยที่ “ วัตถุ ” เป็นแบบ typecast และมีชื่อเป็น “ เด็ก '.
  • Typecasting นี้ละเมิดกฎที่ว่าคลาสพาเรนต์จะต้องไม่เป็น typecast กับคลาสย่อย นั่นคือเหตุผลที่ข้อยกเว้นเกิดขึ้นเนื่องจาก ' วัตถุ ” ประเภทคือคลาสพาเรนต์
  • ในที่สุด “ จับ ” บล็อกใช้ที่รับ “ ข้อยกเว้น ” เป็นพารามิเตอร์และพิมพ์ข้อความบนคอนโซล

หลังจากสิ้นสุดขั้นตอนการดำเนินการ:



ภาพรวมด้านบนแสดงการเกิดขึ้นของ ClassCastException ใน Java

วิธีแก้ไข ClassCastException ใน Java

มีการใช้วิธีแก้ปัญหาที่เป็นไปได้สามวิธีที่นักพัฒนาสามารถแก้ไขหรือหลีกเลี่ยงโอกาสที่จะเพิ่ม ' ClassCastException ” ในภาษาจาวา

โซลูชันเหล่านี้อธิบายแยกกันด้านล่าง:

โซลูชันที่ 1: การใช้ตัวดำเนินการ 'instanceof'

ตัวอย่าง ” โอเปอเรเตอร์ตรวจสอบว่า “ วัตถุ ” เป็นอินสแตนซ์ประเภทที่ต้องการหรือไม่ การตรวจสอบนี้ช่วยป้องกันการเกิด “ ClassCastException '. ตัวอย่างเช่น ไปที่บล็อกรหัสด้านล่าง:

สาธารณะ ระดับ TypeCheckingLinuxHint {
สาธารณะ คงที่ เป็นโมฆะ หลัก ( สตริง [ ] หาเรื่อง ) {

วัตถุ พ่อแม่ = 'ครอบครัว Linux Hint' ;
ถ้า ( พ่อแม่ ตัวอย่าง สตริง ) {
สตริง เด็ก = ( สตริง ) พ่อแม่ ;
ระบบ . ออก . พิมพ์ ( 'หลังจากพิมพ์ข้อความสตริง: ' + เด็ก ) ;
} อื่น {
ระบบ . ออก . พิมพ์ ( 'วัตถุเป็นตัวอย่างของประเภทสตริงที่ต้องการ' ) ;
}
}
}

คำอธิบายของรหัสด้านบน:

  • ประการแรก “ พ่อแม่ ” วัตถุถูกสร้างขึ้นซึ่งเริ่มต้นด้วยค่าจำลองภายใน “ พยายาม ' ปิดกั้น.
  • จากนั้นใช้ 'ถ้า' คำสั่งที่ “ ตัวอย่าง ” ตัวดำเนินการใช้เพื่อตรวจสอบอินสแตนซ์ของ “ พ่อแม่ ” วัตถุที่ต้องการ “ สตริง ' พิมพ์.
  • ต่อไป ถ้าเงื่อนไขกลับมา “ จริง ” การพิมพ์จะดำเนินการและแสดงบนคอนโซล
  • มิฉะนั้น ข้อความแสดงข้อผิดพลาดที่กำหนดเองจะแสดงบนคอนโซล

หลังจากสิ้นสุดขั้นตอนการดำเนินการ:

ภาพรวมแสดงให้เห็นว่าการ typecasting เสร็จสิ้นและ ClassCastException ได้รับการแก้ไขโดยใช้ ' ตัวอย่าง ” โอเปอเรเตอร์

แนวทางที่ 2: ตรวจสอบและแก้ไขการดำเนินการพิมพ์ดีด

วิธีแก้ไขอีกวิธีหนึ่งคือการตรวจสอบโค้ดหลายๆ ครั้งและตรวจสอบประเภทที่เข้ากันได้สำหรับการพิมพ์ ตัวอย่างเช่น เข้าไปที่โค้ดด้านล่างซึ่งมีเครื่องหมาย “ ClassCastException ” ถูกจับเนื่องจากประเภทที่ต้องการสำหรับการพิมพ์ไม่เข้ากัน:

สาธารณะ ระดับ ประเภทCheckLinuxHint {
สาธารณะ คงที่ เป็นโมฆะ หลัก ( สตริง [ ] หาเรื่อง ) {
วัตถุ พ่อแม่ = 'ครอบครัว Linux Hint' ;
จำนวนเต็ม แปลงจำนวน = ( จำนวนเต็ม ) พ่อแม่ ;
ระบบ . ออก . พิมพ์ ( 'หมายเลขหลังจากพิมพ์: ' + แปลงจำนวน ) ;
}
}

ในโค้ดข้างต้น โปรแกรมเมอร์โยน ' สตริง ' ถึง ' จำนวนเต็ม '.

หลังจากสิ้นสุดขั้นตอนการรวบรวม:

ภาพรวมด้านบนแสดงการเกิดขึ้นของ ClassCastException

แนวทางที่ 3: การใช้ Generics

โปรแกรมเมอร์สามารถใช้ “ ยาชื่อสามัญ ” เพื่อระบุประเภทที่คาดหวังและบังคับใช้ความปลอดภัยของประเภท ณ เวลารวบรวม

ตัวอย่างเช่น ไปที่รหัสด้านล่าง:

นำเข้า java.util.ArrayList ;
นำเข้า java.util.List ;

สาธารณะ ระดับ ใช้ Generics {
สาธารณะ คงที่ เป็นโมฆะ หลัก ( สตริง [ ] หาเรื่อง ) {
รายการ < สตริง > empName = ใหม่ รายการอาร์เรย์ <> ( ) ;
empName. เพิ่ม ( 'แฮร์รี่' ) ;
empName. เพิ่ม ( 'พอตเตอร์' ) ;

สตริง อักษรย่อ = empName. รับ ( 0 ) ;
สตริง สุดท้าย = empName. รับ ( 1 ) ;

ระบบ . ออก . พิมพ์ ( 'ชื่อจริง: ' + อักษรย่อ ) ;
ระบบ . ออก . พิมพ์ ( 'ชื่อที่สอง: ' + สุดท้าย ) ;
}
}

คำอธิบายของรหัสด้านบน:

  • อันดับแรก ยูทิลิตี้ที่จำเป็นจะถูกนำเข้าไปยังไฟล์ Java และคลาสของ “ ใช้ Generics ” มีการประกาศ
  • ต่อไป “ รายการอาร์เรย์ ” ประเภท “ สตริง ” ถูกประกาศด้วยชื่อ “ empName ” และเริ่มต้นโดยการจัดเตรียมองค์ประกอบข้อมูลจำลองสองรายการ
  • จากนั้นสร้างตัวแปรประเภทสตริงสองตัวชื่อ “ อักษรย่อ ' และ ' สุดท้าย '. หลังจากนั้นให้กำหนดค่าโดยการเข้าถึงหมายเลขดัชนี
  • ในตอนท้ายให้แสดงตัวแปรทั้งสองเพื่อดูผลลัพธ์

หลังจากสิ้นสุดการดำเนินการ ผลลัพธ์จะมีลักษณะดังนี้:

สแน็ปช็อตด้านบนแสดงให้เห็นว่าการเรียงพิมพ์ได้ดำเนินการโดยใช้ชื่อสามัญ

บทสรุป

เพื่อแก้ปัญหา “ ClassCastException ” ใน Java โปรแกรมเมอร์ต้องตรวจสอบความเข้ากันได้ของประเภทที่เหมาะสม การใช้ “ ยาชื่อสามัญ ' และ ' ตัวอย่าง ” โอเปอเรเตอร์ เพื่อแก้ไขข้อยกเว้น โปรแกรมเมอร์ต้องตรวจทานและแก้ไขการดำเนินการแคสต์โดยตรวจสอบความเข้ากันได้ของประเภทที่เหมาะสม นอกจากนี้ “ ClassCastException ” สามารถหลีกเลี่ยงได้โดยใช้ “ ยาชื่อสามัญ ” และด้วยการใช้ “ ตัวอย่าง ” โอเปอเรเตอร์ คู่มือนี้ได้แสดงวิธีการแก้ไข ClassCastException ใน Java