[Java] Java กับ Stack
ใครก็ตามที่ได้เขียน Java คงต้องรู้จักกับ Stack ด้วยนะครับ เพราะว่าเวลาเราเขียนโปรแกรมสักตัวนึก อาจมีหลากหลายคลาส หลากหลายฟังก์ชันการทำงาน ทำให้เมื่อโปรแกรมมีขนาดใหญ่ขึ้น ก็จะทำให้เราสามารถไล่ดู Source Code ได้ยากขึ้น
ภาษา Java เป็นภาษาที่มีลักษณะการแสดง Error Message แบบ StackTrace คือแสดงให้เห็นว่า จุดที่มีสิทธิ์เกิด error ขึ้นมีที่ไหนบ้าง
ตัวผมเอง ซึ่งพื้นฐานการเขียนโปรแกรมเริ่มต้นที่ภาษา C เวลาเขียนโปรแกรมสักตัวนึงแล้วมี error เกิดขึ้น สิ่งที่ compiler จะบอกก็คือ จุดๆเดียว ที่มีความผิดพลาดเกิดขึ้น หากเราเขียนโปรแกรมที่มี error หลายจุด compiler ก็จะบอก error ที่จุดแรกเท่านั้น
สำหรับ Java แล้ว เมื่อเกิด Error ขึ้น การทำงานจะยังไม่สิ้นสุดทันที จะมีกระบวนการย้อนกลับ (Rollback) และ Error Message ที่แสดงออกมาให้ผู้เขียนโปรแกรมเห็น คือ ตัวหนังสือยาวๆ เลอะเทอะไปหมด ซึ่งอาจทำให้นักเขียน Java มือใหม่อาจตกใจได้ว่า "มันอะไรกันเนี่ย!!!"
วิธีดู Error ของ Java
จากที่ผมได้บอกไปก่อนหน้านี้แล้วว่า Java จะแสดง Error ในลักษณะ StackTrace คือเป็นชั้นของการทำงานลงไปเรื่อยๆ แน่นอนว่าถ้าใช้ library ก็ต้องวิ่งเข้า library นั้นๆ อย่างแน่นอน ดังนั้น เวลารันโปรแกรมแล้วหากเจอ StackTrace ขึ้นมา วิธีอ่านอย่างง่ายที่สุด คือ 'หาอะไรที่เป็นของเรา' เช่น StackTrace แสดงคลาสนู้นคลาสนี้ จากแพคเกจนู้นแพคเกจนี้เต็มไปหมด แต่อย่างน้อย มันต้องมีสักคลาสหรือเมธอดนึงที่เป็นส่วนที่เราเขียน แล้วก็จะพบว่า อ้อ ผิดตรงนี้นี่เอง!
สาเหตุที่ต้องหาอะไรที่เป็นของเราก็เพราะว่า library ต่างๆ เขามีการเผยแพร่สู่โลกอินเตอร์เน็ตแล้ว บางตัวอาจมีการใช้มายาวนาน ซึ่งผมก็ยังไม่เคยเจอสักทีว่าเป็น Error จาก library ของเค้าจริงๆ จะมีก็แต่เราอ่านเอกสาร (document) ที่เค้าอธิบายการใช้งานไม่ชัดเจน ไม่ถี่ถ้วนเอง
ข้อดีของ StackTrace
ผมว่าคงไม่ต้องบอกว่ามันดียังไง ไม่ดียังไง เพราะว่าแต่ละแบบก็ต้องมีจุดอ่อนจุดแข็งเป็นธรรมดา แต่สิ่งหนึ่งที่ผมเห็นได้ชัด คือ บางครั้ง เมื่อเป็นระบบใหญ่ๆ อาจเป็นการเชื่อมหลาย Project เข้าด้วยกัน Source Code บางอย่าง Editor เข้าถึงได้ แต่ Compiler เห็นเป็นอีกแบบ ส่งผลให้ StackTrace บางทีก็เข้าถึงไม่ได้ทั้งหมด สิ่งที่ programmer จะมองหาได้คือ ก่อนหรือหลังส่วนที่จะทำส่วนนั้นคืออะไร จากนั้นค่อยให้ Editor เข้าไปแก้ไขอีกที
ข้อควรระวัง
บางครั้ง programmer เข้าใจว่า การดัก Exception ควร printStackTrace เพื่อดูว่ามัน error ที่ไหน ในความรู้สึกจริงๆ ก็ใช่ครับ แต่ไม่ใช่ต้อง printStackTrace ทุกครั้งที่เข้า catch ต้องดูด้วยว่า เราได้ใช้ library อะไรที่มันจะทำตรงนี้อยู่แล้วหรือเปล่า แล้วเราไปทำซ้ำซ้อนหรือไม่ หรือว่าบางทีอาจเข้าใจตรงนี้ดีแล้ว แต่ก็ยังเกิดการซ้ำซ้อนอีก อาจเพราะดักหลายชั้นและให้มัน printStackTrace ดูทุกชั้น แน่นอนว่า console ของเราก็จะเต็มไปด้วย Message ที่ซ้ำไปซ้ำมาชวนสับสนได้
แตกประเด็นจาก Java Exception
ภาษา Java เป็นภาษาที่มีลักษณะการแสดง Error Message แบบ StackTrace คือแสดงให้เห็นว่า จุดที่มีสิทธิ์เกิด error ขึ้นมีที่ไหนบ้าง
ตัวผมเอง ซึ่งพื้นฐานการเขียนโปรแกรมเริ่มต้นที่ภาษา C เวลาเขียนโปรแกรมสักตัวนึงแล้วมี error เกิดขึ้น สิ่งที่ compiler จะบอกก็คือ จุดๆเดียว ที่มีความผิดพลาดเกิดขึ้น หากเราเขียนโปรแกรมที่มี error หลายจุด compiler ก็จะบอก error ที่จุดแรกเท่านั้น
สำหรับ Java แล้ว เมื่อเกิด Error ขึ้น การทำงานจะยังไม่สิ้นสุดทันที จะมีกระบวนการย้อนกลับ (Rollback) และ Error Message ที่แสดงออกมาให้ผู้เขียนโปรแกรมเห็น คือ ตัวหนังสือยาวๆ เลอะเทอะไปหมด ซึ่งอาจทำให้นักเขียน Java มือใหม่อาจตกใจได้ว่า "มันอะไรกันเนี่ย!!!"
วิธีดู Error ของ Java
จากที่ผมได้บอกไปก่อนหน้านี้แล้วว่า Java จะแสดง Error ในลักษณะ StackTrace คือเป็นชั้นของการทำงานลงไปเรื่อยๆ แน่นอนว่าถ้าใช้ library ก็ต้องวิ่งเข้า library นั้นๆ อย่างแน่นอน ดังนั้น เวลารันโปรแกรมแล้วหากเจอ StackTrace ขึ้นมา วิธีอ่านอย่างง่ายที่สุด คือ 'หาอะไรที่เป็นของเรา' เช่น StackTrace แสดงคลาสนู้นคลาสนี้ จากแพคเกจนู้นแพคเกจนี้เต็มไปหมด แต่อย่างน้อย มันต้องมีสักคลาสหรือเมธอดนึงที่เป็นส่วนที่เราเขียน แล้วก็จะพบว่า อ้อ ผิดตรงนี้นี่เอง!
สาเหตุที่ต้องหาอะไรที่เป็นของเราก็เพราะว่า library ต่างๆ เขามีการเผยแพร่สู่โลกอินเตอร์เน็ตแล้ว บางตัวอาจมีการใช้มายาวนาน ซึ่งผมก็ยังไม่เคยเจอสักทีว่าเป็น Error จาก library ของเค้าจริงๆ จะมีก็แต่เราอ่านเอกสาร (document) ที่เค้าอธิบายการใช้งานไม่ชัดเจน ไม่ถี่ถ้วนเอง
ข้อดีของ StackTrace
ผมว่าคงไม่ต้องบอกว่ามันดียังไง ไม่ดียังไง เพราะว่าแต่ละแบบก็ต้องมีจุดอ่อนจุดแข็งเป็นธรรมดา แต่สิ่งหนึ่งที่ผมเห็นได้ชัด คือ บางครั้ง เมื่อเป็นระบบใหญ่ๆ อาจเป็นการเชื่อมหลาย Project เข้าด้วยกัน Source Code บางอย่าง Editor เข้าถึงได้ แต่ Compiler เห็นเป็นอีกแบบ ส่งผลให้ StackTrace บางทีก็เข้าถึงไม่ได้ทั้งหมด สิ่งที่ programmer จะมองหาได้คือ ก่อนหรือหลังส่วนที่จะทำส่วนนั้นคืออะไร จากนั้นค่อยให้ Editor เข้าไปแก้ไขอีกที
ข้อควรระวัง
บางครั้ง programmer เข้าใจว่า การดัก Exception ควร printStackTrace เพื่อดูว่ามัน error ที่ไหน ในความรู้สึกจริงๆ ก็ใช่ครับ แต่ไม่ใช่ต้อง printStackTrace ทุกครั้งที่เข้า catch ต้องดูด้วยว่า เราได้ใช้ library อะไรที่มันจะทำตรงนี้อยู่แล้วหรือเปล่า แล้วเราไปทำซ้ำซ้อนหรือไม่ หรือว่าบางทีอาจเข้าใจตรงนี้ดีแล้ว แต่ก็ยังเกิดการซ้ำซ้อนอีก อาจเพราะดักหลายชั้นและให้มัน printStackTrace ดูทุกชั้น แน่นอนว่า console ของเราก็จะเต็มไปด้วย Message ที่ซ้ำไปซ้ำมาชวนสับสนได้
Java (Android) StackTrace |
แตกประเด็นจาก Java Exception