CodeGym /จาวาบล็อก /สุ่ม /ระดับเก่า 09
John Squirrels
ระดับ
San Francisco

ระดับเก่า 09

เผยแพร่ในกลุ่ม

ความรู้เทียบกับทักษะ

ระดับเก่า 09 - 1วิทยาลัยสอนเราว่าไม่มีความแตกต่างอย่างมากระหว่างทฤษฎีและการปฏิบัติ แน่นอนคุณเข้าใจว่าไม่เหมือนกัน แต่คุณไม่เห็นความแตกต่างหลัก ยังมีหนึ่ง คนส่วนใหญ่ใส่เครื่องหมายความเท่าเทียมกันระหว่าง "ฉันรู้" และ "ฉันทำได้" คุณ? แล้วตัวอย่างล่ะ?
  1. ฉันรู้ว่าการสูบบุหรี่ไม่ดีสำหรับฉัน แต่ฉันสูบ
  2. ฉันรู้ว่าอาหารจานด่วนไม่ดีสำหรับฉัน แต่ฉันก็กินมัน
  3. ฉันรู้กฎจราจรแต่ฉันขับรถไม่เป็น
  4. ฉันรู้ว่าการวิ่งเหยาะๆ นั้นดีสำหรับฉัน แต่ฉันไม่วิ่งเหยาะๆ ในตอนเช้า
