11. ความผิดปกติ(Exeption)

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

11. ความผิดปกติ(Exeption)

            ในบทก่อนๆจะเห็นว่าเวลาเขียนโปรแกรมแล้วรันไม่ผ่านตรง console จะขึ้นข้อความสีแดง หรือไม่อย่างนั้นก็อาจจะรันผ่านแต่กลับไม่มีอะไรแสดงออกมา เรื่องพวกนี้เป็นเรื่องที่เกิดจากความผิดปกติหรือ exception ที่ทำให้โปรแกรมไม่สามารถทำงานจบได้ตามที่เราต้องการ

Error กับ Exception

            Throwable (เปิด java doc ดูประกอบ) เป็นคลาสๆหนึ่งที่มีลูกอยู่ 2 คลาสคือ error กับ exception

            สำหรับ error

เป็นความผิดปกตินอกโปรแกรม หมายความว่าเขียนถูกแล้วแต่อาจจะเกิดปัญหาจากความผิดพลาดจากการรับส่งข้อมูลจากไฟล์ แบบอ่านไฟล์ไม่ได้ เป็นต้น

–          IOError อุปกรณ์รับส่งข้อมูลทำงานไม่ได้

–          NoClassDefFoundError คือเรียกคลาสแต่จริงๆไม่มีคลาสนั้น

–          StackOverflowError คือ หน่วยความจำระหว่างเรียกเมท็อดไม่พอ นี่เป็คนความผิดพลาดจากการเขียนโปรแกรมของเราเอง เกิดจากการเรียก recursive ฟังก์ชันมากไป

สำหรับ exception

เป็นความผิดปกติที่มีสาเหตุอาจจะมาจากการเขียนโค๊ดผิด ความผิดปกติจะเกิดขึ้นตอนประมวลผล

โปรแกรมซึ่งการป้องกันความผิดปกติจะทำที่ตรงนี้ โปรแกรมจะได้ไม่ต้องหยุดทำงานทั้งๆที่ยังทำไม่จบ

–          AritmaticException การหารจำนวนเต็มด้วยศูนย์(ไม่นิยามในทางคณิตศาสตร์)

–          IndexOutOfBoundException เรียกใช้อาร์เรย์ช่องที่ไม่มี

–          NullPointerException การใช้ตัวแปรหรือเมท็อดที่เป็น null

–          FileNotFoundException  หาไฟล์ไม่เจอ

จะเห็นว่าสำหรับ exception เป็นอะไรที่แก้ไขได้ทันที เช่น หารเลขด้วยศูนย์พอมันผิดก็ไปแก้ให้เรียบร้อย โปรแกรมก็ทำงานต่อได้จนจบแล้ว

 

รูป 11-1

เขียนโปรแกรมขึ้นมา ให้ b เก็บค่าของ 5/a โดยที่ a มีค่าเป็น 0 โปรแกรมจะแสดงผลตามข้างล่าง

 

รูป 11-2

นี่เป็นตัวอย่างง่ายๆแต่ถ้านึกถึงโปรแกรมขนาดใหญ่ๆยาวแล้วเกิดข้อผิดพลาดขึ้นมาการแก้ปัญหาก็ลำบากอยู่เหมือนกัน และก็จริงที่ว่าโปรแกรมมันก็แจ้งให้เราทราบว่าเกิด exception อะไรขึ้นมาก็จริงแต่การทำแบบนี้โปรแกรมก็จะหยุดการทำงานไปด้วย ดังนั้นเราจึงควรที่จะใช้การจัดการกับ exception เพื่อเป็นการเตือนผู้ใช้ว่าต้องทำอย่างไร เพราะต้องนึกว่าหากเป็นผู้ใช้โปรแกรมกำลังใช้งานโปรแกรมอยู่แล้วมัน error ดับปิดโปรแกรมไปก็คงจะงง ก็ควรจะไม่ทำให้เกิดเหตุการณ์อย่างนั้นพร้อมกับการแก้ไข เช่น ให้ใส่ตัวเลขแต่ใส่ตัวหนังสือมาก็ให้แจ้งไม่ถูกต้องใส่ตัวเลข ไม่ใช่ว่าไม่แจ้งอะไรแล้วก็ดับไปเลย

 

จับ exception ด้วย try-catch

วิธีการหนึ่งสำหรับการจัดการกับ exception ทำด้วยสิ่งที่เรียกว่า surround with try/catch โดย try/catch นั้นจะประกอบไปด้วยคำสั่ง 2 คำสั่งคือกลุ่ม try(ลอง) กับ กลุ่ม catch(จับ) ง่ายๆก็คือให้ลองทำสิ่งที่อยู่ใน try ดูก่อน หากไม่สามารถทำได้เพราะมี exception ให้จับexception ด้วยการจับไว้ด้วย catch

 

