- 1 1. บทนำ
- 2 2. Exception Handling คืออะไรใน Java?
- 3 3. throw คืออะไร?
- 4 4. throws คืออะไร?
- 5 5. ความแตกต่างระหว่าง throw และ throws
- 6 6. แนวปฏิบัติที่ดีที่สุดสำหรับการใช้ throws
- 7 7. รูปแบบการจัดการข้อยกเว้นเชิงปฏิบัติ
- 8 8. คำถามที่พบบ่อย (FAQ)
- 8.5.1 Q1. ความแตกต่างหลักระหว่าง throw กับ throws คืออะไร?
- 8.5.2 Q2. ควรระวังอะไรบ้างเมื่อใช้ throws?
- 8.5.3 Q3. สามารถใช้ throw และ throws ร่วมกันได้หรือไม่?
- 8.5.4 Q4. จะประกาศหลายข้อยกเว้นด้วย throws อย่างไร?
- 8.5.5 Q5. ควรใช้ throws กับ unchecked exceptions หรือไม่?
- 8.5.6 Q6. การประกาศ Exception หรือ Throwable ใน clause throws เป็นเรื่องที่ยอมรับได้หรือไม่?
- 8.5.7 Q7. จำเป็นต้องจับข้อยกเว้นที่ประกาศใน throws ทุกกรณีหรือไม่?
- 8.5.8 Q8. What happens if I forget to write throws?
1. บทนำ
เมื่อคุณเริ่มเขียนโปรแกรมด้วย Java คุณจะต้องเจอคำว่า “exception handling” อย่างหลีกเลี่ยงไม่ได้ ในบรรดาคำสำคัญต่าง ๆ คำว่า “throw” และ “throws” มักทำให้ผู้เริ่มต้นสับสน เพราะดูคล้ายกันแต่มีหน้าที่ต่างกัน
Java เป็นภาษาที่ออกแบบให้มีความปลอดภัยและความทนทาน และมีกลไกในตัวเพื่อจัดการกับข้อผิดพลาดและสถานการณ์ที่ไม่คาดคิดอย่างเหมาะสม กลไกนี้เรียกว่า “exception handling” การจัดการข้อยกเว้นมีบทบาทสำคัญในการเพิ่มความน่าเชื่อถือและการบำรุงรักษาของโปรแกรม
ในบทความนี้ เราจะเน้นการใช้ “java throws” ตั้งแต่พื้นฐานของการจัดการข้อยกเว้น ไปจนถึงคำถามที่พบบ่อยและข้อผิดพลาดทั่วไป คู่มือนี้เหมาะอย่างยิ่งสำหรับผู้ที่ยังไม่แน่ใจถึงความแตกต่างระหว่าง “throw” กับ “throws” หรือผู้ที่ต้องการเข้าใจว่าเมื่อไหร่และอย่างไรจึงจะใช้ throws ได้อย่างมีประสิทธิภาพ เราได้รวมข้อมูลเชิงปฏิบัติ เคล็ดลับ และตัวอย่างโค้ดที่มักพบในโครงการจริงไว้ด้วยกัน ดังนั้นกรุณาอ่านจนจบเพื่อรับประโยชน์สูงสุด
2. Exception Handling คืออะไรใน Java?
เมื่อเขียนโปรแกรม Java สถานการณ์ที่ไม่คาดคิดหลายอย่างอาจเกิดขึ้นในขณะรันไทม์ เช่น ไฟล์ไม่พบ, เกิดข้อผิดพลาดการหารด้วยศูนย์, หรือพยายามเข้าถึงตำแหน่งของอาร์เรย์ที่อยู่นอกขอบเขต เหล่านี้เรียกว่า “exceptions”
2.1 แนวคิดพื้นฐานของ Exception Handling
Exception handling คือกลไกที่ตรวจจับสถานการณ์ผิดปกติ (exceptions) ที่เกิดขึ้นระหว่างการทำงานของโปรแกรมและให้ผู้พัฒนาสามารถจัดการกับมันได้อย่างเหมาะสม แทนที่จะให้โปรแกรมหยุดทำงานอย่างกะทันหันเมื่อเกิดข้อยกเว้น Java จะอนุญาตให้แอปพลิเคชันตอบสนองตามประเภทและเนื้อหาของข้อผิดพลาด ซึ่งช่วยเพิ่มความเสถียรของแอปพลิเคชันและประสบการณ์ผู้ใช้
2.2 Checked Exceptions และ Unchecked Exceptions
ข้อยกเว้นใน Java แบ่งออกเป็นสองประเภทหลัก
Checked Exceptions
Checked exceptions คือข้อยกเว้นที่ต้องได้รับการจัดการในขั้นตอนคอมไพล์ ตัวอย่างเช่น IOException ที่เกิดขึ้นระหว่างการทำงานกับไฟล์ ข้อยกเว้นเหล่านี้ต้องถูกจับด้วยบล็อก try‑catch หรือส่งต่อไปยังผู้เรียกโดยใช้การประกาศ throws
try {
FileReader fr = new FileReader("data.txt");
} catch (IOException e) {
e.printStackTrace();
}
Unchecked Exceptions
Unchecked exceptions คือข้อยกเว้นที่ไม่จำเป็นต้องจัดการในขั้นตอนคอมไพล์ ตัวอย่างที่พบบ่อยได้แก่ NullPointerException และ ArrayIndexOutOfBoundsException ซึ่งมักเกิดจากข้อผิดพลาดของโค้ด แม้ว่า Java จะคอมไพล์โดยไม่ต้องจัดการข้อยกเว้นเหล่านี้ก็ตาม แต่แนะนำให้แก้ไขเมื่อจำเป็นเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่คาดคิด
2.3 ทำไมต้องมี Exception Handling
การนำ Exception Handling ไปใช้อย่างเหมาะสมให้ประโยชน์ดังต่อไปนี้
- เพิ่มความเสถียรของโปรแกรม: แม้จะเกิดข้อผิดพลาดที่ไม่คาดคิด โปรแกรมก็สามารถแสดงข้อความที่เหมาะสมหรือดำเนินการกู้คืนโดยไม่หยุดทำงาน
- ง่ายต่อการดีบัก: ประเภทและข้อความของข้อยกเว้นช่วยให้ระบุสาเหตุของปัญหาได้เร็วขึ้น
- ประสบการณ์ผู้ใช้ที่ดีกว่า: แทนที่จะหยุดทำงานอย่างกะทันหัน ระบบสามารถให้ข้อมูลตอบกลับหรือขั้นตอนการกู้คืนที่มีความหมายได้
การจัดการข้อยกเว้นใน Java เป็นทักษะสำคัญสำหรับการสร้างแอปพลิเคชันที่ทนทาน ในบทต่อไป เราจะอธิบายพื้นฐานของ “throw”
3. throw คืออะไร?
ใน Java คำว่า “throw” เป็นคีย์เวิร์ดที่ใช้เพื่อสร้างข้อยกเว้นโดยเจตนา แม้ว่าข้อยกเว้นส่วนใหญ่จะเกิดขึ้นโดยอัตโนมัติระหว่างการทำงานของโปรแกรม คุณอาจต้องการสร้างและโยนข้อยกเว้นเมื่อเงื่อนไขบางอย่างเป็นจริง — นั่นคือจุดที่ใช้ “throw”
3.1 การใช้ throw เบื้องต้น
“throw” จะสร้างอ็อบเจ็กต์ของข้อยกเว้นและโยนมันออกไป ทำให้เกิดข้อยกเว้นขึ้น สังเคราะห์ไวยากรณ์พื้นฐานมีดังนี้
throw new ExceptionClass("Error message");
ตัวอย่างเช่น หากมีการส่งอาร์กิวเมนต์ที่ไม่ถูกต้อง คุณสามารถโยนข้อยกเว้นได้ดังนี้:
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Age must be zero or greater");
}
this.age = age;
}
ในตัวอย่างนี้ IllegalArgumentException จะถูกโยนเมื่ออายุมีค่าน้อยกว่าศูนย์
3.2 ทำไมคุณอาจต้องการโยนข้อยกเว้น
วัตถุประสงค์หลักของการใช้ “throw” คือการแจ้งให้โปรแกรมทราบถึงสถานะที่ไม่ถูกต้องหรือการละเมิดกฎโดยทันที ซึ่งช่วยให้จับบั๊กได้ตั้งแต่เนิ่นๆ และป้องกันพฤติกรรมที่ไม่คาดคิด ตัวอย่างเช่น:
- เมื่อข้อมูลที่ผู้ใช้ป้อนไม่ผ่านการตรวจสอบ
- เมื่อพารามิเตอร์หรือการกำหนดค่าที่ไม่ถูกต้องถูกส่งเข้าไป
- เมื่อตรรกะทางธุรกิจป้องกันการประมวลผลต่อไป
3.3 หมายเหตุการใช้ throw
เมื่อข้อยกเว้นถูกโยนด้วย “throw” มันจะแพร่กระจายไปยังผู้เรียกเว้นว่าจะถูกจัดการด้วยบล็อก try‑catch ภายในเมธอดเดียวกัน สำหรับข้อยกเว้นที่ตรวจสอบได้ (เช่น IOException) เมธอดต้องประกาศ “throws” ในลายเซ็นด้วย ส่วนข้อยกเว้นที่ไม่ตรวจสอบได้ การประกาศ throws เป็นทางเลือก แต่การเข้าใจความแตกต่างระหว่าง “throw” และ “throws” เป็นสิ่งสำคัญสำหรับการใช้งานที่ถูกต้อง
4. throws คืออะไร?
เมื่อเขียนโปรแกรม Java คุณอาจพบคีย์เวิร์ด “throws” ในการประกาศเมธอด คีย์เวิร์ด throws ใช้เพื่อแจ้งให้ผู้เรียกทราบว่าเมธอดอาจโยนข้อยกเว้นหนึ่งหรือหลายข้อในระหว่างการทำงาน
4.1 การใช้ throws เบื้องต้น
โดยระบุชื่อคลาสของข้อยกเว้นในประกาศเมธอด คำสั่ง throws จะทำให้ข้อยกเว้นใด ๆ ที่อาจเกิดขึ้นภายในเมธอดถูกส่งต่อไปยังผู้เรียก ข้อยกเว้นที่ตรวจสอบได้โดยเฉพาะต้องถูกประกาศด้วย throws เพื่อให้ผู้เรียกจัดการอย่างเหมาะสม ตัวอย่าง:
public void readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
// File reading process
}
ในตัวอย่างนี้ ตัวสร้างของ FileReader สามารถโยน IOException ได้ ดังนั้นเมธอดต้องประกาศ throws IOException
4.2 การแพร่กระจายข้อยกเว้นในประกาศเมธอด
เมื่อเมธอดประกาศ throws ข้อยกเว้นใด ๆ ที่เกิดขึ้นภายในเมธอดจะถูกส่งต่อไปยังผู้เรียก ผู้เรียกต้องเลือกว่าจะจับข้อยกเว้นนั้นหรือส่งต่อต่อโดยประกาศ throws ของตนเอง
public void processFile() throws IOException {
readFile("test.txt"); // readFile throws IOException, so this method must also declare throws
}
4.3 การประกาศหลายข้อยกเว้น
หากเมธอดอาจโยนหลายข้อยกเว้น สามารถประกาศได้โดยใช้รายการคั่นด้วยเครื่องหมายจุลภาคหลังคีย์เวิร์ด throws
public void connect(String host) throws IOException, SQLException {
// Network or database operations
}
4.4 บทบาทและประโยชน์ของ throws
- เพิ่มความอ่านง่ายและการบำรุงรักษา: คำสั่ง throws ทำให้เห็นได้ชัดเจนว่ามีข้อยกเว้นประเภทใดบ้างที่เมธอดอาจโยน ช่วยสื่อสารระหว่างนักพัฒนาได้ดีขึ้น
- ความรับผิดชอบที่ชัดเจนในการจัดการข้อผิดพลาด: throws ทำให้ผู้เรียกต้องจัดการกับข้อยกเว้น ส่งเสริมการออกแบบระบบที่มั่นคงและมีโครงสร้าง
- รองรับข้อยกเว้นแบบกำหนดเอง: นักพัฒนาสามารถใส่คลาสข้อยกเว้นที่กำหนดเองในประกาศ throws เพื่อจัดการกับสถานการณ์ข้อผิดพลาดที่ซับซ้อนได้อย่างมีประสิทธิภาพ
5. ความแตกต่างระหว่าง throw และ throws
แม้ว่าจะมักสับสนกัน “throw” และ “throws” มีบทบาทที่แตกต่างกันอย่างชัดเจนในกลไกการจัดการข้อยกเว้นของ Java บทนี้จะอธิบายความแตกต่างและชี้แจงว่าเมื่อใดและอย่างไรจึงควรใช้แต่ละอย่างอย่างถูกต้อง
5.1 ความแตกต่างเชิงฟังก์ชันระหว่าง throw และ throws
| Item | throw | throws |
|---|---|---|
| Role | Actually generates an exception | Declares that a method may throw exceptions |
| Usage | Used inside methods to throw exception objects | Used in method declarations to specify throwable exceptions |
| Target | Exception objects created with new | Both checked and unchecked exceptions |
| Example | throw new IOException(“Error occurred”); | public void sample() throws IOException |
| When required | When intentionally raising an exception | When a method may throw checked exceptions |
5.2 สถานการณ์ที่ใช้แต่ละอย่าง
- throw
- ใช้เมื่อคุณต้องการสร้างข้อยกเว้นโดยตรง — ตัวอย่างเช่น เมื่อพบข้อมูลเข้าไม่ถูกต้องหรือการละเมิดกฎ
- ตัวอย่าง: “ถ้าอายุมีค่าน้อยกว่าศูนย์ ให้ throw IllegalArgumentException”
- throws
- ใช้เมื่อเมธอดหรือคอนสตรัคเตอร์อาจโยนข้อยกเว้นและต้องแจ้งให้ผู้เรียกทราบ
- ตัวอย่าง: “ใช้ throws ในเมธอดที่ทำงานกับไฟล์หรือฐานข้อมูล ซึ่งคาดว่าจะเกิดข้อยกเว้น”