บ่อยครั้งที่ผู้คนใช้ "ฉันรู้" แทน "ฉันทำได้" เป็นตัวอย่างที่ดีกับกฎจราจร ถ้าคนรู้ระเบียบ รู้วิธีขับ แสดงว่าเขาขับได้? ไม่. ถ้าเขาคิดว่าเขารู้วิธีขับรถล่ะ? เหตุใดเขาจึงต้องการผู้สอน – เขารู้ทุกอย่างแล้ว เมื่อคุณแน่ใจว่าคุณรู้ทุกอย่างแล้ว คุณอาจไม่ได้เรียนรู้อะไรใหม่ และถ้ามั่นใจว่ารู้หมดคงไม่เรียนหรอก ความคิดเช่นนี้จะไม่ข้ามความคิดของคุณ และนั่นหมายความว่าคุณจะพลาดโอกาสที่ยอดเยี่ยมในการเรียนรู้บางอย่าง วิทยาลัยปกติให้ความรู้แก่คุณเท่านั้น คุณจะต้องได้รับทักษะด้วยตัวคุณเอง แต่ฉันได้ยินอะไร คุณเคยฝึกปฏิบัตินอกเหนือจากทฤษฎีในวิทยาลัยของคุณหรือไม่? โอเค ถ้าคุณเรียนคณะฟิสิกส์สร้างแบบจำลองการทำงานของเครื่องจักรไอน้ำที่มีประสิทธิภาพอย่างน้อย 20% ฉันพนันได้เลยว่าคุณรู้วิธีทำ แต่คุณจะทำไม่ได้จริง ๆ ใช่ไหม คุณเป็นนักเคมี ? ทำแป้งไร้ควัน. คุณรู้วิธี แต่คุณทำไม่ได้ ฮ่า? นักคณิตศาสตร์ คุณคือ? คำนวณวิถีกระสุนปืนใหญ่ อย่าลืมคำนึงถึงรูปร่างของเปลือกด้วย จุดทางคณิตศาสตร์บินไม่ได้ในชีวิตจริง และไม่มีม้าทรงกลม ระดับเก่า 09 - 2นักชีววิทยา? แยกเพนิซิลลิน รานี้เติบโตบนแตงโม ดังนั้นคุณรู้ไหม คุณรู้ได้อย่างไร - ยอดเยี่ยม! คุณทำได้มั้ย? นักเศรษฐศาสตร์?คาดการณ์การเติบโตของราคาน้ำมัน เสร็จแล้ว? และตอนนี้เปลี่ยนเป็น $2,000 หรือ $200,000 ต่อปีตามการคาดการณ์ของคุณ คุณเคยเล่น FOREX ไหม? เพื่อเงินจริง? หรือคุณเพิ่งรู้ว่ามันคืออะไร? เศรษฐศาสตร์ระหว่างประเทศ? อลังการ! ฉันจะเปิดบริษัทนอกอาณาเขตได้ที่ไหน ในฮ่องกง ไอร์แลนด์ หรือในสหรัฐอเมริกา ทำไม แม้ว่าคุณจะรู้ แต่ที่น่าสงสัยคือคุณแทบจะไม่สามารถทำได้ เนื่องจากคุณไม่เคยทำมันมาก่อน คุณไม่มีเงื่อนงำวิธีการทำแม้แต่น้อย โอ้ คุณไม่ได้เรียนวิชานั้นในวิทยาลัยเหรอ? ฉันมีสิทธิ์อะไรที่จะมอบงานที่คุณไม่ได้เตรียมไว้ให้? เพราะนี่คืองานของชีวิตจริง นี่คือแบบฝึกหัดสิ่งที่คุณได้เรียนในวิทยาลัยคือ: ม้าทรงกลม การแข่งขันที่สมบูรณ์แบบ - ไม่มีสิ่งนี้ในชีวิตจริง แต่ทำไมฉันลืมพูดถึงผู้เชี่ยวชาญด้านการตลาด ? วิธีที่ดีที่สุดในการใช้จ่าย $500 ของฉันเพื่อให้ผู้คนจำนวนมากที่สุดเท่าที่จะเป็นไปได้ทราบเกี่ยวกับการบรรยายของฉันคืออะไร ในการโฆษณา? คุณทราบหรือไม่ว่าไม่เพียงแต่โฆษณาแบบคลาสสิกเท่านั้นที่ล้าสมัยไปแล้ว แต่ยังรวมถึงแนวคิดของ USP (ข้อเสนอการขายที่ไม่เหมือนใคร) ซึ่งฉันแน่ใจว่าคุณได้รับการสอนในวิทยาลัยว่าเป็นยาครอบจักรวาลที่ไม่เหมือนใคร ลืมคุณรู้อะไร ถามตัวเอง - ฉันจะทำอะไรได้บ้าง มีประโยชน์ฉันหมายถึง? สิ่งที่ผู้คนจะจ่ายเงินเพื่อ? เงินดี ฉันหมายถึง? เพื่อนๆ มาแสดงความขอบคุณต่อหลักสูตรที่ยอดเยี่ยมอย่าง CodeGym กันเถอะ ด้วยเหตุนี้ คุณจะไม่เพียงแต่รู้วิธีการเขียนโปรแกรมเท่านั้น แต่คุณยังสามารถทำได้จริงอีกด้วย คุณยังสามารถได้งานทำและได้เงินที่ดีในอีกไม่กี่ปีข้างหน้า ฉันหวังว่าเงินจำนวนนี้จะเพียงพอสำหรับการใช้ชีวิตที่ดีและสะดวกสบาย ฉันจะพูดอีกครั้งเพื่อให้คุณจำไว้ว่า: ไม่สำคัญว่าคุณรู้อะไร สิ่งเดียวที่สำคัญคือทักษะที่เป็นประโยชน์ที่คุณมี ซึ่งผู้คนจะกระตือรือร้นที่จะจ่ายเงินให้คุณ ยิ่งคุณเข้าใจสิ่งนี้เร็วเท่าไหร่ก็ยิ่งดีเท่านั้น

คุณมาถึงระดับใหม่แล้ว

ระดับ 9

ระดับเก่า 09 - 3

1 Risha การติดตามสแต็ก