รูป11-3

โปรแกรมนี้ก็คือต้องการให้ใส่ตัวเลขจำนวนเต็มเพื่อนำมาแสดงผล แต่ก็มีที่ผู้ใช้อาจจะใส่สิ่งที่ไม่ใช่ตัวเลขอย่างตัวอักษรหรือข้อความเข้ามาได้ ซึ่งถ้าเกิดเหตุการณ์นี้โปรแกรมจะ error เลยเพราะต้องบรรทัดที่ 12 คำสั่งบอกให้รับ int เข้ามา

สิ่งที่โปรแกรมฟ้อง หากใส่ข้อมูลผิดประเภท

 

รูป 11-4

สิ่งที่โปรแกรมฟ้องก็คือ InputMismatchException เพื่อแก้ปัญหานี้เราก็จับ InputMismatchExceptionใส่ไว้ใน catch ซะให้เรียบร้อย

 

รูป11-5

นี่คือรูปแบบการทำงานของ try/catch กลุ่มคำสั่งที่อยู่ใน try คือคำสั่งเมื่อกี้ แต่รอบนี้เราป้องกันไม่ให้โปรแกรมจบการทำงานไปเองด้วย catch ซึ่งใน catch ก็ใส่ชื่อของ exception ไป พร้อมกับคำสั่งเพื่อให้รู้ว่าความผิดพลาดเกิดตรงนี้และแก้ไขด้วยอะไร

 

รูป 11-6

เพียงเท่านี้ปัญหาก็จะหมดไปโปรแกรมสามารถทำงานได้ปกติจบครบจบกระบวนความ

การโยนความผิดปกติด้วย throw – throws

ปกติถ้า main ไปเรียก เมท็อด A แล้ว A ก็ไปเรียกเมท็อด B แต่เมท็อด B ดันมี exception หาก B ไม่ได้ดักจับ exception เอาไว้ความผิดปกติก็จะไปหา A ถ้า A ยังไม่จับสุดท้ายก็จะไปที่ main และถ้า main ยังไม่ทำอะไรโปรแกรมก็จะไม่ทำงานในที่สุด การโยนความผิดปกติก็เพื่อให้เมท็อดนั้นทำงานได้ปกติโดยให้เมท็อดอื่นเป็นผู้จับความผิดปกตินี้เอง

วิธีที่ง่ายที่สุดก็คือไปประกาศที่หัวเมท็อดให้หมดเรื่องหมดราวไป ด้วยคีย์เวิร์ด throws  ตามด้วยชื่อของคลาสที่เกิด exception

 

รูป 11-7

บรรทัดที่ 19 : โยน exception ออกจากเมท็อด เพื่อให้ main ทำการจับความปิดปกตินี้

จะรู้ได้ยังไงว่าต้องใช้ exception อะไร

ก็เป็นธรรมดาที่ตอนแรกจะไม่รู้ว่าจะต้องใช้ exception อะไร แต่พอเห็น error สักพักก็จะพอเดาได้ว่าใช้ exception อะไรเพราะชื่อมันเหมือนๆกันกับที่เวลาเวลา error แสดงออกทาง console แต่ถ้ายังไม่รู้จะใช้อะไรจริงๆ ก็ใช้ Exception ไปก่อน เพราะทุกคลาสของ exception จะเป็นลูกมากจากคลาส Exception

 

รูป 11-8

แก้ไขโค๊ดจากข้างบน 11-1โดยให้มีการดักจับ(try-catch) ความผิดปกติโดย Exception ก็จะแก้ไขได้ทุกความผิดปกติ แต่มันก็เป็นข้อเสียด้วยเหมือนกันคือพอผิดปกติมาทีเราก็จะไม่รู้ว่ามันผิดปกติเพราะอะไร

 

รูป 11-9

การใช้งานอ็อปเจ็คของสิ่งผิดปกติ

            คงจะเห็นว่าใน catch นั้นจะมี ตัว e ตามท้ายชื่อคลาสที่เป็น exception ซึ่งนี่ก็คือตัวแปรสำหรับอ้างอิงอ็อปเจ็คของ exception ซึ่ง e สามารถใช้ประโยชน์ได้จากการเรียกใช้เมท็อดของคลาส Throwable

–          e.getMessage () ใช้แสดงความผิดปกติ เป็นสตริง

–          e.printStackTrace() ใช้บอกว่าผิดตริงไหน

–          e.toString() คืนค่าสตริงบรรยายสิ่งที่ปิด

 

แผนผังการเรียนเขียนโปรแกรม

 

___________________

รับสอนเขียนJAVA , C# , VB.net

โทร 0853507540

___________________

 

ใส่ความเห็น