1. การจัดการเหตุการณ์
ในความเป็นจริงชื่อของการประมวลผลเหตุการณ์เป็นความคิดตามธรรมชาติของกลไกการตอบสนองข้อความใน MFC เท่าที่ฉันเข้าใจพวกเขาควรได้รับการพิจารณาว่าเป็นสถานการณ์ของส้มใต้และส้มเหนือ ฉันสงสัยว่า "ขวดใหม่" ของการประมวลผลเหตุการณ์ใน Java ควรเป็นการตอบกลับข้อความใน MFC
"เหตุการณ์" ที่เรียกว่าเป็นการเปลี่ยนแปลงเช่นคีย์คีย์บอร์ดการคลิกเมาส์ ฯลฯ ซึ่งทำให้สถานะบางอย่างเปลี่ยนแปลงเนื่องจากการกระทำหรือสิ่งที่ต้องตอบสนองตามนั้น เราสามารถแบ่งกิจกรรมใน Java เป็นหลายหมวดหมู่: ปุ่ม, เมาส์, แป้นพิมพ์, หน้าต่างและกิจกรรมอื่น ๆ
รูปแบบการประมวลผลเหตุการณ์
1. รูปแบบการประมวลผลเหตุการณ์ที่สืบทอดมา (JDK1.0)
ใน JDK1.0 การประมวลผลเหตุการณ์ขึ้นอยู่กับการสืบทอด เหตุการณ์จะถูกส่งไปยังส่วนประกอบก่อนแล้วเผยแพร่ขึ้นไปตามระดับคอนเทนเนอร์ เหตุการณ์ที่ไม่ได้ประมวลผลโดยส่วนประกอบจะดำเนินการต่อไปโดยอัตโนมัติเพื่อเผยแพร่ไปยังคอนเทนเนอร์ของส่วนประกอบ -ดูเหมือนว่าจะสอดคล้องกับคำสั่งตอบสนองเหตุการณ์ดั้งเดิมหรือกลไกการตอบสนองแบบ polymorphic ใน MFC และกลไกการประมวลผลเหตุการณ์ตามพร็อกซีที่กล่าวถึงในภายหลังดูเหมือนว่าจะสอดคล้องกับกลไกการโทรกลับ MFC
วิธีการรักษาเฉพาะ
เรียกเมธอด action () หรือ handleEvent () เพื่อรับเหตุการณ์ที่เกิดขึ้นเมื่อโปรแกรมกำลังทำงานและเหตุการณ์ทั้งหมดที่เกิดขึ้นในส่วนประกอบจะได้รับการจัดการในวิธีนี้
2. รูปแบบการประมวลผลเหตุการณ์ที่ใช้ตัวแทน (JDK1.1)
ในรุ่นนี้เหตุการณ์จะถูกส่งโดยตรงไปยังส่วนประกอบที่สร้างเหตุการณ์นี้
สำหรับแต่ละองค์ประกอบหนึ่งคลาสหรือมากกว่าที่เรียกว่าผู้ฟังจะลงทะเบียนซึ่งมีตัวจัดการเหตุการณ์ที่ได้รับและประมวลผลเหตุการณ์นี้
ผู้ฟังเป็นคลาสที่ใช้อินเทอร์เฟซผู้ฟัง เหตุการณ์เป็นวัตถุที่รายงานเฉพาะผู้ฟังที่ลงทะเบียน แต่ละเหตุการณ์มีอินเทอร์เฟซผู้ฟังที่สอดคล้องกัน
เมื่อคลิกที่วัตถุปุ่มด้วยเมาส์เหตุการณ์ ActionEvent จะถูกส่ง กิจกรรม ActionEvent นี้จะได้รับโดยวิธีการ ActionPerformed () ของ ActionListener ทั้งหมดที่ลงทะเบียนโดยใช้วิธี AddactionListener ()
คุณสมบัติของรูปแบบการประมวลผลเหตุการณ์ที่ใช้ตัวแทน①เหตุการณ์จะไม่ถูกประมวลผลโดยไม่คาดคิด ในแบบจำลองลำดับชั้นเหตุการณ์อาจเผยแพร่ไปยังคอนเทนเนอร์และประมวลผลในระดับที่ไม่คาดคิด
②เป็นไปได้ที่จะสร้างและใช้คลาสอะแดปเตอร์เพื่อจำแนกการกระทำของเหตุการณ์
③มันเอื้อต่อการแจกจ่ายงานให้กับหมวดหมู่ต่างๆ
มุ่งเน้นไปที่การเรียนรู้รูปแบบการประมวลผลเหตุการณ์นี้
3. เหตุการณ์
องค์ประกอบสามประการของการประมวลผลเหตุการณ์
(1) แหล่งที่มาของเหตุการณ์แหล่งที่มาของเหตุการณ์คือเครื่องกำเนิดของเหตุการณ์เช่นปุ่ม, windows และฟิลด์ข้อความ
(2) ประเภทเหตุการณ์เหตุการณ์ทั้งหมดใน Java ถูกห่อหุ้มไว้ในชั้นเรียนและคลาสเหตุการณ์เหล่านี้มีความเข้มข้นในแพ็คเกจ java.awt.event คลาสเหตุการณ์ทั้งหมดสืบทอดเมธอด Awtevent และวิธีการ - GetSouce () ซึ่งส่งคืนวัตถุที่เกิดเหตุการณ์
(3) หลังจากเหตุการณ์ประเภทต่าง ๆ เกิดขึ้นในผู้ฟังเหตุการณ์ผู้ฟังเหตุการณ์จะได้รับเหตุการณ์และเรียกใช้วิธีการประมวลผลเหตุการณ์ที่เกี่ยวข้อง ผู้ฟังเหตุการณ์ทั้งหมดเป็นอินเทอร์เฟซในแพ็คเกจ java.awt.event แนะนำอินเทอร์เฟซ java.util.eventListener ผู้ฟังประเภทเหตุการณ์ที่แตกต่างกันมีวิธีการที่แตกต่างกัน
ขั้นตอนการประมวลผลเหตุการณ์①โปรแกรมเพิ่มแพ็คเกจ java.awt.event:
นำเข้า java.awt.event;
②ลงทะเบียนผู้ฟังเหตุการณ์สำหรับวัตถุแหล่งที่มาที่ต้องการ:
Object Source Event.AddxxxListener (xxxlistener);
③ใช้วิธีการที่สอดคล้องกัน หากอินเทอร์เฟซผู้ฟังมีหลายวิธีคุณต้องใช้ตัวอย่างทั้งหมด: B2.AddactionListener (นี้)
4. อะแดปเตอร์เหตุการณ์ (อะแดปเตอร์)
ภาระงานของการใช้วิธีการทั้งหมดของอินเทอร์เฟซผู้ฟังแต่ละตัวนั้นสูงมาก เพื่อความสะดวกภาษา Java ให้คลาสอะแดปเตอร์เพื่อใช้คลาสที่มีหลายวิธี
ผู้ฟังที่คุณกำหนดสามารถสืบทอดคลาสอะแดปเตอร์และแทนที่วิธีที่คุณต้องการ
ตัวอย่างเช่นผู้ฟังที่สอดคล้องกับเหตุการณ์หน้าต่างคือ WindowListener ซึ่งจะต้องใช้หลายวิธีรวมถึง windowopened (), windowclosed (), windowclosing (), windowiConfied (), windowdeiconfied (), windowActivated () และ windowdeactivated ()
หากคุณสืบทอด WindowAdapter คุณจะต้องใช้วิธีหนึ่งหรือหลายวิธีเท่านั้นและคุณไม่จำเป็นต้องใช้วิธีการทั้งหมด ตัวอย่างต่อไปนี้จำนวนมากใช้วิธีเดียวของการปิดกั้น windowclosing () โดยมีวัตถุประสงค์เพื่อออกจากระบบเมื่อปิดหน้าต่าง
4.1 การจัดการเหตุการณ์ปุ่ม
เหตุการณ์ที่เกิดขึ้นเมื่อคลิกปุ่มเป็นเหตุการณ์การดำเนินการ คลาสเหตุการณ์ที่สอดคล้องกับเหตุการณ์การดำเนินการคือคลาส ActionEvent ผู้ฟังเหตุการณ์ที่สอดคล้องกับเหตุการณ์การดำเนินการคือ: ActionListener
วิธีการหลักของผู้ฟัง:
ActionPerformed (ActionEvent E) โครงการดำเนินการที่เรียกว่าเมื่อมีเหตุการณ์การดำเนินการเกิดขึ้น:
ขั้นตอนแรกคือการลงทะเบียน Action Event Listener AddactionListener (ActionListener)
ขั้นตอนที่สองคือการใช้วิธีการอินเตอร์เฟส ActionListener: ActionPerformed (ActionEvent E)
4.2 การจัดการเหตุการณ์เมาส์
แหล่งที่มาของเหตุการณ์ที่ทริกเกอร์เหตุการณ์เมาส์มักจะเป็นคอนเทนเนอร์ เมื่อเมาส์เข้าหรือออกจากคอนเทนเนอร์หรือคลิกเมาส์ลากเมาส์ ฯลฯ ในคอนเทนเนอร์เหตุการณ์เมาส์จะเกิดขึ้น คลาสเหตุการณ์ที่สอดคล้องกับเหตุการณ์เมาส์คือคลาส MouseEvent
วิธีการในคลาส MouseEvent:
getx () ได้รับ x พิกัดของเมาส์
gety () ได้รับการพิกัด y ของเมาส์
getPoint () ได้รับตำแหน่งเมาส์และเหตุการณ์เมาส์สอดคล้องกับผู้ฟังเหตุการณ์สองคน: Mouselistener (หรือ Mouseadapter) สอดคล้องกับเหตุการณ์เมาส์และ MousemotionListener (หรือ Mousemotionadapter) สอดคล้องกับเหตุการณ์การเคลื่อนไหวของเมาส์
วิธีหลักของ Mouselistener (หรือ Mouseadapter)
Mousepressed (MouseEvent E) วิธีจัดการกับการกดเมาส์
Mouseerleased (MouseEvent E) วิธีจัดการการปล่อยเมาส์
Mouseentered (MouseEvent E) วิธีจัดการเมาส์เมื่อเข้าสู่
MouseExited (MouseEvent E) วิธีจัดการกับเมาส์เมื่อออกเดินทาง
Mouseclicked (MouseEvent e) วิธีจัดการกับการคลิกเมาส์
วิธีการหลักของ MousemotionListener (หรือ Mousemotionadapter)
MouseMoved (MouseEvent E) วิธีจัดการเมาส์เมื่อเคลื่อนที่
mousedraged (MouseEvent e) วิธีจัดการการลากเมาส์
4.3 การจัดการกิจกรรมคีย์บอร์ด
เมื่อกดหรือปล่อยแป้นพิมพ์ในส่วนประกอบที่มีการโฟกัสแป้นพิมพ์เหตุการณ์คีย์บอร์ดจะเกิดขึ้น คลาสเหตุการณ์ที่สอดคล้องกับเหตุการณ์แป้นพิมพ์คือคลาส KeyEvent
Keyevent Class Methods:
getKeyCode () ได้รับรหัสคีย์ที่จะกดหรือเผยแพร่
getKeyText () ได้รับสตริงของคีย์ที่กดหรือปล่อยออกมา ฟังเหตุการณ์ที่สอดคล้องกับเหตุการณ์แป้นพิมพ์คือ: keyListener หรือ keyadapter
วิธีหลัก:
Keypressed (KeyEvent E) วิธีจัดการเมื่อกดแป้นพิมพ์
Keyrelease (KeyEvent e) วิธีจัดการแป้นพิมพ์เมื่อปล่อยมัน
4.4 การจัดการเหตุการณ์หน้าต่าง
เฉพาะในกรณีที่มีหน้าต่างและคลาสที่ขยาย (เฟรม, กล่องโต้ตอบ) ฯลฯ สามารถเรียกเหตุการณ์หน้าต่างได้หรือไม่แสดงว่าหน้าต่างอยู่ในสถานะที่ใช้งานอยู่/ไม่ถูกต้องสถานะไอคอน/ไม่ใช่ไอคอนหรือสถานะเปิด/ปิด ฯลฯ คลาสที่สอดคล้องกันคือ windowevent
วิธีหลัก:
Windowopened (WindowEvent E) การจัดการเหตุการณ์ของหน้าต่างเปิด
Windowclosed (WindowEvent E) การจัดการเหตุการณ์ของหน้าต่างปิด
การปิดหน้าต่าง (WindowEvent E) การปิดการประมวลผลเหตุการณ์ของหน้าต่าง
การจัดการเหตุการณ์ของสถานะการเปิดใช้งาน WindowActivated (WindowEvent E)
การจัดการเหตุการณ์ของสถานะไม่ถูกต้องของ WindowDeactivated (WindowEvent E)
4.5 การจัดการกิจกรรมอื่น ๆ
4.5.1 คลาสเหตุการณ์สำหรับช่องทำเครื่องหมายและปุ่มตัวเลือกการประมวลผลเหตุการณ์คือรายการ:
ฟังเหตุการณ์ที่สอดคล้องกับเหตุการณ์ตัวเลือกคือ: itemListener
วิธี:
itemStateChanged (itemeVent E) ถูกเรียกเมื่อเหตุการณ์ตัวเลือกเกิดขึ้น 4.5.2 คลาสเหตุการณ์ที่สอดคล้องกับเหตุการณ์การปรับการประมวลผลเหตุการณ์ Scrollbar คือคลาส AdjustMentEvent:
ผู้ฟังเหตุการณ์ที่สอดคล้องกับเหตุการณ์การปรับคือ: adjustmentListener
วิธี:
AdjustMentValueChanged (AdjustMentEvent E) เรียกว่าเมื่อเหตุการณ์การปรับเกิดขึ้น
4.5.3 คลาสเหตุการณ์การประมวลผลเหตุการณ์ในรายการดรอปดาวน์คือ itemeVent:
ฟังเหตุการณ์ที่สอดคล้องกับเหตุการณ์ตัวเลือกคือ: itemListener
วิธี:
itemstatechanged (itemevent e) เรียกเมื่อมีการกระทำเกิดขึ้นในรายการดรอปดาวน์
(จะเห็นได้ว่าการประมวลผลเหตุการณ์ของรายการดรอปดาวน์นั้นเหมือนกับประเภทของเหตุการณ์ผู้ฟังเหตุการณ์และวิธีการเช่นการประมวลผลเหตุการณ์ของช่องทำเครื่องหมายประเภทเหตุการณ์ผู้ฟังเหตุการณ์และวิธีการประมวลผลเหตุการณ์ของกล่องวิทยุ)
4.5.4 การจัดการกิจกรรมเมนูกิจกรรมโดยทั่วไปเป็นเหตุการณ์ที่เกิดขึ้นเมื่อเราคลิกที่รายการเมนู
รายการเมนูมีสองประเภท:
เหตุการณ์การกระทำของ Menuitem
ช่องทำเครื่องหมาย
ขั้นตอนแรกในการประมวลผลเหตุการณ์ของ Menuitem คือการลงทะเบียน Action Event Listener AddactionListener (ActionListener) สำหรับรายการเมนู Menuitem ทั้งหมด
ขั้นตอนที่สองคือการใช้วิธีการของอินเทอร์เฟซ ActionListener: ActionPerformed (ActionEvent E) ในวิธีนี้ให้ใช้ e.getSource () เพื่อรับรายการเมนูที่ผู้ใช้เลือกและดำเนินการประมวลผลที่สอดคล้องกัน
ขั้นตอนแรกในการจัดการเหตุการณ์ของ CheckBoxMenuitem คือการลงทะเบียนตัวเลือกเหตุการณ์ผู้ฟังสำหรับรายการเมนู CheckMenuitem ทั้งหมดไปยัง AddItemListener (itemListener)
ขั้นตอนที่สองคือการใช้วิธีการอินเตอร์เฟส itemListener: itemStateChanged (itemeVent E) ในวิธีนี้ให้ใช้ e.getSource () เพื่อรับรายการเมนูที่เลือกโดยผู้ใช้ E.GetItem () เพื่อรับฉลากของรายการเมนูที่เลือกโดยผู้ใช้และ E.GetStateChange () เพื่อให้ได้ว่าจะถูกเลือกและดำเนินการประมวลผลที่สอดคล้องกัน
2. การจัดการข้อยกเว้น
ไม่มีภาษาการเขียนโปรแกรมที่ดีหรือโปรแกรมเมอร์จะเพิกเฉยต่อการจัดการข้อยกเว้น ในฐานะที่เป็นภาษาการเขียนโปรแกรมเชิงวัตถุที่ได้รับความนิยม Java กลไกการจัดการข้อยกเว้นเป็นหนึ่งในคุณสมบัติที่สำคัญตามธรรมชาติ
โดยทั่วไปการพูดข้อยกเว้นถูกอธิบายว่า: ข้อผิดพลาดในการเขียนโปรแกรม อย่างไรก็ตามในความเป็นจริงข้อผิดพลาดนี้บ่อยมากมีหลายชนิดเช่น: ข้อผิดพลาดในการรวบรวมและข้อผิดพลาดในการดำเนินการ (โดยเฉพาะจะถูกแบ่งออกเป็น: ข้อผิดพลาดในการทำงานของระบบและข้อผิดพลาดในการดำเนินการเชิงตรรกะ
ใน Java ข้อยกเว้นคือคลาสที่สืบทอดมาจากชั้นเรียนที่โยนได้ แต่ละคลาสข้อยกเว้นแสดงถึงข้อผิดพลาดการเรียกใช้ (หมายเหตุ: เป็นข้อผิดพลาดรัน) คลาสข้อยกเว้นมีข้อมูลเกี่ยวกับข้อผิดพลาดในการดำเนินการและวิธีการจัดการข้อผิดพลาด
กลไกการจัดการข้อยกเว้น Java:
เมื่อใดก็ตามที่เกิดข้อผิดพลาดในการเรียกใช้งานที่สามารถระบุได้ในระหว่างการดำเนินการโปรแกรม Java (นั่นคือเมื่อข้อผิดพลาดมีคลาสข้อยกเว้นที่สอดคล้องกับมัน) ระบบจะสร้างวัตถุที่สอดคล้องกันของคลาสข้อยกเว้น (หมายเหตุ: มันเรียกว่าการสร้างวัตถุคลาสข้อยกเว้น) นั่นคือข้อยกเว้นถูกสร้างขึ้น
เมื่อมีการสร้างวัตถุข้อยกเว้นแล้วจะต้องมีกลไกที่สอดคล้องกันในระบบเพื่อจัดการเพื่อให้แน่ใจว่าจะไม่มีการล่มลูปที่ตายแล้วหรือความเสียหายอื่น ๆ ต่อระบบปฏิบัติการจึงมั่นใจได้ว่าการรักษาความปลอดภัยของการทำงานของโปรแกรมทั้งหมด
ข้อยกเว้นและคลาสข้อยกเว้น:
ข้อผิดพลาด: สร้างและโยนโดยเครื่องเสมือน Java และโปรแกรม Java ไม่ได้จัดการ
ข้อยกเว้นรันไทม์ (ข้อผิดพลาดของระบบเช่น 0, ตัวห้อยอาร์เรย์เกินช่วง): ตรวจพบโดยระบบโปรแกรม Java ของผู้ใช้ไม่สามารถประมวลผลได้และระบบส่งไปยังตัวจัดการข้อยกเว้นเริ่มต้น (หมายเหตุ: มีการจัดการข้อยกเว้นเริ่มต้น)
ข้อยกเว้น (ปัญหาในโปรแกรมที่คาดการณ์ได้): คอมไพเลอร์ Java กำหนดให้โปรแกรม Java ต้องจับหรือประกาศข้อยกเว้นที่ไม่ใช่ตามกฎหมายทั้งหมดที่ผู้ใช้สร้างข้อยกเว้นของตนเอง
ตัวสร้างคลาสข้อยกเว้น:
ข้อยกเว้นสาธารณะ ();
ข้อยกเว้นสาธารณะ (String s); สามารถยอมรับข้อมูลที่ส่งผ่านโดยพารามิเตอร์สตริงซึ่งมักจะเป็นคำอธิบายของข้อผิดพลาดที่สอดคล้องกับข้อยกเว้น
คลาสข้อยกเว้นยังสืบทอดหลายวิธีจากพ่อที่ขว้างได้ซึ่งเป็นวิธีที่ใช้กันทั่วไปคือ:
1) Public String ToString ();
เมธอด toString () ส่งคืนสตริงที่อธิบายข้อมูลคลาสข้อยกเว้นปัจจุบัน
2) โมฆะสาธารณะ printstacktrace ();
วิธี PrintStackTrace () ไม่มีค่าส่งคืน ฟังก์ชั่นของมันคือการดำเนินการพิมพ์และพิมพ์แทร็กการใช้งานสแต็กของวัตถุข้อยกเว้นปัจจุบันบนเอาต์พุตมาตรฐานปัจจุบัน (โดยปกติแล้วหน้าจอ) นั่นคือโปรแกรมเรียกว่าวัตถุหรือคลาสเพื่อดำเนินการวิธีการเพื่อให้วัตถุข้อยกเว้นนี้ถูกสร้างขึ้นระหว่างการดำเนินการ
ข้อยกเว้นการดำเนินการที่กำหนดโดยระบบ
ระบบย่อยเหล่านี้บางส่วนถูกกำหนดล่วงหน้าโดยระบบและรวมอยู่ในไลบรารีคลาส Java และเรียกว่าข้อยกเว้นการดำเนินการที่กำหนดระบบที่กำหนดไว้
ข้อยกเว้นที่ผู้ใช้กำหนด
สำหรับข้อผิดพลาดในการใช้งานที่ไม่ซ้ำกับแอปพลิเคชันบางอย่างโปรแกรมเมอร์จำเป็นต้องสร้างคลาสข้อยกเว้นที่ผู้ใช้กำหนดและวัตถุข้อยกเว้นในโปรแกรมผู้ใช้ตามตรรกะพิเศษของโปรแกรม ข้อยกเว้นที่ผู้ใช้กำหนดมักจะใช้เป็นคลาสพาเรนต์ของคลาสข้อยกเว้น อย่างไรก็ตามมีปัญหาที่ยังไม่เข้าใจ: ระบบรู้ได้อย่างไรว่ามีข้อผิดพลาดเกิดขึ้นและเป็นที่รู้จัก? วิธีการสร้างวัตถุคลาสข้อยกเว้นที่สอดคล้องกัน? คุณจะรู้วิธีแก้ไขวัตถุคลาสข้อยกเว้นได้อย่างไรโดยใช้วิธีการที่เกี่ยวข้อง แต่ละวัตถุคลาสยกเว้นที่จัดการข้อยกเว้นที่เกี่ยวข้องมีวิธีการจัดการข้อยกเว้นเพียงวิธีเดียวหรือไม่? ------------------------------------------------------------------------------------
เมื่อสร้างข้อยกเว้นที่ผู้ใช้กำหนดโดยทั่วไปจะต้องใช้งานต่อไปนี้:
1) ประกาศคลาสข้อยกเว้นใหม่เพื่อให้ใช้คลาสข้อยกเว้นหรือคลาสข้อยกเว้นระบบอื่น ๆ ที่มีอยู่หรือข้อยกเว้นผู้ใช้เป็นคลาสหลัก
2) กำหนดคุณลักษณะและวิธีการสำหรับคลาสข้อยกเว้นใหม่หรือโอเวอร์โหลดแอตทริบิวต์และวิธีการของคลาสแม่เพื่อให้แอตทริบิวต์และวิธีการเหล่านี้สามารถสะท้อนข้อมูลข้อผิดพลาดที่สอดคล้องกับคลาส
ข้อยกเว้นโยน
หากโปรแกรม Java ทำให้เกิดข้อผิดพลาดที่สามารถระบุตัวตนได้เมื่อรันมันจะสร้างวัตถุของคลาสข้อยกเว้นที่สอดคล้องกับข้อผิดพลาด กระบวนการนี้เรียกว่าการขว้างข้อยกเว้น
จริง ๆ แล้วมันกำลังโยนอินสแตนซ์ของวัตถุคลาสยกเว้นที่สอดคล้องกัน
ขึ้นอยู่กับคลาสข้อยกเว้นมีสองวิธีในการโยนข้อยกเว้น: ระบบการขว้างอัตโนมัติและการขว้างของผู้ใช้:
1. ระบบจะโยนออกโดยอัตโนมัติ
ระบบข้อผิดพลาดการดำเนินการที่กำหนดไว้จะถูกส่งโดยระบบโดยอัตโนมัติ
2. ผู้ใช้โยน
ข้อยกเว้นที่ผู้ใช้กำหนดไม่สามารถถูกโยนโดยระบบโดยอัตโนมัติ แต่ต้องถูกโยนโดยผู้ใช้ในคำสั่ง Java ในคำสั่ง Java คำสั่งการโยนใช้เพื่อโยน "ข้อยกเว้น" อย่างชัดเจน
ชื่อวิธีการพิมพ์ชื่อเมธอด (รายการพารามิเตอร์) ในรูปแบบโยนรายการของชื่อคลาสข้อยกเว้นที่จะโยน {
-
โยนอินสแตนซ์ของคลาสข้อยกเว้น; // หมายเหตุที่นี่ ...
-
สังเกต:
1) โดยทั่วไปข้อยกเว้นจะถูกโยนลงเมื่อพบเงื่อนไขบางอย่างในโปรแกรม
มักจะใส่คำสั่งการโยนในสาขา IF ของคำสั่ง IF
ถ้า (i> 100)
โยน (ใหม่ myexception ());
2) สำหรับวิธีการที่มีคำสั่งโยนชิ้นส่วนต่อไปนี้ควรเพิ่มลงในคำจำกัดความส่วนหัวของวิธีการ:
โยนรายการชื่อคลาสข้อยกเว้นที่จะโยน นี่คือส่วนใหญ่เพื่อแจ้งวิธีการบนเพื่อเรียกวิธีนี้และเพื่อเตรียมที่จะยอมรับและจัดการข้อยกเว้นที่อาจโยนในระหว่างการรันไทม์ หากมีคำสั่งการโยนมากกว่าหนึ่งคำในวิธีการข้อยกเว้นที่เป็นไปได้ทั้งหมดควรแสดงรายการในการโยนส่วนหัวของเมธอด
3) ภาษา Java ต้องการให้ทุกคลาสที่ประกาศด้วยคำหลักและวัตถุที่โยนด้วยการโยนต้องเป็นคลาสที่สามารถโยนได้หรือคลาสย่อย หากคุณพยายามโยนวัตถุที่ไม่สามารถโยนได้คอมไพเลอร์ Java จะรายงานข้อผิดพลาดข้อผิดพลาด:
พิจารณาวิธีการจับข้อยกเว้นเป็นหลักวิธีกระโดดหลังจากจับข้อยกเว้นและวิธีการเขียนคำสั่งจัดการข้อยกเว้น
1. ลอง…จับ…ในที่สุดบล็อก
1) ลอง
{} ในคำสั่งลองมีส่วนหนึ่งของรหัสโปรแกรมที่อาจโยนข้อยกเว้นอย่างน้อยหนึ่งข้อ รหัสเหล่านี้ระบุช่วงของข้อยกเว้นที่สามารถจับได้โดยบล็อกจับหลังจากนั้น
หากข้อยกเว้นเกิดขึ้นเมื่อโปรแกรม Java วิ่งลงในคำสั่งในบล็อกลองมันจะไม่ดำเนินการต่อไปในการเรียกใช้คำสั่งอื่น ๆ ในบล็อกลองอีกต่อไป แต่เข้าสู่บล็อกจับโดยตรงเพื่อค้นหาประเภทข้อยกเว้นที่ตรงกันครั้งแรก
2) จับบล็อก
พารามิเตอร์ของคำสั่ง Catch นั้นคล้ายกับคำจำกัดความของวิธีการรวมถึงประเภทข้อยกเว้นและวัตถุข้อยกเว้น
ประเภทข้อยกเว้นจะต้องเป็นคลาสย่อยของคลาสที่สามารถขยายได้ซึ่งระบุประเภทข้อยกเว้นที่จัดการโดยคำสั่ง Catch;
วัตถุข้อยกเว้นคือรหัสวิธีการสำหรับการจัดการวัตถุข้อยกเว้นในการจัดฟันโค้งที่ถูกโยนโดยระบบรันไทม์ Java ในบล็อกรหัสโปรแกรมที่ระบุโดยการลอง
อาจมีคำสั่งจับหลายรายการที่จัดการกับข้อยกเว้นประเภทต่าง ๆ แยกกัน
ระบบรันไทม์ Java ตรวจพบประเภทข้อยกเว้นที่ประมวลผลโดยแต่ละคำสั่งจับจากบนลงล่างจนกว่าจะพบคำสั่งจับที่ตรงกับมัน
ที่นี่การจับคู่ประเภทหมายความว่าประเภทข้อยกเว้นในการจับนั้นเหมือนกับประเภทของวัตถุข้อยกเว้นที่สร้างขึ้นหรือคลาสพาเรนต์ของวัตถุข้อยกเว้น ดังนั้นลำดับการเรียงลำดับของคำสั่งจับควรมาจากพิเศษถึงทั่วไป (คิดว่าทำไม?)
3) ในที่สุดบล็อก
คำแถลงในที่สุดอาจกล่าวได้ว่าเป็นกลไกการทำความสะอาดที่มีให้สำหรับเหตุการณ์การจัดการข้อยกเว้น โดยทั่วไปจะใช้เพื่อปิดไฟล์หรือปล่อยทรัพยากรระบบอื่น ๆ คำแถลงการลองจับในรอบสุดท้ายอาจมีคำสั่งที่มีส่วนในที่สุด
หากไม่มีส่วนหนึ่งในที่สุดเมื่อรหัสโปรแกรมที่ระบุโดยลองโยนข้อยกเว้นรหัสโปรแกรมอื่นจะไม่ถูกเรียกใช้
หากมีส่วนหนึ่งในที่สุดไม่ว่าจะมีข้อยกเว้นเกิดขึ้นในบล็อกลองหรือไม่ว่าจะมีการดำเนินการส่วนที่จับได้หรือไม่
จะเห็นได้ว่าในที่สุดส่วนหนึ่งของคำสั่งให้ทางออกแบบครบวงจรสำหรับการจัดการข้อยกเว้น
ข้อยกเว้นหลายข้อสามารถสร้างข้อยกเว้นที่แตกต่างกันหลายอย่างและหากคุณต้องการใช้วิธีการต่าง ๆ เพื่อจัดการกับข้อยกเว้นเหล่านี้คุณต้องใช้กลไกการจัดการข้อยกเว้นหลายอย่าง
การประมวลผลข้อยกเว้นหลายรายการทำได้โดยการกำหนดบล็อกการจับหลายครั้งหลังจากลองบล็อก แต่ละบล็อกจับจะใช้เพื่อรับและประมวลผลวัตถุข้อยกเว้นเฉพาะ ผ่านพารามิเตอร์ของ Catch Block จะกำหนดว่าวัตถุข้อยกเว้นควรเป็นข้อยกเว้นที่ได้รับและประมวลผลโดยบล็อกจับนี้หรือไม่
ได้รับบล็อกใด ตามการจับคู่ของพารามิเตอร์ข้อยกเว้นของวัตถุข้อยกเว้นและบล็อกจับ: เมื่อพวกเขาตรงตามเงื่อนไขสามประการต่อไปนี้วัตถุข้อยกเว้นและพารามิเตอร์จะถูกพิจารณาให้ตรงกัน:
1) วัตถุข้อยกเว้นเป็นของคลาสข้อยกเว้นเดียวกับพารามิเตอร์
2) วัตถุข้อยกเว้นเป็นของคลาสย่อยของคลาสข้อยกเว้นพารามิเตอร์
3) วัตถุข้อยกเว้นใช้อินเตอร์เฟสที่กำหนดโดยพารามิเตอร์
หากวัตถุข้อยกเว้นที่สร้างขึ้นโดยบล็อกลองได้รับจากบล็อกการจับครั้งแรกโฟลว์ของโปรแกรมจะข้ามไปยังบล็อกคำสั่ง Catch นี้โดยตรง หลังจากดำเนินการบล็อกคำสั่งวิธีการปัจจุบันจะออก ข้อความที่ไม่ได้ดำเนินการในบล็อกลองและบล็อกจับอื่น ๆ จะถูกละเว้น หากวัตถุข้อยกเว้นที่สร้างขึ้นโดยบล็อกลองไม่ตรงกับบล็อกจับแรกระบบจะไปที่บล็อกจับที่สองโดยอัตโนมัติสำหรับการจับคู่ หากที่สองยังไม่ตรงกันมันจะเปลี่ยนเป็นที่สามสี่ ... จนกว่าจะมีการจับบล็อกที่สามารถรับวัตถุข้อยกเว้นได้และกระบวนการจะเสร็จสมบูรณ์
หากวัตถุข้อยกเว้นที่สร้างขึ้นโดยบล็อกลองได้รับจากบล็อกการจับครั้งแรกโฟลว์ของโปรแกรมจะข้ามไปยังบล็อกคำสั่ง Catch นี้โดยตรง หลังจากดำเนินการบล็อกคำสั่งวิธีการปัจจุบันจะออก ข้อความที่ไม่ได้ดำเนินการในบล็อกลองและบล็อกจับอื่น ๆ จะถูกละเว้น หากวัตถุข้อยกเว้นที่สร้างขึ้นโดยบล็อกลองไม่ตรงกับบล็อกจับแรกระบบจะไปที่บล็อกจับที่สองโดยอัตโนมัติสำหรับการจับคู่ หากที่สองยังไม่ตรงกันมันจะเปลี่ยนเป็นที่สามสี่ ... จนกว่าจะมีการจับบล็อกที่สามารถรับวัตถุข้อยกเว้นได้และกระบวนการจะเสร็จสมบูรณ์
หากการดำเนินการของคำสั่งทั้งหมดในบล็อกลองไม่ยกข้อยกเว้นบล็อกจับทั้งหมดจะถูกละเว้นและไม่ดำเนินการ
สังเกต:
1) คำสั่งในการจับบล็อกควรดำเนินการที่แตกต่างกันตามข้อยกเว้นที่แตกต่างกันดังนั้นเมื่อจัดการกับข้อยกเว้นหลายข้อคุณควรให้ความสนใจกับการออกแบบลำดับการจัดเรียงของแต่ละบล็อก โดยทั่วไปควรวางบล็อกที่เกี่ยวข้องกับข้อยกเว้นที่เฉพาะเจาะจงและทั่วไปมากขึ้นควรวางไว้ด้านหน้าในขณะที่บล็อกจับที่สามารถจับคู่ข้อยกเว้นหลายข้อควรวางไว้ด้านหลัง
/*ลองใช้ผู้ใช้เพื่อเรียกใช้การจัดการข้อผิดพลาดข้อผิดพลาด: ปัญหาคือสิ่งนี้ เมื่อค่าเริ่มต้นของเงินเดือนผู้ใช้ที่ป้อนน้อยกว่า 800 มันผิด แน่นอนถ้าการเปลี่ยนแปลงของเงินเดือนเกิน 20%ก็ผิด*/ นำเข้า java.awt.*; นำเข้า Java.applet.*; นำเข้า java.awt.event.*; ระดับสาธารณะ USERExceptionApplet ขยายแอปเพล็ตใช้แอ็คชั่น actionListener {ฉลากพรอมต์ 1 = ฉลากใหม่ ("โปรดป้อนชื่อของพนักงานและมูลค่าเริ่มต้นของเงินเดือน:"); ฉลากพรอมต์ 2 = ฉลากใหม่ ("โปรดป้อนเงินเดือนที่จะแก้ไข"); ชื่อฟิลด์ข้อความ, isal, nsal; สตริงผงชูรส; พนักงาน EMP; ปุ่ม okbtn = ปุ่มใหม่ ("ตกลง"); ปุ่มยกเลิก = ปุ่มใหม่ ("ยกเลิก"); โมฆะสาธารณะ init () {name = New TextField (5); ISAL = New TextField (5); NSAL = New TextField (5); เพิ่ม (พรอมต์ 1); เพิ่ม (ชื่อ); เพิ่ม (isal); เพิ่ม (พรอมต์ 2); เพิ่ม (nsal); เพิ่ม (okbtn); okbtn.addactionListener (นี่); cancelbtn.addactionListener (นี้); เพิ่ม (cancelbtn); } Public Void Paint (กราฟิก G) {G.DrawString (MSG, 0,80); } โมฆะสาธารณะ createMp (string empname, double sa) {ลอง {emp = พนักงานใหม่ (empname, sa); msg = สตริงใหม่ (emp.toString ()); } catch (unlushalaryException คือ) {msg = สตริงใหม่ (ise.toString ()); }} โมฆะสาธารณะ Changeempsal (การเปลี่ยนแปลงสองครั้ง) {ลอง {emp.setempsalary (การเปลี่ยนแปลง); msg = สตริงใหม่ (emp.toString ()); } catch (unlushalaryException illsal) {msg = สตริงใหม่ (illsal.toString ()); } catch (unldenalsalarychangeException illsalchange) {msg = สตริงใหม่ (emp.toString ()+illsalchange.toString ()); }} โมฆะสาธารณะ ActionPerformed (ActionEvent E) {string empname; empsal สองครั้งการเปลี่ยนแปลง; Object OBJ = E.getSource (); if (obj == okbtn) {empname = สตริงใหม่ (name.getText ()); ถ้า (empname == null) {msg = สตริงใหม่ ("โปรดป้อนชื่อของพนักงานและเงินเดือนก่อนและสร้างมัน"); } if (nsal.getText () == null) {empsal = double.valueof (isal.getText ()). doubleValue (); createemp (empname, empsal); } else {change = double.valueof (nsal.getText ()). doubleValue (); Changeempsal (การเปลี่ยนแปลง); }} if (obj == cancelbtn) {naem.settext (""); isal.settext (""); nsal.settext (""); } repaint (); }} Class Employee {String M_EmpName; double m_empsalary; พนักงาน (ชื่อสตริง, สองครั้งเริ่มต้น) พ่นผิดกฎหมาย {m_empname = name; // ดูว่ามีปัญหาใด ๆ ที่นี่รหัสอ้างอิงคือ m_empname = สตริงใหม่ (ชื่อ); ถ้า (initsalary <800) {โยน (ใหม่ผิดกฎหมาย ExhalaryException (นี่, initsalary)); // คำสั่งโยน} m_empsalary = initsalary; } สตริงสาธารณะ getEmpName () {return m_empName; } สาธารณะ double getempsalary () {return m_empsalary; } บูลีนสาธารณะ setempsalary (double newsal) โยน islendalsalaryexception, unldenalsalarychangeException {ถ้า (Newsal <800) โยน (การผิดกฎหมายใหม่ (สิ่งนี้, Newsal)); อื่นถ้า (getempsalary () == 0.0) {m_empsalary = Newsal; กลับมาจริง; } อื่นถ้า (math.abs (newsal-getempsalary ())/getempsalary ()> = 0.2) โยน (ใหม่ผิดกฎหมาย ChangeException (นี่, Newsal-getempsalary ())); else {m_empsalary = Newsal; กลับมาจริง; }} สตริงสาธารณะ toString () {String S; s = "ชื่อ:"+m_empname+"เงินเดือน:"+m_empsalary; กลับ s; }} ชั้นเรียนผิดกฎหมาย Extrements ขยายข้อยกเว้น {พนักงานส่วนตัว m_concernedemp; m_illegalsalary ส่วนตัว การผิดกฎหมาย EMP (พนักงาน EMP, double isal) {super ("ค่าจ้างต่ำกว่าค่าแรงขั้นต่ำ"); m_concernedemp = emp; m_illegalsalary = isal; } public String toString () {String S; s = "ค่าจ้างที่ให้กับพนักงานเป็นสิ่งผิดกฎหมาย: พนักงาน:"+m_concernedemp.getempname ()+"เงินเดือนที่ผิดกฎหมาย:"+m_illegalsalary+"ต่ำกว่าค่าแรงต่ำสุดของ RMB 800"; กลับ s; }} คลาส unlderalsalarychangeException ขยายข้อยกเว้น {พนักงานส่วนตัว m_concernedemp; M_ILLEGALSALARYCHANGE ส่วนตัว unlendalsalarychangeException (พนักงาน EMP, double csal) {super ("การเปลี่ยนแปลงเงินเดือนมีขนาดใหญ่เกินไป"); m_concernedemp = emp; M_ILLEGALSALARYCHANGE = CSAL; } public String toString () {String S; S = "การเปลี่ยนแปลงค่าจ้างที่ให้กับพนักงานนั้นผิดกฎหมาย: พนักงาน:"+M_Concernedemp.getEmpName ()+"การเปลี่ยนแปลงการเปลี่ยนแปลงค่าจ้างที่ผิดกฎหมาย:"+M_ILLEGALSALARYCHANGE+"สูงกว่าเงินเดือนเดิม 20%"; กลับ s; -