ระดับเก่า 09 - 4- เฮ้! วันนี้จะมาบอกว่าสแต็คเทรซคืออะไร แต่ก่อนอื่นให้ฉันอธิบายคุณว่ากองคืออะไร - ลองนึกภาพกองเอกสาร - การมอบหมายงานให้กับเสมียนคนหนึ่ง การมอบหมายใหม่สามารถวางไว้บนสุดของสแต็ก และเขาจะรับงานจากบนสุดของสแต็ก ดังนั้นการมอบหมายจะไม่ทำตามลำดับก่อนหลัง ทุกครั้งที่เสมียนรับมอบหมายงานสุดท้าย โครงสร้างคอลเลกชันดังกล่าวเรียกว่าสแต็ก . - ใน Java มีคอลเลกชันพิเศษ - Stack คอลเลกชันนี้มีวิธีการ «เพิ่มองค์ประกอบ» และ «ใช้(รับ/นำออกไป) องค์ประกอบ» ดังที่คุณทราบแล้ว องค์ประกอบสุดท้ายที่เพิ่มจะถูกนำไปใช้ก่อน - ฮัม ไม่น่าจะยากนะผมว่า - ดี. จากนั้นให้ฉันอธิบายว่าสแต็กเทรซ คืออะไรเป็น. - ลองนึกภาพว่าในฟังก์ชัน Java Аเรียกฟังก์ชัน Bและฟังก์ชันหลังเรียกฟังก์ชันCซึ่งในทางกลับกันเรียกฟังก์ชัน D ดังนั้น หากต้องการออกจากฟังก์ชัน Bคุณต้องออกจากฟังก์ชัน C ก่อนและต้องออกจากฟังก์ชัน D ก่อน สิ่งนี้คล้ายกับสแต็กมาก - และความคล้ายคลึงกันคืออะไร? - ในสแต็ก เพื่อไปยังการมอบหมายบางอย่าง คุณต้องทำงานมอบหมายทั้งหมดให้เสร็จก่อน - มันก็ค่อนข้างจะคล้าย ๆ กัน แต่ฉันไม่แน่ใจว่าฉันเข้าใจทุกอย่างถูกต้องหรือไม่ - ดูนี่. ใน Java สแต็คคือชุดขององค์ประกอบ มันเหมือนกระดาษเป็นปึกๆ ในการรับแผ่นที่สามจากด้านบนคุณต้องใช้แผ่นงานที่สอง แต่ก่อนหน้านั้นคุณต้องใช้แผ่นแรก คุณสามารถวางและนำแผ่นงานได้ตลอดเวลา แต่คุณสามารถวางได้เฉพาะด้านบนและดึงจากด้านบนเท่านั้น เช่นเดียวกับการเรียกใช้ฟังก์ชัน ฟังก์ชัน Аเรียกฟังก์ชัน Bฟังก์ชันหลังเรียกฟังก์ชัน C หากต้องการออกจากАคุณต้องออกจากB ก่อน และในการทำเช่น นี้ คุณต้องออกจากC - รอสักครู่. ถ้าฉันเข้าใจถูกต้อง สแต็คทั้งหมดจะกลายเป็น «สามารถเก็บแผ่นงานสุดท้ายที่วางบนสแต็กได้เท่านั้น» และ «ก่อนอื่น ฟังก์ชันที่เรียกใช้ล่าสุดควรออก» อย่างนั้นเหรอ? - ใช่. ดังนั้น ลำดับของการเรียกใช้ฟังก์ชันจึงเป็น «function call stack» หรือเรียกง่ายๆ ว่า «call stack» ฟังก์ชันที่เรียกใช้สุดท้ายจะต้องถูกยกเลิกก่อน ลองดูตัวอย่าง: ระดับเก่า 09 - 5- ตกลง ฉันเดาว่าทุกอย่างชัดเจนด้วยการเรียกใช้ฟังก์ชัน แต่StackTraceElement นี้คือ อะไร - เครื่องเสมือน Java บันทึกการเรียกใช้ฟังก์ชันทั้งหมด เพื่อจุดประสงค์นี้จึงมีคอลเลกชันพิเศษ - สแต็ค เมื่อฟังก์ชันหนึ่งเรียกใช้ฟังก์ชันอื่น JVM จะวางองค์ประกอบใหม่StackTraceElementลงในสแต็กนี้ เมื่อฟังก์ชันสิ้นสุดลง อิลิเมนต์จะถูกลบออกจากสแต็ก ดังนั้น สแต็คนี้จะเก็บข้อมูลที่เป็นปัจจุบันอยู่เสมอเกี่ยวกับสถานะปัจจุบันของ «การเรียกฟังก์ชันสแตก» - ทุกStackTraceElementมีข้อมูลเกี่ยวกับวิธีการที่เรียกว่า ดังนั้นคุณสามารถรับชื่อเมธอดนี้ได้โดยใช้getMethodName - ตัวอย่างด้านบนแสดงให้เห็นว่า:
  1. รับ «กองโทร»:
  2. วนซ้ำอาร์เรย์โดยใช้ลูปfor- each ฉันหวังว่าคุณจะยังไม่ลืมมัน
  3. พิมพ์ชื่อเมธอดไปที่System.out
