ในบทก่อนๆจะเห็นว่าเวลาเขียนโปรแกรมแล้วรันไม่ผ่านตรง 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() คืนค่าสตริงบรรยายสิ่งที่ปิด
Tag ที่น่าสนใจ: java exception error try-catch inputmismatchexception filenotfoundexception stackoverflowerror noclassdeffounderror arithmeticexception indexoutofboundsexception nullpointerexception file_handling error_handling programming
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com