ความรู้เทียบกับทักษะ
![ระดับเก่า 09 - 1]()
วิทยาลัยสอนเราว่าไม่มีความแตกต่างอย่างมากระหว่างทฤษฎีและการปฏิบัติ แน่นอนคุณเข้าใจว่าไม่เหมือนกัน แต่คุณไม่เห็นความแตกต่างหลัก ยังมีหนึ่ง
คนส่วนใหญ่ใส่เครื่องหมายความเท่าเทียมกันระหว่าง "ฉันรู้" และ "ฉันทำได้" คุณ? แล้วตัวอย่างล่ะ?
- ฉันรู้ว่าการสูบบุหรี่ไม่ดีสำหรับฉัน แต่ฉันสูบ
- ฉันรู้ว่าอาหารจานด่วนไม่ดีสำหรับฉัน แต่ฉันก็กินมัน
- ฉันรู้กฎจราจรแต่ฉันขับรถไม่เป็น
- ฉันรู้ว่าการวิ่งเหยาะๆ นั้นดีสำหรับฉัน แต่ฉันไม่วิ่งเหยาะๆ ในตอนเช้า
บ่อยครั้งที่ผู้คนใช้ "ฉันรู้" แทน "ฉันทำได้" เป็นตัวอย่างที่ดีกับกฎจราจร ถ้าคนรู้ระเบียบ รู้วิธีขับ แสดงว่าเขาขับได้? ไม่. ถ้าเขาคิดว่าเขารู้วิธีขับรถล่ะ? เหตุใดเขาจึงต้องการผู้สอน – เขารู้ทุกอย่างแล้ว
เมื่อคุณแน่ใจว่าคุณรู้ทุกอย่างแล้ว คุณอาจไม่ได้เรียนรู้อะไรใหม่ และถ้ามั่นใจว่ารู้หมดคงไม่เรียนหรอก ความคิดเช่นนี้จะไม่ข้ามความคิดของคุณ และนั่นหมายความว่าคุณจะพลาดโอกาสที่ยอดเยี่ยมในการเรียนรู้บางอย่าง วิทยาลัยปกติให้ความรู้แก่คุณเท่านั้น คุณจะต้องได้รับทักษะด้วยตัวคุณเอง แต่ฉันได้ยินอะไร คุณเคยฝึกปฏิบัตินอกเหนือจากทฤษฎีในวิทยาลัยของคุณหรือไม่? โอเค ถ้า
คุณเรียนคณะฟิสิกส์สร้างแบบจำลองการทำงานของเครื่องจักรไอน้ำที่มีประสิทธิภาพอย่างน้อย 20% ฉันพนันได้เลยว่าคุณรู้วิธีทำ แต่คุณจะทำไม่ได้จริง ๆ ใช่ไหม คุณเป็น
นักเคมี ? ทำแป้งไร้ควัน. คุณรู้วิธี แต่คุณทำไม่ได้ ฮ่า?
นักคณิตศาสตร์ คุณคือ? คำนวณวิถีกระสุนปืนใหญ่ อย่าลืมคำนึงถึงรูปร่างของเปลือกด้วย จุดทางคณิตศาสตร์บินไม่ได้ในชีวิตจริง และไม่มีม้าทรงกลม
นักชีววิทยา? แยกเพนิซิลลิน รานี้เติบโตบนแตงโม ดังนั้นคุณรู้ไหม คุณรู้ได้อย่างไร - ยอดเยี่ยม! คุณทำได้มั้ย?
นักเศรษฐศาสตร์?คาดการณ์การเติบโตของราคาน้ำมัน เสร็จแล้ว? และตอนนี้เปลี่ยนเป็น $2,000 หรือ $200,000 ต่อปีตามการคาดการณ์ของคุณ คุณเคยเล่น FOREX ไหม? เพื่อเงินจริง? หรือคุณเพิ่งรู้ว่ามันคืออะไร?
เศรษฐศาสตร์ระหว่างประเทศ? อลังการ! ฉันจะเปิดบริษัทนอกอาณาเขตได้ที่ไหน ในฮ่องกง ไอร์แลนด์ หรือในสหรัฐอเมริกา ทำไม แม้ว่าคุณจะรู้ แต่ที่น่าสงสัยคือคุณแทบจะไม่สามารถทำได้ เนื่องจากคุณไม่เคยทำมันมาก่อน คุณไม่มีเงื่อนงำวิธีการทำแม้แต่น้อย โอ้ คุณไม่ได้เรียนวิชานั้นในวิทยาลัยเหรอ? ฉันมีสิทธิ์อะไรที่จะมอบงานที่คุณไม่ได้เตรียมไว้ให้? เพราะนี่คือ
งานของชีวิตจริง นี่คือแบบฝึกหัดสิ่งที่คุณได้เรียนในวิทยาลัยคือ: ม้าทรงกลม การแข่งขันที่สมบูรณ์แบบ - ไม่มีสิ่งนี้ในชีวิตจริง แต่ทำไมฉันลืมพูดถึง
ผู้เชี่ยวชาญด้านการตลาด ? วิธีที่ดีที่สุดในการใช้จ่าย $500 ของฉันเพื่อให้ผู้คนจำนวนมากที่สุดเท่าที่จะเป็นไปได้ทราบเกี่ยวกับการบรรยายของฉันคืออะไร ในการโฆษณา? คุณทราบหรือไม่ว่าไม่เพียงแต่โฆษณาแบบคลาสสิกเท่านั้นที่ล้าสมัยไปแล้ว แต่ยังรวมถึงแนวคิดของ USP (ข้อเสนอการขายที่ไม่เหมือนใคร) ซึ่งฉันแน่ใจว่าคุณได้รับการสอนในวิทยาลัยว่าเป็นยาครอบจักรวาลที่ไม่เหมือนใคร
ลืมคุณรู้อะไร ถามตัวเอง - ฉันจะทำอะไรได้บ้าง มีประโยชน์ฉันหมายถึง? สิ่งที่ผู้คนจะจ่ายเงินเพื่อ? เงินดี ฉันหมายถึง? เพื่อนๆ มาแสดงความขอบคุณต่อหลักสูตรที่ยอดเยี่ยมอย่าง CodeGym กันเถอะ ด้วยเหตุนี้ คุณจะไม่เพียงแต่รู้วิธีการเขียนโปรแกรมเท่านั้น แต่คุณยังสามารถทำได้จริงอีกด้วย คุณยังสามารถได้งานทำและได้เงินที่ดีในอีกไม่กี่ปีข้างหน้า ฉันหวังว่าเงินจำนวนนี้จะเพียงพอสำหรับการใช้ชีวิตที่ดีและสะดวกสบาย ฉันจะพูดอีกครั้งเพื่อให้คุณจำไว้ว่า: ไม่สำคัญว่าคุณรู้อะไร สิ่งเดียวที่สำคัญคือทักษะที่เป็นประโยชน์ที่คุณมี ซึ่งผู้คนจะกระตือรือร้นที่จะจ่ายเงินให้คุณ ยิ่งคุณเข้าใจสิ่งนี้เร็วเท่าไหร่ก็ยิ่งดีเท่านั้น
คุณมาถึงระดับใหม่แล้ว
ระดับ 9
1 Risha การติดตามสแต็ก
![ระดับเก่า 09 - 4]()
- เฮ้! วันนี้จะมาบอกว่าสแต็คเทรซคืออะไร แต่ก่อนอื่นให้ฉันอธิบายคุณว่ากองคืออะไร - ลองนึกภาพกองเอกสาร - การมอบหมายงานให้กับเสมียนคนหนึ่ง การมอบหมายใหม่สามารถวางไว้บนสุดของสแต็ก และเขาจะรับงานจากบนสุดของสแต็ก ดังนั้นการมอบหมายจะไม่ทำตามลำดับก่อนหลัง ทุกครั้งที่เสมียนรับมอบหมายงานสุดท้าย
โครงสร้างคอลเลกชันดังกล่าวเรียกว่าสแต็ก . -
ใน Java มีคอลเลกชันพิเศษ - Stack คอลเลกชันนี้มีวิธีการ «เพิ่มองค์ประกอบ» และ «ใช้(รับ/นำออกไป) องค์ประกอบ» ดังที่คุณทราบแล้ว องค์ประกอบสุดท้ายที่เพิ่มจะถูกนำไปใช้ก่อน
- ฮัม ไม่น่าจะยากนะผมว่า - ดี. จากนั้นให้ฉันอธิบายว่า
สแต็กเทรซ คืออะไรเป็น. - ลองนึกภาพว่าใน
ฟังก์ชัน Java Аเรียก
ฟังก์ชัน Bและฟังก์ชันหลังเรียกฟังก์ชัน
Cซึ่งในทางกลับกันเรียก
ฟังก์ชัน D ดังนั้น หากต้องการออกจาก
ฟังก์ชัน Bคุณต้องออกจากฟังก์ชัน C ก่อนและ
ต้องออกจาก
ฟังก์ชัน D ก่อน สิ่งนี้คล้ายกับสแต็กมาก
- และความคล้ายคลึงกันคืออะไร? - ในสแต็ก เพื่อไปยังการมอบหมายบางอย่าง คุณต้องทำงานมอบหมายทั้งหมดให้เสร็จก่อน
- มันก็ค่อนข้างจะคล้าย ๆ กัน แต่ฉันไม่แน่ใจว่าฉันเข้าใจทุกอย่างถูกต้องหรือไม่ - ดูนี่. ใน Java สแต็คคือชุดขององค์ประกอบ มันเหมือนกระดาษเป็นปึกๆ ในการรับแผ่นที่สามจากด้านบนคุณต้องใช้แผ่นงานที่สอง แต่ก่อนหน้านั้นคุณต้องใช้แผ่นแรก คุณสามารถวางและนำแผ่นงานได้ตลอดเวลา แต่คุณสามารถวางได้เฉพาะด้านบนและดึงจากด้านบนเท่านั้น เช่นเดียวกับการเรียกใช้ฟังก์ชัน
ฟังก์ชัน Аเรียก
ฟังก์ชัน Bฟังก์ชันหลังเรียก
ฟังก์ชัน C หากต้องการออกจาก
Аคุณต้องออกจาก
B ก่อน และในการทำเช่น นี้ คุณต้องออกจาก
C - รอสักครู่. ถ้าฉันเข้าใจถูกต้อง สแต็คทั้งหมดจะกลายเป็น «สามารถเก็บแผ่นงานสุดท้ายที่วางบนสแต็กได้เท่านั้น» และ «ก่อนอื่น ฟังก์ชันที่เรียกใช้ล่าสุดควรออก» อย่างนั้นเหรอ? - ใช่. ดังนั้น ลำดับของการเรียกใช้ฟังก์ชันจึงเป็น «function call stack» หรือเรียกง่ายๆ ว่า «call stack»
ฟังก์ชันที่เรียกใช้สุดท้ายจะต้องถูกยกเลิกก่อน ลองดูตัวอย่าง:
- ตกลง ฉันเดาว่าทุกอย่างชัดเจนด้วยการเรียกใช้ฟังก์ชัน แต่StackTraceElement นี้คือ อะไร - เครื่องเสมือน Java บันทึกการเรียกใช้ฟังก์ชันทั้งหมด เพื่อจุดประสงค์นี้จึงมีคอลเลกชันพิเศษ - สแต็ค เมื่อฟังก์ชันหนึ่งเรียกใช้ฟังก์ชันอื่น JVM จะวางองค์ประกอบใหม่
StackTraceElementลงในสแต็กนี้ เมื่อฟังก์ชันสิ้นสุดลง อิลิเมนต์จะถูกลบออกจากสแต็ก
ดังนั้น สแต็คนี้จะเก็บข้อมูลที่เป็นปัจจุบันอยู่เสมอเกี่ยวกับสถานะปัจจุบันของ «การเรียกฟังก์ชันสแตก» - ทุก
StackTraceElementมีข้อมูลเกี่ยวกับวิธีการที่เรียกว่า ดังนั้นคุณสามารถรับชื่อเมธอดนี้ได้โดยใช้
getMethodName - ตัวอย่างด้านบนแสดงให้เห็นว่า:
- รับ «กองโทร»:
- วนซ้ำอาร์เรย์โดยใช้ลูปfor- each ฉันหวังว่าคุณจะยังไม่ลืมมัน
- พิมพ์ชื่อเมธอดไปที่System.out
- สิ่งที่น่าสนใจและดูเหมือนง่าย ขอบคุณริชา!
2 ดิเอโก งานแสดงการติดตามสแต็ก
- เฮ้ อามีโก้! นี่เป็นงานเล็กๆ น้อยๆ ในการแสดงสแต็กเทรซบนหน้าจอ
งาน |
1 |
แต่ละเมธอดควรส่งคืน StackTrace
Write ห้าเมธอดที่เรียกหากัน แต่ละเมธอดควรส่งคืน StackTrace |
2 |
StackTrace อีกครั้ง
เขียนห้าวิธีที่โทรหากัน แต่ละเมธอดควรส่งคืนชื่อเมธอดผู้โทร คุณสามารถรับวิธีการโทรโดยใช้ StackTrace
|
3 |
เมธอดควรส่งคืนหมายเลขบรรทัดของโค้ด เมธอดนี้ถูกเรียกจากเมธอด
Write ห้าเมธอดที่เรียกหากัน แต่ละเมธอดควรส่งคืนหมายเลขบรรทัดของโค้ดที่เรียกใช้เมธอดนี้ ใช้ฟังก์ชันelement.getLineNumber( ) |
4 |
สแต็กเทรซของ 10 สาย
เขียนโค้ดเพื่อรับสแต็กเทรซของ 10 สาย |
5 |
วิธีการควรส่งคืนผลลัพธ์ - ความลึกของการติดตามสแต็ก
เขียนวิธีการที่แสดงและส่งคืนความลึกของการติดตามสแต็ก ความลึกของการติดตามสแต็กคือจำนวนของเมธอด (จำนวนของอิลิเมนต์ในรายการ) |
3 Elly ข้อผิดพลาดและข้อยกเว้น
- เฮ้ อามีโก้! วันนี้เรามีบทเรียนที่น่าสนใจมาก ฉันจะบอกคุณเกี่ยวกับข้อยกเว้น
ข้อยกเว้นเป็นกลไกพิเศษในการควบคุมข้อผิดพลาดในโปรแกรม ต่อไปนี้คือตัวอย่างบางส่วนของข้อผิดพลาดที่อาจเกิดขึ้นในโปรแกรม:
- โปรแกรมพยายามเขียนไฟล์ให้เต็มดิสก์
- โปรแกรมพยายามเรียกเมธอดของตัวแปรที่เก็บการอ้างอิงค่าว่าง
- โปรแกรมพยายามที่จะหารตัวเลขด้วย 0
การกระทำเหล่านี้ส่งผลให้เกิดข้อผิดพลาด โดยปกติแล้ว
จะนำไปสู่การปิดโปรแกรม - ไม่มีประเด็นใดที่จะดำเนินการโค้ดต่อไป
- ทำไมถึงเป็นเช่นนั้น? - มีความรู้สึกอย่างไรในการหมุนล้อเมื่อรถตกหน้าผา?
- คุณหมายความว่าโปรแกรมควรจะจบลงหรือไม่? - ใช่. นั่นเป็นวิธีที่เคยเป็นมาก่อน
ข้อผิดพลาดใด ๆ ที่นำไปสู่การยุติโปรแกรม - เป็นการตัดสินใจที่ชาญฉลาดมาก
- จะดีกว่าไหมถ้าพยายามทำงานต่อไป? - ใช่. คุณได้พิมพ์ข้อความจำนวนมากใน MS Word บันทึกแล้ว ยังไม่ได้บันทึก แต่โปรแกรมจะบอกคุณว่าทุกอย่างเรียบร้อยดี และคุณพิมพ์ต่อไป โง่ใช่มั้ย
- ใช่. - จากนั้นโปรแกรมเมอร์ก็คิดวิธีที่น่าสนใจ:
แต่ละฟังก์ชันส่งคืนสถานะการทำงาน 0 หมายความว่าฟังก์ชันทำงานตามที่ควรจะเป็น ค่าอื่น ๆ – นั่นคือมีข้อผิดพลาด : ค่านี้เป็นรหัสข้อผิดพลาด - แต่วิธีนี้มีข้อเสีย. หลังจากการเรียกใช้ฟังก์ชัน (!) แต่ละครั้ง คุณต้องตรวจสอบรหัส (หมายเลข) ที่ส่งคืนโดยฟังก์ชัน ประการแรก มันไม่สะดวก: โค้ดการจัดการข้อผิดพลาดแทบไม่ค่อยได้ดำเนินการ แต่คุณต้องเขียนมันเสมอ ประการที่สอง ฟังก์ชันต่างๆ มักจะส่งคืนค่าต่างๆ กัน - จะทำอย่างไรกับฟังก์ชันเหล่านั้น
- ใช่. นั่นคือสิ่งที่ฉันกำลังจะถาม - แล้วอนาคตที่สดใสก็มาถึง - ข้อยกเว้นและการจัดการข้อผิดพลาดได้ปรากฏขึ้น นี่คือวิธีการทำงาน:
- เมื่อเกิดข้อผิดพลาด Java virtual machine จะสร้างวัตถุพิเศษ – ข้อยกเว้น – ที่มีข้อมูลทั้งหมดเกี่ยวกับข้อผิดพลาด สำหรับข้อผิดพลาดที่แตกต่างกันมีข้อยกเว้นที่แตกต่างกัน
- จากนั้นข้อยกเว้นนี้บังคับให้โปรแกรมขัดจังหวะฟังก์ชันปัจจุบันทันที และฟังก์ชันถัดไป จนกว่าจะออกจากเมธอดหลัก หลังจากนั้นโปรแกรมจะสิ้นสุดลง นักพัฒนา Java เรียกกระบวนการนี้ว่า «ย้อนกลับ call stack»
- แต่คุณบอกว่าโปรแกรมจะไม่ออกอย่างแน่นอน - ถูกต้อง
เพราะมีวิธีจับข้อยกเว้น เมื่อใดก็ตามที่คุณต้องการ คุณสามารถเขียนโค้ดพิเศษเพื่อรับข้อยกเว้นเหล่านี้และทำสิ่งที่สำคัญได้ - ในการทำเช่น นี้มีการก่อสร้าง
แบบลองจับ พิเศษ ดูวิธีการทำงาน:
- ทำไม «หลังจากเรียก method1 จะไม่แสดง» จะไม่ปรากฏบนหน้าจอใช่หรือไม่ - ฉันดีใจที่คุณถามเกี่ยวกับเรื่องนี้ ในบรรทัดที่ 25 มีการหารด้วยศูนย์ สิ่งนี้นำไปสู่ข้อผิดพลาด - ข้อยกเว้น เครื่องเสมือน Java สร้างวัตถุ
ArithmeticExceptionที่มีข้อมูลข้อผิดพลาด วัตถุนี้เป็นข้อยกเว้น - มีข้อยกเว้นเกิดขึ้นภายในเมธอด
method1( )
ส่งผลให้วิธีนี้ยุติลงทันที นอกจากนี้ยังจะนำไปสู่การยุติวิธีการ
mainหากไม่มีบล็อก
try-catch - หากมีข้อยกเว้นเกิดขึ้นภายในบล็อกลอง ข้อผิดพลาดนั้นจะถูกดักจับในบล็อก
จับ รหัสที่เหลือในการพยายาม บล็อก จะไม่ถูกดำเนินการ การดำเนินการของบล็อกcatchจะเริ่มต้นทันที
- ฉันไม่ค่อยเข้าใจ - กล่าวอีกนัยหนึ่ง รหัสนี้ทำงานดังนี้:
- หากมีข้อยกเว้นเกิดขึ้นภายใน บล็อก tryโค้ดในบล็อกนี้จะไม่ถูกดำเนินการอีกต่อไป แต่การดำเนินการของ block catchจะเริ่มต้นขึ้น
- หากไม่มีข้อยกเว้นเกิดขึ้น บล็อก try จะถูกดำเนินการจนจบและcatchจะไม่ถูกดำเนินการ
- อะแฮ่ม! - ลองนึกภาพว่าหลังจากการเรียกใช้เมธอดแต่ละครั้ง เราจะตรวจสอบว่าเมธอดที่เรียกนั้นสิ้นสุดลงเองหรือเนื่องจากข้อยกเว้น
หากมีข้อยกเว้น JVM จะเริ่มดำเนินการจับบล็อกหากมี และจับข้อยกเว้น หากไม่มี catch block JVM จะยุติเมธอดปัจจุบัน จากนั้นการตรวจสอบเดียวกันจะเริ่มต้นในวิธีการที่เรียกว่าวิธีการปัจจุบัน
- ตอนนี้ฉันคิดว่าฉันเข้าใจแล้ว - ไม่เป็นไร.
- และข้อยกเว้นนั้นคืออะไรใน catch block? -
ข้อยกเว้นทั้งหมดเป็นคลาสที่สืบทอดมาจากคลาสข้อยกเว้น เราสามารถจับพวกมันได้โดยระบุคลาสของมันในการ
จับบล็อกหรือทั้งหมดพร้อมกันโดยระบุข้อยกเว้นของคลาสพาเรนต์ทั่วไป จากนั้นจากตัวแปร e (ตัวแปรนี้เก็บข้อมูลอ้างอิงของวัตถุยกเว้น) คุณจะได้รับข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับข้อผิดพลาด
- ยอดเยี่ยม! และถ้าวิธีการของฉันเกิดข้อยกเว้นที่แตกต่างกัน ฉันจะจัดการด้วยวิธีอื่นได้ไหม - คุณต้อง คุณสามารถทำได้ดังนี้:
![ระดับเก่า 09 - 7]()
- บล็อก try อาจมี
catchบล็อกหลายอัน ซึ่งแต่ละอันจะตรวจจับข้อยกเว้นตามประเภทของมัน
- อืม ฉันเข้าใจแล้ว แน่นอนฉันจะไม่เขียนอะไรแบบนี้ด้วยตัวเอง อย่างไรก็ตาม ฉันจะไม่กลัวถ้าฉันพบรหัสดังกล่าว
4 Elly, RuntimeException, โยน
![ระดับเก่า 09 - 8]()
- ฉันตัดสินใจที่จะนำเสนอหัวข้ออื่นในวันนี้ ใน Java ข้อยกเว้นทั้งหมดแบ่งออกเป็นสองประเภท –
ควบคุม/ตรวจสอบและไม่
ควบคุม/ไม่ตรวจสอบ ข้อยกเว้นที่ตรวจสอบ
จะต้อง ตรวจจับ ได้ ที่ไม่ได้ตรวจสอบสามารถตรวจจับได้
แต่ไม่จำเป็น - เป็นไปได้ไหมที่จะโยนข้อยกเว้นในรหัสโดยตั้งใจ? - ในโค้ดของคุณ คุณสามารถโยนข้อยกเว้นได้เอง คุณสามารถเขียนข้อยกเว้นของคุณเองได้ แต่เราจะเจาะลึกลงไปในหลุมนี้ในภายหลัง ตอนนี้เรามาเรียนรู้วิธีการทำงานกับข้อยกเว้นที่ส่งโดยเครื่องเสมือน Java
- ตกลง. - ถ้ายกเว้น
ClassNotFoundExceptionและ
FileNotFoundExceptionถูกโยน (ปรากฏ) ในเมธอด โปรแกรมเมอร์ต้องระบุในลายเซ็นของเมธอด (เมธอดเฮดเดอร์) มีการตรวจสอบ
ข้อยกเว้นดังกล่าว มักจะมีลักษณะดังนี้:
- ดังนั้น เราแค่เขียนการโยนและระบุข้อยกเว้นโดยคั่นด้วยเครื่องหมายจุลภาค ขวา? อย่างนั้นเหรอ? - ใช่. แต่มีอีกสิ่งที่น่าสนใจ เพื่อให้ตัวอย่างด้านล่างได้รับการรวบรวม เมธอดที่เรียก
method1()จึง
ต้องจับข้อยกเว้นเหล่านี้หรือ
ส่งต่อ หากคุณต้องการส่งข้อยกเว้นที่ ตรวจ
สอบแล้วไปข้างหน้า คุณต้องระบุในส่วนหัวของเมธอด - อีกครั้ง หากใน เมธอด
หลักคุณต้องการเรียกเมธอดที่มีวลีส่วนหัว
โยน FileNotFoundException, …คุณต้องทำหนึ่งในสองสิ่งนี้:
- เพื่อจับข้อยกเว้น FileNotFoundException, …
คุณจะต้องห่อโค้ดที่คุณเรียกใช้เมธอดที่เป็นอันตรายด้วยบล็อกtry-catch
- ไม่จับข้อยกเว้น FileNotFoundException, …
คุณจะต้องเพิ่มข้อยกเว้นเหล่านี้ในรายการ
โยนของวิธีการของคุณ
main - คุณจะยกตัวอย่างให้ฉันได้ไหม - ดูที่นี่:
![ระดับเก่า 09 - 10]()
- ตัวอย่างนี้จะไม่ถูกคอมไพล์ เนื่องจากเมธอด
mainเรียกใช้เมธอด method1() ซึ่งจะโยนข้อยกเว้นที่ต้องตรวจจับได้ - ในการคอมไพล์ตัวอย่าง คุณต้องเพิ่มการจัดการข้อยกเว้นให้กับเมธอด
main คุณทำได้สองวิธี:
![ระดับเก่า 09 - 11]()
- และที่นี่เราจับมันโดยใช้
try-catch :
- มันชัดเจนขึ้น แต่น้อยมาก - ดูตัวอย่างด้านล่าง:
![ระดับเก่า 09 - 13]()
- ยังมีข้อยกเว้นอยู่ -
RuntimeExceptionและคลาสที่สืบทอดมา
ไม่จำเป็นต้องจับหรือโยน สิ่งเหล่านี้เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ ข้อยกเว้นเหล่านี้ถือว่าคาดเดาได้ยาก ดังนั้นจึงแทบจะเป็นไปไม่ได้เลยที่จะคาดการณ์การเกิดขึ้น คุณสามารถทำสิ่งเดียวกันกับพวกเขา ได้ แต่ไม่จำเป็นต้องระบุใน
การโยน
5 ริชา กลิ้งกองถ่าย วิธีทำอยู่ในข้อยกเว้น
- ฉันอยากจะบอกคุณอีกเล็กน้อยเกี่ยวกับวิธีการทำงานของข้อยกเว้น ตัวอย่างด้านล่างอธิบายว่า:
- ฉันไม่เข้าใจ - ตกลง. ฉันจะอธิบายสิ่งที่เกิดขึ้น - ในตัวอย่างด้านซ้าย เราเรียกเมธอดหลายตัวตามลำดับลูกโซ่ ใน
method2()เราสร้างและโยนข้อยกเว้นโดยเฉพาะ (เพื่อเริ่มต้นข้อผิดพลาด) - ตัวอย่างด้านขวาแสดงให้เห็นว่าเกิดอะไรขึ้น ดูที่
method2( ) นั่นคือสิ่งที่การสร้างข้อยกเว้นแปลงเป็น: เราสร้างวัตถุ ประเภท
RuntimeExceptionเก็บไว้ใน
ข้อยกเว้น ตัวแปร พิเศษและออกจากเมธอดทันที –
return - ใน
method1หลังจากการเรียกใช้
method2จะมีการตรวจสอบ
มีข้อยกเว้นหรือไม่; หากมีข้อยกเว้น method1 จะยุติทันที การตรวจสอบนี้ทำโดยปริยายหลังจากเรียกใช้เมธอด Java (!) แต่ละเมธอด
- ว้าว! - อย่างแน่นอน. - ในคอลัมน์ทางด้านขวาใน method
mainฉันเขียนว่าเกิดอะไรขึ้นเมื่อตรวจพบข้อยกเว้นโดยบล็อก
try-catch หากไม่มีข้อยกเว้น โค้ดจะดำเนินการต่อไปตามที่วางแผนไว้ หากมีข้อยกเว้นประเภทที่ระบุใน
catchเราจะจัดการให้
- และการโยนและอินสแตนซ์หมายถึงอะไร? - ดูที่บรรทัดสุดท้ายทางด้านซ้าย
โยน RuntimeException ใหม่. ด้วยวิธีนี้เราจะสร้างและโยนข้อยกเว้น นี่เป็นเพียงตัวอย่างเท่านั้น เราจะไม่ทำจนถึงตอนนี้ - ใช้คำสั่ง «
а instanceof B » ในบล็อกด้านขวา เราจะตรวจสอบว่าวัตถุ
aมีประเภท
B หรือ ไม่ นั่นคือ
ไม่ว่าวัตถุที่จัดเก็บไว้ในข้อยกเว้นตัวแปร จะมีประเภท RuntimeException หรือไม่ มันเป็นนิพจน์เชิงตรรกะ
- เริ่มชัดเจนขึ้นเล็กน้อย
6 ดิเอโก งานจับข้อยกเว้น
- ดูนี่! ลุงดิเอโกนำงานบางอย่างมาให้คุณ ขอให้คุณโชคดี. ฉันคิดว่าคุณจะต้องการมัน เฮ้
![ระดับเก่า 09 - 15]()
- เฮ้ อามีโก้! ต่อไปนี้คืองานจับข้อยกเว้นที่น่าสนใจบางส่วน
จับงาน |
1 |
1. ข้อยกเว้นเมื่อทำงานกับตัวเลข
จับข้อยกเว้นที่เกิดขึ้นเมื่อเรียกใช้รหัส: int a = 42 / 0;
แสดงข้อยกเว้นบนหน้าจอโดยระบุประเภทของมัน |
2 |
2. ข้อยกเว้นเมื่อทำงานกับสตริง
จับข้อยกเว้นที่เกิดขึ้นเมื่อรันโค้ด: สตริง s = null; สตริง m = s.toLowerCase();
แสดงข้อยกเว้นบนหน้าจอโดยระบุประเภทของมัน |
3 |
3. ข้อยกเว้นเมื่อทำงานกับอาร์เรย์
จับข้อยกเว้นที่เกิดขึ้นเมื่อรันโค้ด: int[] m = new int[2]; ม.[8] = 5;
แสดงข้อยกเว้นบนหน้าจอโดยระบุประเภทของมัน |
4 |
4. ข้อยกเว้นเมื่อทำงานกับ List collections
จับข้อยกเว้นที่เกิดขึ้นเมื่อรันโค้ด: ArrayList<String> list = new ArrayList<String>(); สตริง s = list.get(18);
แสดงข้อยกเว้นบนหน้าจอโดยระบุประเภทของมัน |
5 |
5. ข้อยกเว้นเมื่อทำงานกับคอลเล็กชันแผนที่
จับข้อยกเว้นที่เกิดขึ้นเมื่อรันโค้ด: HashMap<String, String> map = new HashMap<String, String>(null); map.put(โมฆะ, โมฆะ); map.remove (โมฆะ);
แสดงข้อยกเว้นบนหน้าจอโดยระบุประเภทของมัน |
- เคล็ดลับ: ขั้นแรกให้เขียนโปรแกรม จากนั้นดูว่ามีข้อยกเว้นใดเกิดขึ้น และหลังจากนั้นให้เปลี่ยนรหัสและตรวจจับข้อยกเว้นนั้น
7 Risha การจับหลายครั้งได้ผลอย่างไร
![ระดับเก่า 09 - 16]()
- ตอนนี้มีการบรรยายที่น่าสนใจเพิ่มเติม ฉันชอบการสอนมาก - ฉันต้องการบอกคุณว่า
การจับ หลายครั้ง ทำงาน อย่างไร ที่จริงแล้วมันง่ายมาก: เมื่อมีข้อยกเว้นเกิดขึ้นในบล็อกtry
การดำเนินการของโปรแกรมจะถูกโอนไปยัง
catch แรก -
หากประเภทที่ระบุในวงเล็บของ block catch เหมือนกับประเภทของวัตถุยกเว้น การดำเนินการโค้ดจะเริ่มขึ้นภายใน {} มิฉะนั้นเราไป
จับ ต่อไป . การตรวจสอบซ้ำที่นั่น - หากไม่มี
catch block แล้ว แต่ข้อยกเว้นไม่ถูกจับ มันจะถูกส่งไปข้างหน้า และวิธีการปัจจุบันจะถูกขัดจังหวะ
- ฉันเห็น. การจับนั้นจะถูกดำเนินการ ประเภทที่ตรงกับประเภทของข้อยกเว้น - ใช่ถูกต้อง. จริงๆ แล้ว มันซับซ้อนกว่านั้นเล็กน้อย ประเด็นก็คือ คลาสสามารถสืบทอดจากกันและกันได้ หากคลาส «Cow» สืบทอดมาจากคลาส «Animal» อ็อบเจ็กต์ประเภท «Cow» อาจถูกจัดเก็บไม่เฉพาะในตัวแปรประเภท «Cow» แต่ยังอยู่ในตัวแปรประเภท «สัตว์» ด้วย .
- แล้วไง - เนื่องจากข้อยกเว้นทั้งหมดสืบทอดมาจากคลาสExceptionหรือRuntimeException (ซึ่งสืบทอดมาจากException เช่นกัน ) ข้อยกเว้นทั้งหมดอาจถูกจับได้โดยใช้คำสั่งcatch (Exception e)หรือcatch (RuntimeException e ) - แล้วไง - นี่หมายความว่า
ขั้นแรก คุณสามารถจับข้อยกเว้นโดยใช้คำสั่ง catch(Exception e )
ประการที่สอง ลำดับของ บล็อก catchมีความสำคัญ ตัวอย่าง: -
ArithmeticExceptionที่เกิดจากการหารด้วย 0 ถูกจับได้ในการจับครั้งที่สอง
![ระดับเก่า 09 - 17]()
- ในตัวอย่างด้านล่าง
ArithmeticExceptionถูกจับใน
catch แรก เนื่องจากคลาสของข้อยกเว้นทั้งหมดสืบทอดมาจากข้อยกเว้น ดังนั้น
Exception จะจับข้อยกเว้นใดๆ
![ระดับเก่า 09 - 18]()
- ในตัวอย่างด้านล่าง ข้อยกเว้น
ArithmeticExceptionไม่ถูกตรวจจับ แต่ส่งต่อไปยังเมธอดการโทร
- ตอนนี้เริ่มชัดเจนขึ้นแล้ว ข้อยกเว้นเหล่านี้ไม่ใช่เรื่องง่าย - ดูเหมือนจะเป็นเช่นนั้นเท่านั้น อันที่จริง มันเป็นหนึ่งในสิ่งที่ง่ายที่สุดใน Java
- ฉันสงสัยว่าจะดีใจหรือเสียใจกับมันดี...
8 ดิเอโก งานจับข้อยกเว้นหลายรายการ
- เฮ้ อามีโก้! เมื่อวานฉันเมาและทำให้งานของคุณซับซ้อนเกินไป แต่ฉันหวังว่าคุณจะไม่มีความรู้สึกหนักใจและคุณจะแก้ปัญหาทั้งหมดได้หรือไม่ เพื่อประโยชน์ของคุณเอง ที่นี่:
งาน |
1 |
1. ข้อยกเว้น
มีเมธอดที่ส่งข้อยกเว้นสองรายการที่สืบทอดมาจากExceptionและอีกสองรายการที่สืบทอดมาจากRuntimeException : NullPointerException , ArithmeticException , FileNotFoundExceptionและURISyntaxException
คุณต้องจับNullPointerExceptionและFileNotFoundExceptionแต่ไม่ต้องจับArithmeticExceptionและURISyntaxException ทำอย่างไร? |
2 |
2. การจับข้อยกเว้น
มีข้อยกเว้นสามข้อที่สืบทอดมาจากข้อยกเว้น ตามลำดับ : คลาส Exception1 ขยาย คลาสข้อยกเว้น Exception2 ขยาย คลาส Exception1 ข้อยกเว้น3 ขยาย Exception2
มีวิธีการซึ่งอธิบายไว้ดังต่อไปนี้: สาธารณะ static void method1() โยนข้อยกเว้น1, ข้อยกเว้น2, ข้อยกเว้น3
เขียนจับ บล็อกเพื่อจับข้อยกเว้นทั้ง 3 ข้อยกเว้น 1ข้อยกเว้น 2และข้อยกเว้น 3 |
3 |
3. การจับข้อยกเว้นแบบเลือก 1.
ค้นหาว่ามีข้อยกเว้นอะไรบ้างที่ส่งโดยเมธอดBEAN.methodThrowExceptions
2. เมธอดprocessExceptions()ควรเรียกเมธอดBEAN.methodThrowExceptionsและจัดการข้อยกเว้น:
2.1 หากเกิดข้อยกเว้นFileSystemExceptionให้บันทึกโดยเรียกใช้เมธอดBEAN.logและส่งต่อ
2.2 หากเกิดข้อยกเว้นCharConversionException หรือ IOExceptionอื่นๆให้บันทึกโดยเรียกใช้เมธอดBEAN.log
3 เพิ่มคลาส/ประเภทของข้อยกเว้นที่คุณกำลังส่งต่อใน 2.1 ไปยังกระบวนการข้อยกเว้น ()ลายเซ็นวิธีการ
4. จัดการข้อยกเว้นที่เหลือในเมธอด main() และบันทึก ใช้try..catch
เคล็ดลับ:
หากคุณตรวจพบข้อยกเว้นMyExceptionซึ่งคุณไม่ต้องการจับ คุณสามารถส่งต่อโดยใช้รหัสต่อไปนี้: catch (MyException e) {
โยน e;
}
|
4 |
4. ตรวจจับข้อยกเว้นที่ตรวจสอบ
จัดการข้อยกเว้นที่ตรวจสอบทั้งหมดในเมธอดprocessExceptions( )
คุณต้องแสดงหน้าจอแต่ละข้อยกเว้นการตรวจสอบที่เกิดขึ้น
คุณสามารถใช้เพียงหนึ่งบล็อก ลอง |
5 |
5. จับข้อยกเว้นที่ไม่ได้ตรวจสอบ
จัดการข้อยกเว้นที่ไม่ได้ตรวจสอบทั้งหมดในเมธอดprocessExceptions( )
คุณต้องแสดงสแต็กเทรซของแต่ละข้อยกเว้นที่เกิดขึ้นบนหน้าจอโดยใช้เมธอดprintStack ()
คุณสามารถใช้เพียงหนึ่งบล็อก ลอง |
9 ศาสตราจารย์ บรรยายเรื่องข้อยกเว้น
- วันนี้เรามีหัวข้อที่น่าสนใจอย่างยิ่ง - ข้อยกเว้น ในตอนนั้น เมื่อนักวิทยาศาสตร์รุ่นเยาว์และโปรแกรมเมอร์ตื่นเต้นกับหัวข้อนี้อย่างมาก... - ขอโทษนะ ฉันต้องไปห้องแล็บ นี่คือเอกสารประกอบการบรรยาย ฉันคิดว่าคุณจะคิดออกเอง ที่นี่:
ข้อยกเว้น Java (เอกสาร Oracle) การจัดการข้อยกเว้นใน Java (จุด T ของ Java) Java - การจัดการข้อยกเว้น (จุดสอน) การจัดการข้อยกเว้น Java ขั้นพื้นฐาน
10 ฮูลิโอ
- Amigo คุณคิดอย่างไรกับบทเรียนวันนี้ สมองโพซิตรอนของคุณยังไม่ทำงานหรือไม่? งานของดิเอโกก็เพียงพอแล้วที่จะทำให้ทุกคนเหนื่อยหน่าย ดื่มเบียร์และผ่อนคลายกันเถอะ คุณยังยืนอยู่ไหม
11 กัปตันกระรอก
- สวัสดีทหาร!
- สวัสดีตอนเช้าครับท่าน! - ฉันมีข่าวที่ยอดเยี่ยมสำหรับคุณ นี่คือการตรวจสอบอย่างรวดเร็วเพื่อเสริมสร้างทักษะของคุณ ทำทุกวันและคุณจะเพิ่มพูนทักษะของคุณอย่างรวดเร็ว งานได้รับการออกแบบมาเป็นพิเศษให้ทำใน Intellij IDEA
งานเพิ่มเติมที่ต้องทำใน Intellij Idea |
1 |
1. การหารด้วยศูนย์
สร้างเมธอด public static void departmentByZero()ซึ่งคุณต้องหารจำนวนใดๆ ด้วยศูนย์ และแสดงผลของการหารบนหน้าจอ
รวมการเรียกเมธอด การ หารByZero() ลงใน try..catch แสดงการสืบค้นกลับของสแต็ ก ข้อยกเว้นโดยใช้เมธอดexception.printStackTrace() |
2 |
2. นับถอยหลังจาก 10 ถึง 0
เขียนลูปเพื่อนับถอยหลังจาก 10 ถึง 0 ใช้Thread.sleep(100)เพื่อหน่วงเวลา
ปิด การ โทร เข้าสู่โหมดสลีป try..catch |
3 |
3. รวมเมธอดเป็น try..catch
อ่านตัวเลขจากแป้นพิมพ์ เขียนรหัสสำหรับอ่านตัวเลขจากแป้นพิมพ์เป็นวิธีการที่แยกต่างหากreadData( )
รวมเนื้อหาทั้งหมดของวิธีนี้ (โค้ดทั้งหมดภายใน เมธอด readData()ยกเว้นการประกาศรายการที่จะเก็บตัวเลข) ลงในtry..catch
หากผู้ใช้ป้อนข้อความแทนการป้อนตัวเลข เมธอดจะต้องตรวจจับข้อยกเว้นและแสดงหน้าจอทุกตัวเลขที่ป้อนก่อนหน้า
แสดงตัวเลขที่หน้าจอ แต่ละหมายเลขควรอยู่ในบรรทัดใหม่ ลำดับของตัวเลขควรเหมือนกับที่ป้อน |
4 |
4. ตัวแปลงวัน
ที่ อ่านจากแป้นพิมพ์เป็นวันที่ในรูปแบบ «08/18/2013»
แสดงบนหน้าจอวันที่ในรูปแบบ «AUG 18, 2013» ใช้
วัตถุDateและSimpleDateFormat |
5 |
5. สระและพยัญชนะ
เขียนโปรแกรมอ่านบรรทัดจากแป้นพิมพ์
โปรแกรมควรแสดงสองสตริงบนหน้าจอ:
1) สตริงแรกควรมีสระ
2) สตริงที่สองควรมีพยัญชนะและเครื่องหมายวรรคตอนจากข้อความที่ป้อน
คั่นอักขระด้วยช่องว่าง
อินพุตตัวอย่าง: หยุดดู ฟัง เอาต์พุตตัวอย่าง: oooie
stplklstn |
6 |
6. นิทานเรื่องหนูน้อยหมวกแดง
1. มีห้าชั้นเรียน: หมวกแดง, คุณยาย, ขนมพาย, คนตัดไม้, หมาป่า
2. แต่ละคลาสมีสองฟิลด์ ประเภท ArrayList : ฆ่าและกิน
3. มีการสร้างวัตถุที่จำเป็นแล้ว (กระโปรง, ยาย, ... )
4. สร้างความสัมพันธ์ที่ถูกต้อง (ใครกินและฆ่าใคร) เพื่อรับตรรกะของ «หนูน้อยหมวกแดง» |
7 |
7. ย้ายการแก้ไขแบบคงที่
ย้ายตัวดัดแปลงแบบคงที่เพื่อให้โค้ดคอมไพล์ |
8 |
8. รายการอาร์เรย์ของตัวเลข
สร้างรายการที่มีองค์ประกอบเป็นอาร์เรย์ของตัวเลข เพิ่มอาร์เรย์วัตถุห้ารายการที่มีความยาว 5, 2, 4, 7, 0 ตามลำดับ เติมอาร์เรย์ด้วยข้อมูลใด ๆ และแสดงบนหน้าจอ |
9 |
9. สิบแมว
สร้างคลาส Catด้วยฟิลด์ชื่อ สตริง
สร้างพจนานุกรมMap<String, Cat>เพิ่มแมว 10 ตัวในโมเดล «ชื่อ» - «แมว»
ได้จากแผนที่ชุดชื่อและแสดงชุดที่หน้าจอ |
- งานเหล่านั้นสำหรับกรีน ฉันเพิ่มงานโบนัสที่มีความซับซ้อนสูงขึ้น สำหรับปืนชั้นนำเท่านั้น
งานโบนัส |
1 |
1. โปรแกรมไม่คอมไพล์และรัน ซ่อมมัน. งาน:โปรแกรมควรอ่านชื่อไฟล์สองไฟล์จากแป้นพิมพ์ และคัดลอกไฟล์แรกไปยังตำแหน่งที่ระบุโดยชื่อที่สอง |
2 |
2. เพิ่มฟังก์ชั่นใหม่ให้กับโปรแกรม งานเก่า:โปรแกรมควรอ่านชื่อไฟล์สองไฟล์จากแป้นพิมพ์และคัดลอกไฟล์แรกไปยังตำแหน่งที่ระบุโดยชื่อที่สอง งานใหม่:โปรแกรมควรอ่านชื่อไฟล์สองไฟล์จากแป้นพิมพ์และคัดลอกไฟล์แรกไปยังตำแหน่งที่ระบุโดยชื่อที่สอง
หากไม่มีไฟล์ (ที่จะคัดลอก) ที่มีชื่อที่ระบุ โปรแกรมควรแสดงข้อความ «ไม่มีไฟล์» และพยายามอ่านชื่อไฟล์จากคอนโซลอีกครั้งก่อนที่จะอ่าน ชื่อของไฟล์ที่สอง (ปลายทาง) |
3 |
3. การเรียนรู้และฝึกฝนอัลกอริทึม
อ่านรายการคำและตัวเลขจากแป้นพิมพ์ แสดงคำบนหน้าจอตามลำดับจากน้อยไปหามาก และตัวเลขตามลำดับจากมากไปน้อย
ตัวอย่างอินพุต: เชอร์รี่
1
ถั่ว
3
แอปเปิ้ล
2
0
แตงโม
ตัวอย่างเอาต์พุต: แอปเปิล
3
ถั่ว
2
เชอร์รี่
1
0
แตงโม
|
GO TO FULL VERSION