- สิ่งที่น่าสนใจและดูเหมือนง่าย ขอบคุณริชา!

2 ดิเอโก งานแสดงการติดตามสแต็ก

- เฮ้ อามีโก้! นี่เป็นงานเล็กๆ น้อยๆ ในการแสดงสแต็กเทรซบนหน้าจอ
งาน
1 แต่ละเมธอดควรส่งคืน StackTrace
Write ห้าเมธอดที่เรียกหากัน แต่ละเมธอดควรส่งคืน StackTrace
2 StackTrace อีกครั้ง
เขียนห้าวิธีที่โทรหากัน แต่ละเมธอดควรส่งคืนชื่อเมธอดผู้โทร คุณสามารถรับวิธีการโทรโดยใช้ StackTrace
3 เมธอดควรส่งคืนหมายเลขบรรทัดของโค้ด เมธอดนี้ถูกเรียกจากเมธอด
Write ห้าเมธอดที่เรียกหากัน แต่ละเมธอดควรส่งคืนหมายเลขบรรทัดของโค้ดที่เรียกใช้เมธอดนี้ ใช้ฟังก์ชันelement.getLineNumber( )
4 สแต็กเทรซของ 10 สาย
เขียนโค้ดเพื่อรับสแต็กเทรซของ 10 สาย
5 วิธีการควรส่งคืนผลลัพธ์ - ความลึกของการติดตามสแต็ก
เขียนวิธีการที่แสดงและส่งคืนความลึกของการติดตามสแต็ก ความลึกของการติดตามสแต็กคือจำนวนของเมธอด (จำนวนของอิลิเมนต์ในรายการ)

3 Elly ข้อผิดพลาดและข้อยกเว้น

- เฮ้ อามีโก้! วันนี้เรามีบทเรียนที่น่าสนใจมาก ฉันจะบอกคุณเกี่ยวกับข้อยกเว้น ข้อยกเว้นเป็นกลไกพิเศษในการควบคุมข้อผิดพลาดในโปรแกรม ต่อไปนี้คือตัวอย่างบางส่วนของข้อผิดพลาดที่อาจเกิดขึ้นในโปรแกรม:
  1. โปรแกรมพยายามเขียนไฟล์ให้เต็มดิสก์
  2. โปรแกรมพยายามเรียกเมธอดของตัวแปรที่เก็บการอ้างอิงค่าว่าง
  3. โปรแกรมพยายามที่จะหารตัวเลขด้วย 0