5.3 ตัวอย่างโค้ดเพื่อเปรียบเทียบ
ตัวอย่างของ throw:
public void setName(String name) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("Name cannot be empty");
}
this.name = name;
}
ตัวอย่างของ throws:
public void loadConfig(String path) throws IOException {
FileReader reader = new FileReader(path);
// Configuration loading process
}
5.4 ตารางสรุป
| Decision Point | throw | throws |
|---|---|---|
| Where it’s used | Inside a method | Method declaration |
| What it does | Generates an exception | Declares exception propagation |
| Who handles it | Thrown at the point of error | Handled by the caller |
| When required | Optional (only when needed) | Required for checked exceptions |
บทบาทของ throw และ throws แตกต่างกันอย่างชัดเจน ดังนั้นการเข้าใจ ว่าควรใช้อันไหนในสถานการณ์ใด เป็นขั้นตอนแรกสู่การจัดการข้อยกเว้นที่แข็งแรง
6. แนวปฏิบัติที่ดีที่สุดสำหรับการใช้ throws
การใช้ throws อย่างมีประสิทธิภาพช่วยเพิ่มความอ่านง่ายและการบำรุงรักษาของโปรแกรม Java พร้อมทั้งยกระดับคุณภาพโดยรวมของการจัดการข้อยกเว้น บทนี้จะแนะนำแนวปฏิบัติที่แนะนำและข้อพิจารณาที่สำคัญซึ่งมักใช้ในงานพัฒนาจริง
6.1 ระบุคลาสข้อยกเว้นที่เป็นคอนกรีต
ในการประกาศ throws ควรระบุคลาสข้อยกเว้นที่เป็นคอนกรีตที่สุดเท่าที่จะทำได้
หลีกเลี่ยงการประกาศแบบกว้าง ๆ เช่น Exception หรือ Throwable โดยใช้ข้อยกเว้นเฉพาะเช่น IOException หรือ SQLException ผู้เรียกใช้จะสามารถกำหนดวิธีจัดการข้อผิดพลาดได้อย่างแม่นยำ ตัวอย่างที่ดี:
public void saveData() throws IOException {
// File-saving process
}
หลีกเลี่ยงแบบนี้:
public void saveData() throws Exception {
// Too vague: unclear what exceptions may occur
}
6.2 ใช้ประโยชน์จากโครงสร้างลำดับชั้นของข้อยกเว้น
เนื่องจากคลาสข้อยกเว้นใน Java มีโครงสร้างเป็นลำดับชั้น ข้อยกเว้นที่เกี่ยวข้องสามารถจัดกลุ่มภายใต้คลาสพาเรนต์ได้เมื่อเหมาะสม
อย่างไรก็ตาม ควรหลีกเลี่ยงการทำให้กว้างเกินไปด้วยข้อยกเว้นระดับสูง (เช่น Exception) เพราะจะทำให้ความชัดเจนลดลงและทำให้การจัดการข้อผิดพลาดยากขึ้น 
6.3 ใช้แท็ก @throws ใน Javadoc
เมื่อให้ API หรือไลบรารี คุณควรบันทึกข้อยกเว้นโดยใช้แท็ก @throws ในคอมเมนต์ Javadoc
แท็กนี้อธิบายเงื่อนไขที่ทำให้เกิดข้อยกเว้นอย่างชัดเจน ช่วยให้ผู้ใช้ API สามารถเขียนการจัดการข้อยกเว้นได้อย่างถูกต้อง
/**
* Reads a file.
* @param filePath Path of the file to read
* @throws IOException If the file cannot be read
*/
public void readFile(String filePath) throws IOException {
// ...
}
6.4 หลีกเลี่ยงการโยนข้อยกเว้นซ้ำโดยไม่จำเป็น
หลีกเลี่ยงการจับข้อยกเว้นแล้วโยนซ้ำโดยไม่มีการเพิ่มคุณค่าใด ๆ หากจำเป็นต้องโยนซ้ำ ควรห่อข้อยกเว้นเดิมในข้อยกเว้นแบบกำหนดเองหรือเพิ่มบริบท/ข้อมูลการบันทึกเพิ่มเติม
6.5 การใช้คลาสข้อยกเว้นแบบกำหนดเอง
ในแอปพลิเคชันธุรกิจและระบบขนาดใหญ่ มักมีการกำหนดคลาสข้อยกเว้นแบบกำหนดเองและรวมไว้ในประกาศ throws วิธีนี้ช่วยทำให้สาเหตุของข้อผิดพลาดและความรับผิดชอบชัดเจนขึ้น ทำให้ระบบบำรุงรักษาและขยายได้ง่ายขึ้น
public class DataNotFoundException extends Exception {
public DataNotFoundException(String message) {
super(message);
}
}
public void findData() throws DataNotFoundException {
// Throw when data is not found
}
โดยการใช้ throws อย่างเหมาะสม คุณสามารถกระจายความรับผิดชอบของการจัดการข้อยกเว้น ลดความซับซ้อนของการแก้ไขปัญหา และสร้างแอปพลิเคชัน Java ที่เชื่อถือได้และปลอดภัย
7. รูปแบบการจัดการข้อยกเว้นเชิงปฏิบัติ
การจัดการข้อยกเว้นใน Java มีมากกว่าการใช้บล็อก try-catch หรือการประกาศ throws เพียงอย่างเดียว
บทนี้จะแนะนำรูปแบบเชิงปฏิบัติและกลยุทธ์การออกแบบที่มักใช้ในงานพัฒนาจริง
7.1 การจัดการทรัพยากรด้วย try-with-resources
เมื่อทำงานกับไฟล์ การเชื่อมต่อเครือข่าย หรือการเชื่อมต่อฐานข้อมูล การปล่อยทรัพยากรให้ถูกต้องแม้ในกรณีที่เกิดข้อยกเว้นเป็นสิ่งสำคัญ
ตั้งแต่ Java 7 คำสั่ง try-with-resources ทำให้ทรัพยากรถูกปิดโดยอัตโนมัติ
try (FileReader reader = new FileReader("data.txt")) {
// File reading process
} catch (IOException e) {
System.out.println("Failed to read file: " + e.getMessage());
}
ไวยากรณ์นี้ทำให้แน่ใจว่า close() จะถูกเรียกโดยอัตโนมัติ ป้องกันการรั่วไหลของทรัพยากรแม้จะเกิดข้อยกเว้นขึ้นก็ตาม
7.2 การจัดการข้อยกเว้นหลายประเภทอย่างมีประสิทธิภาพ
การดำเนินการที่ซับซ้อนอาจทำให้เกิดข้อยกเว้นหลายประเภท
ตั้งแต่ Java 7 เป็นต้นไป คุณสามารถจับข้อยกเว้นหลายประเภทในบล็อก catch เดียวได้โดยใช้คุณลักษณะ multi‑catch
try {
methodA();
methodB();
} catch (IOException | SQLException e) {
// Handle both exceptions here
e.printStackTrace();
}
คุณยังสามารถแยกบล็อก catch เพื่อให้การจัดการที่กำหนดเองสำหรับแต่ละประเภทของข้อยกเว้นได้
7.3 พิจารณาด้านประสิทธิภาพสำหรับการจัดการข้อยกเว้น
แม้ว่าข้อยกเว้นจะมีพลัง แต่ไม่ควรใช้แทนการไหลของการควบคุมปกติ
การสร้างข้อยกเว้นต้องใช้ทรัพยากรอย่างมาก เนื่องจากต้องสร้าง stack trace จึงควรใช้สำหรับกรณีที่เป็นข้อยกเว้นจริง ๆ เท่านั้น
การใช้ที่ไม่ถูกต้อง (ไม่แนะนำ):
try {
int value = array[index];
} catch (ArrayIndexOutOfBoundsException e) {
// Bounds checking should be done beforehand
}
การใช้ที่แนะนำ:
if (index >= 0 && index < array.length) {
int value = array[index];
} else {
// Out-of-range handling
}
7.4 การบันทึกและการแจ้งเตือน
การบันทึกและการแจ้งเตือนที่เหมาะสมเป็นสิ่งสำคัญสำหรับการแก้ปัญหาเมื่อเกิดข้อยกเว้น
ระบบธุรกิจมักใช้เฟรมเวิร์กการบันทึก (เช่น Log4j, SLF4J) เพื่อบันทึกข้อมูลข้อยกเว้นอย่างละเอียด
catch (Exception e) {
logger.error("An error has occurred", e);
}
7.5 การนำเทคนิคการกู้คืนแบบกำหนดเองไปใช้
ในบางกรณี การนำเทคนิคการกู้คืน เช่น การลองทำงานใหม่ การโหลดไฟล์กำหนดค่าใหม่ หรือการแจ้งผู้ใช้ จะเป็นประโยชน์
แทนที่จะหยุดโปรแกรมทันที ควรพยายามรักษาการให้บริการต่อเนื่องให้ได้มากที่สุด
โดยการนำเทคนิคการจัดการข้อยกเว้นที่เป็นประโยชน์มาใช้ คุณสามารถสร้างแอปพลิเคชัน Java ที่ทั้งเชื่อถือได้และบำรุงรักษาง่าย
8. คำถามที่พบบ่อย (FAQ)
ต่อไปนี้เป็นคำถามทั่วไปจากผู้เริ่มต้นเกี่ยวกับการจัดการข้อยกเว้นใน Java โดยเฉพาะ “throws” พร้อมคำตอบ
Q1. ความแตกต่างหลักระหว่าง throw กับ throws คืออะไร?
A1.
throw เป็นคีย์เวิร์ดที่ สร้าง ข้อยกเว้นขึ้นในระหว่างการทำงานของโปรแกรม
throws ใช้ในประกาศเมธอดเพื่อ ประกาศความเป็นไปได้ ที่เมธอดอาจทำให้เกิดข้อยกเว้น
→ วิธีจำง่าย ๆ: throw = “ทำให้เกิด” , throws = “ประกาศ”
Q2. ควรระวังอะไรบ้างเมื่อใช้ throws?
A2.
ข้อยกเว้นที่ประกาศด้วย throws ต้องถูกจับโดยผู้เรียกหรือส่งต่อต่อไปโดยใช้ throws อีกครั้ง
สำหรับ checked exceptions การจัดการอย่างชัดเจนเป็นสิ่งบังคับ
หากคุณไม่จับหรือส่งต่อข้อยกเว้น โปรแกรมจะไม่คอมไพล์
Q3. สามารถใช้ throw และ throws ร่วมกันได้หรือไม่?
A3.
ได้
รูปแบบที่พบบ่อยคือการ throw ข้อยกเว้นภายในเมธอดและประกาศข้อยกเว้นเดียวกันด้วย throws เพื่อให้ส่งต่อไปยังผู้เรียก
Q4. จะประกาศหลายข้อยกเว้นด้วย throws อย่างไร?
A4.
ใส่รายการข้อยกเว้นหลังคีย์เวิร์ด throws คั่นด้วยเครื่องหมายคอมม่า
ตัวอย่าง: public void sample() throws IOException, SQLException
Q5. ควรใช้ throws กับ unchecked exceptions หรือไม่?
A5.
Unchecked exceptions (ที่สืบทอดจาก RuntimeException) ไม่จำเป็นต้องประกาศด้วย throws
อย่างไรก็ตาม สามารถใช้ throws เพื่อบอกผู้เรียกอย่างชัดเจนว่าเมธอดอาจทำให้เกิด unchecked exception เฉพาะได้ ซึ่งช่วยเพิ่มความอ่านง่ายและความชัดเจนของ API
Q6. การประกาศ Exception หรือ Throwable ใน clause throws เป็นเรื่องที่ยอมรับได้หรือไม่?
A6.
ทางเทคนิคทำได้ แต่ไม่แนะนำ
การประกาศประเภทข้อยกเว้นที่กว้างเกินไปทำให้ไม่ชัดเจนว่าข้อผิดพลาดประเภทใดอาจเกิดขึ้นและทำให้การจัดการที่ผู้เรียกทำได้ยากขึ้น
ควรใช้คลาสข้อยกเว้นที่เจาะจงเท่าที่เป็นไปได้
Q7. จำเป็นต้องจับข้อยกเว้นที่ประกาศใน throws ทุกกรณีหรือไม่?
A7.
สำหรับ checked exceptions ผู้เรียกต้อง จับ (catch) ข้อยกเว้น หรือ ส่งต่อ (propagate) ต่อไป ด้วย throws
หากไม่ทำเช่นนั้นจะทำให้เกิด ข้อผิดพลาดการคอมไพล์
Unchecked exceptions ไม่จำเป็นต้องทำอย่างใดอย่างหนึ่ง
Q8. What happens if I forget to write throws?
A8.
ถ้าเมธอด throws checked exception แต่ไม่ได้ประกาศด้วย throws จะเกิด ข้อผิดพลาดในขั้นตอนคอมไพล์
สำหรับ unchecked exceptions เมธอดจะคอมไพล์ได้ตามปกติแม้ไม่มี throws แต่ควรจัดการข้อผิดพลาดอย่างเหมาะสม
ใช้ส่วน FAQ นี้เพื่อทำความเข้าใจการจัดการข้อยกเว้นใน Java ให้ลึกซึ้งยิ่งขึ้น.


