ฉันได้เรียนรู้กลไกข้อยกเว้นในช่วงสองวันที่ผ่านมา ซึ่งการพยายาม...จับ...ในที่สุดก็เป็นส่วนสำคัญในความคิดของฉัน เกี่ยวกับข้อความที่ฉันได้เรียนรู้ก่อนหน้านี้ ฉันพบปัญหาที่น่าสนใจในการคืนสินค้าและสุดท้าย จากการทดลอง ฉันพบว่าภาษาคอมพิวเตอร์ ความสัมพันธ์เชิงตรรกะนี้ละเอียดอ่อนจริงๆ ต่อไปนี้เป็นความคิดเห็นของฉันเอง หากมีอะไรผิดปกติ ฉันหวังว่าคุณคงจะสามารถชี้ให้เห็นได้
ก่อนอื่นให้ดูที่รหัสชิ้นแรก
คลาสสาธารณะ return_finally { โมฆะสาธารณะหลัก (สตริง [] args) { System.out.println ( m_1 () ); } สาธารณะ int คงที่ m_1 () { int i = 10; ลอง { System.out.println ( "เริ่มต้น" ); return i+=10; }catch(e){ System.out.println( "error: "+e ); }ในที่สุด{ if(i>10){ System.out.println( i ); } System.out.println ( "ในที่สุด" );
ผลลัพธ์ของโค้ดชิ้นแรกจะเป็นดังนี้:
เริ่ม
20
ในที่สุด
20
โปรดทราบว่าการส่งคืนครั้งที่สองอยู่นอกคำสั่งสุดท้ายในเวลานี้ ตามข้อบังคับที่ส่งคืนและปรากฏพร้อมกันในที่สุด เราสามารถเข้าใจได้ว่าการส่งคืนครั้งแรกเป็นเพียงเงื่อนไขเท่านั้น หน้าที่ของมันคือการค้นหาคำสั่งสุดท้ายเท่านั้น ในความเป็นจริง มันดำเนินการเฉพาะการดำเนินการ i+= 10 จากนั้นป้อนคำสั่งสุดท้ายโดยตรง และส่งคืนผลลัพธ์ในที่สุด
ลองดูโค้ดชิ้นที่สอง:
คลาสสาธารณะ return_finally { โมฆะสาธารณะหลัก (สตริง [] args) { System.out.println ( m_1 () ); } สาธารณะ int คงที่ m_1 () { int i = 10; ลอง { System.out.println ( "เริ่มต้น" ); return i+=10; }catch(e){ System.out.println( "error: "+e ); }ในที่สุด{ if(i>10){ System.out.println( i ); } System.out.println ( "ในที่สุด" ); กลับ 50;
ความแตกต่างระหว่างโค้ดชิ้นที่สองและโค้ดชิ้นแรกคือผลตอบแทนสุดท้ายจะถูกวางไว้ในคำสั่งสุดท้าย เราสามารถเดาผลลัพธ์ที่ได้:
เริ่ม
20
ในที่สุด
50
การส่งคืนที่ดำเนินการในเวลานี้ได้เขียนทับ 20 ที่ได้รับจากผลการดำเนินการก่อนหน้าและส่งกลับค่า 50 กล่าวคือ การส่งคืนในคำสั่งสุดท้ายได้ถูกดำเนินการ ก็ควรจะกล่าวเช่นนี้~~
นอกจากนี้ยังมีโค้ดชิ้นที่สาม โปรดสนุกไปกับมันช้าๆ:
คลาสสาธารณะ return_finally { โมฆะสาธารณะหลัก (สตริง [] args) { System.out.println ( m_1 () ); } สาธารณะ int คงที่ m_1 () { int i = 10; ลอง { System.out.println ( "เริ่มต้น" ); return i; }catch(ข้อยกเว้น e){ System.out.println( "ข้อผิดพลาด: "+e ); }ในที่สุด{ if(i>10){ System.out.println( i ); } System.out.println ( "สุดท้าย" );
ในเวลานี้ มี i=50 เพิ่มเติมในคำสั่งสุดท้าย ดังนั้นผลลัพธ์จะเป็นอย่างไร?
เริ่ม
ในที่สุด
10
นี่คือผลลัพธ์ ไม่มีคำสั่ง return ในคำสั่งสุดท้าย ดังนั้นค่าที่ส่งคืนเดิมจะไม่เปลี่ยนแปลง
จากตัวอย่างทั้งสามนี้ เราจะเข้าใจดังนี้:
เมื่อพบการส่งคืนในคำสั่ง try ให้เก็บค่าไว้ในตำแหน่งแรก จากนั้นมองหาคำสั่งสุดท้าย หากมีอัลกอริทึมใหม่ในคำสั่ง ให้นำค่าออกจากช่องว่างนั้นและดำเนินการหากมี ในที่สุดการส่งคืนก็เพียงแค่ใส่ "ค่าใหม่" "เขียนทับ "ค่าเก่า" ในช่องนั้นแล้วส่งคืนในที่สุด หากไม่มีการส่งคืนในที่สุดให้นำ "ค่าเก่า" ในช่องนั้นออกแล้วส่งคืน
ข้อมูลข้างต้นมีไว้เพื่อความเข้าใจเท่านั้น ฉันหวังว่าคุณจะให้คำแนะนำเพิ่มเติมได้ ขอบคุณสำหรับความช่วยเหลือของคุณ!