การกระทำเหล่านี้ส่งผลให้เกิดข้อผิดพลาด โดยปกติแล้วจะนำไปสู่การปิดโปรแกรม - ไม่มีประเด็นใดที่จะดำเนินการโค้ดต่อไป - ทำไมถึงเป็นเช่นนั้น? - มีความรู้สึกอย่างไรในการหมุนล้อเมื่อรถตกหน้าผา? - คุณหมายความว่าโปรแกรมควรจะจบลงหรือไม่? - ใช่. นั่นเป็นวิธีที่เคยเป็นมาก่อน ข้อผิดพลาดใด ๆ ที่นำไปสู่การยุติโปรแกรม - เป็นการตัดสินใจที่ชาญฉลาดมาก - จะดีกว่าไหมถ้าพยายามทำงานต่อไป? - ใช่. คุณได้พิมพ์ข้อความจำนวนมากใน MS Word บันทึกแล้ว ยังไม่ได้บันทึก แต่โปรแกรมจะบอกคุณว่าทุกอย่างเรียบร้อยดี และคุณพิมพ์ต่อไป โง่ใช่มั้ย - ใช่. - จากนั้นโปรแกรมเมอร์ก็คิดวิธีที่น่าสนใจ:แต่ละฟังก์ชันส่งคืนสถานะการทำงาน 0 หมายความว่าฟังก์ชันทำงานตามที่ควรจะเป็น ค่าอื่น ๆ – นั่นคือมีข้อผิดพลาด : ค่านี้เป็นรหัสข้อผิดพลาด - แต่วิธีนี้มีข้อเสีย. หลังจากการเรียกใช้ฟังก์ชัน (!) แต่ละครั้ง คุณต้องตรวจสอบรหัส (หมายเลข) ที่ส่งคืนโดยฟังก์ชัน ประการแรก มันไม่สะดวก: โค้ดการจัดการข้อผิดพลาดแทบไม่ค่อยได้ดำเนินการ แต่คุณต้องเขียนมันเสมอ ประการที่สอง ฟังก์ชันต่างๆ มักจะส่งคืนค่าต่างๆ กัน - จะทำอย่างไรกับฟังก์ชันเหล่านั้น - ใช่. นั่นคือสิ่งที่ฉันกำลังจะถาม - แล้วอนาคตที่สดใสก็มาถึง - ข้อยกเว้นและการจัดการข้อผิดพลาดได้ปรากฏขึ้น นี่คือวิธีการทำงาน:
  1. เมื่อเกิดข้อผิดพลาด Java virtual machine จะสร้างวัตถุพิเศษ – ข้อยกเว้น – ที่มีข้อมูลทั้งหมดเกี่ยวกับข้อผิดพลาด สำหรับข้อผิดพลาดที่แตกต่างกันมีข้อยกเว้นที่แตกต่างกัน
  2. จากนั้นข้อยกเว้นนี้บังคับให้โปรแกรมขัดจังหวะฟังก์ชันปัจจุบันทันที และฟังก์ชันถัดไป จนกว่าจะออกจากเมธอดหลัก หลังจากนั้นโปรแกรมจะสิ้นสุดลง นักพัฒนา Java เรียกกระบวนการนี้ว่า «ย้อนกลับ call stack»
- แต่คุณบอกว่าโปรแกรมจะไม่ออกอย่างแน่นอน - ถูกต้องเพราะมีวิธีจับข้อยกเว้น เมื่อใดก็ตามที่คุณต้องการ คุณสามารถเขียนโค้ดพิเศษเพื่อรับข้อยกเว้นเหล่านี้และทำสิ่งที่สำคัญได้ - ในการทำเช่น นี้มีการก่อสร้างแบบลองจับ พิเศษ ดูวิธีการทำงาน: ระดับเก่า 09 - 6- ทำไม «หลังจากเรียก method1 จะไม่แสดง» จะไม่ปรากฏบนหน้าจอใช่หรือไม่ - ฉันดีใจที่คุณถามเกี่ยวกับเรื่องนี้ ในบรรทัดที่ 25 มีการหารด้วยศูนย์ สิ่งนี้นำไปสู่ข้อผิดพลาด - ข้อยกเว้น เครื่องเสมือน Java สร้างวัตถุArithmeticExceptionที่มีข้อมูลข้อผิดพลาด วัตถุนี้เป็นข้อยกเว้น - มีข้อยกเว้นเกิดขึ้นภายในเมธอดmethod1( )ส่งผลให้วิธีนี้ยุติลงทันที นอกจากนี้ยังจะนำไปสู่การยุติวิธีการmainหากไม่มีบล็อกtry-catch - หากมีข้อยกเว้นเกิดขึ้นภายในบล็อกลอง ข้อผิดพลาดนั้นจะถูกดักจับในบล็อกจับ รหัสที่เหลือในการพยายาม บล็อก จะไม่ถูกดำเนินการ การดำเนินการของบล็อกcatchจะเริ่มต้นทันที - ฉันไม่ค่อยเข้าใจ - กล่าวอีกนัยหนึ่ง รหัสนี้ทำงานดังนี้:
  1. หากมีข้อยกเว้นเกิดขึ้นภายใน บล็อก tryโค้ดในบล็อกนี้จะไม่ถูกดำเนินการอีกต่อไป แต่การดำเนินการของ block catchจะเริ่มต้นขึ้น
  2. หากไม่มีข้อยกเว้นเกิดขึ้น บล็อก try จะถูกดำเนินการจนจบและcatchจะไม่ถูกดำเนินการ
- อะแฮ่ม! - ลองนึกภาพว่าหลังจากการเรียกใช้เมธอดแต่ละครั้ง เราจะตรวจสอบว่าเมธอดที่เรียกนั้นสิ้นสุดลงเองหรือเนื่องจากข้อยกเว้น หากมีข้อยกเว้น JVM จะเริ่มดำเนินการจับบล็อกหากมี และจับข้อยกเว้น หากไม่มี catch block JVM จะยุติเมธอดปัจจุบัน จากนั้นการตรวจสอบเดียวกันจะเริ่มต้นในวิธีการที่เรียกว่าวิธีการปัจจุบัน - ตอนนี้ฉันคิดว่าฉันเข้าใจแล้ว - ไม่เป็นไร. - และข้อยกเว้นนั้นคืออะไรใน catch block? - ข้อยกเว้นทั้งหมดเป็นคลาสที่สืบทอดมาจากคลาสข้อยกเว้น เราสามารถจับพวกมันได้โดยระบุคลาสของมันในการจับบล็อกหรือทั้งหมดพร้อมกันโดยระบุข้อยกเว้นของคลาสพาเรนต์ทั่วไป จากนั้นจากตัวแปร e (ตัวแปรนี้เก็บข้อมูลอ้างอิงของวัตถุยกเว้น) คุณจะได้รับข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับข้อผิดพลาด - ยอดเยี่ยม! และถ้าวิธีการของฉันเกิดข้อยกเว้นที่แตกต่างกัน ฉันจะจัดการด้วยวิธีอื่นได้ไหม - คุณต้อง คุณสามารถทำได้ดังนี้: ระดับเก่า 09 - 7- บล็อก try อาจมีcatchบล็อกหลายอัน ซึ่งแต่ละอันจะตรวจจับข้อยกเว้นตามประเภทของมัน - อืม ฉันเข้าใจแล้ว แน่นอนฉันจะไม่เขียนอะไรแบบนี้ด้วยตัวเอง อย่างไรก็ตาม ฉันจะไม่กลัวถ้าฉันพบรหัสดังกล่าว

4 Elly, RuntimeException, โยน

ระดับเก่า 09 - 8- ฉันตัดสินใจที่จะนำเสนอหัวข้ออื่นในวันนี้ ใน Java ข้อยกเว้นทั้งหมดแบ่งออกเป็นสองประเภท – ควบคุม/ตรวจสอบและไม่ควบคุม/ไม่ตรวจสอบ ข้อยกเว้นที่ตรวจสอบจะต้อง ตรวจจับ ได้ ที่ไม่ได้ตรวจสอบสามารถตรวจจับได้แต่ไม่จำเป็น - เป็นไปได้ไหมที่จะโยนข้อยกเว้นในรหัสโดยตั้งใจ? - ในโค้ดของคุณ คุณสามารถโยนข้อยกเว้นได้เอง คุณสามารถเขียนข้อยกเว้นของคุณเองได้ แต่เราจะเจาะลึกลงไปในหลุมนี้ในภายหลัง ตอนนี้เรามาเรียนรู้วิธีการทำงานกับข้อยกเว้นที่ส่งโดยเครื่องเสมือน Java - ตกลง. - ถ้ายกเว้นClassNotFoundExceptionและFileNotFoundExceptionถูกโยน (ปรากฏ) ในเมธอด โปรแกรมเมอร์ต้องระบุในลายเซ็นของเมธอด (เมธอดเฮดเดอร์) มีการตรวจสอบข้อยกเว้นดังกล่าว มักจะมีลักษณะดังนี้: ระดับเก่า 09 - 9- ดังนั้น เราแค่เขียนการโยนและระบุข้อยกเว้นโดยคั่นด้วยเครื่องหมายจุลภาค ขวา? อย่างนั้นเหรอ? - ใช่. แต่มีอีกสิ่งที่น่าสนใจ เพื่อให้ตัวอย่างด้านล่างได้รับการรวบรวม เมธอดที่เรียกmethod1()จึงต้องจับข้อยกเว้นเหล่านี้หรือส่งต่อ หากคุณต้องการส่งข้อยกเว้นที่ ตรวจสอบแล้วไปข้างหน้า คุณต้องระบุในส่วนหัวของเมธอด - อีกครั้ง หากใน เมธอด หลักคุณต้องการเรียกเมธอดที่มีวลีส่วนหัวโยน FileNotFoundException, …คุณต้องทำหนึ่งในสองสิ่งนี้:
  1. เพื่อจับข้อยกเว้น FileNotFoundException, …
    คุณจะต้องห่อโค้ดที่คุณเรียกใช้เมธอดที่เป็นอันตรายด้วยบล็อกtry-catch
  2. ไม่จับข้อยกเว้น FileNotFoundException, …
คุณจะต้องเพิ่มข้อยกเว้นเหล่านี้ในรายการ โยนของวิธีการของคุณmain - คุณจะยกตัวอย่างให้ฉันได้ไหม - ดูที่นี่: ระดับเก่า 09 - 10- ตัวอย่างนี้จะไม่ถูกคอมไพล์ เนื่องจากเมธอดmainเรียกใช้เมธอด method1() ซึ่งจะโยนข้อยกเว้นที่ต้องตรวจจับได้ - ในการคอมไพล์ตัวอย่าง คุณต้องเพิ่มการจัดการข้อยกเว้นให้กับเมธอดmain คุณทำได้สองวิธี: ระดับเก่า 09 - 11- และที่นี่เราจับมันโดยใช้try-catch : ระดับเก่า 09 - 12- มันชัดเจนขึ้น แต่น้อยมาก - ดูตัวอย่างด้านล่าง: ระดับเก่า 09 - 13- ยังมีข้อยกเว้นอยู่ - RuntimeExceptionและคลาสที่สืบทอดมาไม่จำเป็นต้องจับหรือโยน สิ่งเหล่านี้เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ ข้อยกเว้นเหล่านี้ถือว่าคาดเดาได้ยาก ดังนั้นจึงแทบจะเป็นไปไม่ได้เลยที่จะคาดการณ์การเกิดขึ้น คุณสามารถทำสิ่งเดียวกันกับพวกเขา ได้ แต่ไม่จำเป็นต้องระบุในการโยน

5 ริชา กลิ้งกองถ่าย วิธีทำอยู่ในข้อยกเว้น

- ฉันอยากจะบอกคุณอีกเล็กน้อยเกี่ยวกับวิธีการทำงานของข้อยกเว้น ตัวอย่างด้านล่างอธิบายว่า: ระดับเก่า 09 - 14- ฉันไม่เข้าใจ - ตกลง. ฉันจะอธิบายสิ่งที่เกิดขึ้น - ในตัวอย่างด้านซ้าย เราเรียกเมธอดหลายตัวตามลำดับลูกโซ่ ใน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ไม่ถูกตรวจจับ แต่ส่งต่อไปยังเมธอดการโทร ระดับเก่า 09 - 19- ตอนนี้เริ่มชัดเจนขึ้นแล้ว ข้อยกเว้นเหล่านี้ไม่ใช่เรื่องง่าย - ดูเหมือนจะเป็นเช่นนั้นเท่านั้น อันที่จริง มันเป็นหนึ่งในสิ่งที่ง่ายที่สุดใน 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
แตงโม
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION