เมื่อฉันเจอหัวข้อ "ข้อยกเว้น" มีคำถามมากมายเกิดขึ้นซึ่งฉันต้องค้นหาคำตอบจากมุมต่างๆ ของอินเทอร์เน็ตเพื่อทำความเข้าใจรายละเอียดวิธีการทำงานทั้งหมด เลยรวบรวมคำอธิบายของตัวเองมาซึ่งอาจเข้าใจได้ง่ายกว่าสำหรับมือใหม่ที่เพิ่งเจอปรากฏการณ์นี้ ในคอมพิวเตอร์การขัดจังหวะเป็นสัญญาณขาเข้าไปยังโปรเซสเซอร์ว่ามีเหตุการณ์เกิดขึ้นซึ่งจำเป็นต้องมีการตอบสนองในทันที สัญญาณขัดจังหวะต้องการให้โปรเซสเซอร์หยุดโปรแกรมที่รันอยู่ชั่วคราวเพื่อให้สามารถดำเนินการต่อได้ในภายหลังนั่นคือคอมพิวเตอร์จะต้องจดจำข้อมูลทั้งหมดที่เกี่ยวข้องกับการทำงานของโปรแกรม การหยุดชะงักดังกล่าวเกิดขึ้นเพียงชั่วคราว หากไม่เป็นอันตรายถึงชีวิต การหยุดชะงักดังกล่าวอาจเกิดจากรหัสโปรแกรมหรือการทำงานของฮาร์ดแวร์บางอย่าง (เช่น เพียงกดปุ่มบนแป้นพิมพ์ ตัวจับเวลา เช่น เพื่อปิดคอมพิวเตอร์โดยอัตโนมัติ) จำนวนการขัดจังหวะนั้น จำกัด อยู่ที่จำนวนหนึ่งซึ่งสร้างขึ้นในการผลิตโปรเซสเซอร์เฉพาะนั่นคือ "ช่องทาง" การสื่อสารพิเศษที่ได้รับการจัดสรรไว้สำหรับสิ่งนี้ทำให้คุณสามารถเข้าถึงโปรเซสเซอร์ได้โดยข้ามกระบวนการอื่น ๆ ทั้งหมด การขัดจังหวะจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อมีข้อผิดพลาดเกิดขึ้นในโค้ดโปรแกรมที่รัน (เช่น หากเกิดการหารด้วยศูนย์) การหยุดชะงักดังกล่าวมักเรียกว่ากับดักหรือข้อยกเว้น ในกรณีเช่นนี้ เป็นธรรมเนียมที่จะพูดว่า: "ข้อยกเว้นถูกโยนทิ้ง" นั่นคือข้อยกเว้น ถูกทริกเกอร์ หรือข้อยกเว้นถูกโยนทิ้ง (โยนทิ้ง) นั่นคือ คำขอสำหรับการขัดจังหวะกับคำถามที่ว่า “จะทำอย่างไร?” ส่งไปยังโปรเซสเซอร์ ในขณะนี้โปรเซสเซอร์หยุดทำงานโดยจดจำจุดที่หยุดทำงานหรือค่อนข้างจะเป็นคลัสเตอร์ของเซลล์ถัดไปซึ่งจะต้องดำเนินการข้อมูล คำสั่งที่ดำเนินการและไม่ดำเนินการทั้งหมดจะถูกจดจำ หลังจากนั้นโปรเซสเซอร์จะอ่านคำสั่งจากหน่วยความจำเพื่อดำเนินการในกรณีที่เกิดข้อผิดพลาดดังกล่าว ตามคำสั่งนี้ มันสามารถป้อนค่าใหม่ลงในคลัสเตอร์บางกลุ่ม เพิ่มสายโซ่ของการกระทำหรือรอบใหม่ (เช่น รอบการส่งคืนหรือการวนซ้ำ) ฯลฯ นั่นคือขึ้นอยู่กับข้อผิดพลาดที่วางไว้ก่อนหน้านี้ คำสั่งดาวน์ถูกดำเนินการ ระบบคอมพิวเตอร์มีการขัดจังหวะอัตโนมัติจำนวนมากในตัว ซึ่งจะถูกกระตุ้นหลังจากระยะเวลาหนึ่ง เช่น เพื่อควบคุมกระบวนการที่ทำงานบนคอมพิวเตอร์หรือเรียกใช้การเตือนที่ตั้งไว้ รวบรวมสัญญาณภายนอกที่เข้ามา และตัวแปลงข้อมูลต่างๆ เป็นที่น่าจดจำว่าการขัดจังหวะจำนวนมากสามารถ "หยุด" ระบบได้อย่างสมบูรณ์ด้วยเหตุผลหลายประการ ข้อผิดพลาดในรหัสโปรแกรมจะทำให้โปรเซสเซอร์หยุดชะงักโดยอัตโนมัติซึ่งจะพยายามประมวลผลตามคำแนะนำที่วางไว้ แต่ไม่ใช่ว่าการขัดจังหวะทั้งหมดจะได้รับการออกแบบให้จัดการกับสิ่งเหล่านั้น หรืออาจทำให้เกิดขั้นตอนที่ไม่เหมาะกับเรา เช่น จะทำให้แอปพลิเคชันเสียหาย ดังนั้นในการเขียนโปรแกรมจึงเป็นไปได้ที่จะจัดระเบียบการขัดจังหวะของคุณเองสำหรับโค้ดบางส่วนซึ่งโปรแกรมเมอร์อาจมองเห็นความเป็นไปได้ที่จะเกิดข้อผิดพลาด ในกรณีนี้ ข้อผิดพลาดจะได้รับการประมวลผลภายในโปรแกรมและจะไม่ติดต่อกับโปรเซสเซอร์เพื่อขอคำแนะนำในการประมวลผล คำจำกัดความของบล็อกดังกล่าวถูกจัดระเบียบโดยการสร้าง ออบเจ็กต์ " ข้อ ยกเว้น"
try-catch
วัตถุนี้จะถูกสร้างขึ้นโดย อัตโนมัติในบล็อก บล็อก>try
จะถูกตรวจสอบว่ามีข้อผิดพลาดหรือไม่ และหากมีอยู่ โปรแกรมจะไปที่บล็อกcatch
ซึ่งมีการดำเนินการเพื่อป้องกันหรือปรับระดับข้อผิดพลาด ตัวอย่างเช่น หากเราป้อนตัวเลข จากแป้นพิมพ์ ซึ่งจะต้องเพิ่มและลบในภายหลัง การป้อนตัวอักษร จากแป้นพิมพ์ จะทำให้ไม่สามารถบวกด้วยตัวเลขได้ (ลองแสดงผลรวมของตัวแปรทั้งสองนี้ด้วยตัวอักษร S) ดังนั้นในฐานะทีมtry
เราจะต้องตรวจสอบว่าสามารถเพิ่มเลข A ซึ่งมีตัวเลขลงในตัวเลข B ที่มีตัวอักษรได้หรือไม่ (นั่นคือ S = A + B) และหากเป็นไปไม่ได้และเป็นไปไม่ได้ก็แน่นอน ต้องใช้มาตรการเพื่อไม่ให้เกิดข้อผิดพลาดและการขัดจังหวะใหม่ด้วยคำถาม "จะทำอย่างไร" ไม่ได้บินไปที่โปรเซสเซอร์ หากไม่มีข้อยกเว้นในโปรแกรม การประมวลผลจะถูกขัดจังหวะโดยโปรเซสเซอร์ หากมีข้อยกเว้น เมื่อคำสั่ง “จับ” ไว้try
การควบคุมจะส่งผ่านไปยังคำสั่งcatch
ซึ่งสามารถตั้งค่าโซลูชันทางเลือกได้ เช่น เราจะไม่บวกตัวเลขสองตัวนี้ แต่ตั้งค่า S = A
int a = 4;
String b = “hello”;
int S = 0;
try {
S = a + b;
int r = 1;
} catch (Exception igogo1) {
S = a;
}
return S;
/* สตริง “int r = 1;” ไม่ถูกดำเนินการเนื่องจากมีข้อผิดพลาดเกิดขึ้น และโปรแกรมเปลี่ยนเส้นทางทำงานโดยตรงไปยังตัวจัดการข้อยกเว้น (catch block*/ ดังนั้น การมีอยู่ของข้อยกเว้นจึงเป็นโอกาสในการแก้ไขปัญหาภายในโปรแกรมโดยไม่ต้องทิ้งไปที่ระดับโปรเซสเซอร์ ออบเจ็กต์ "ข้อยกเว้น" ซึ่งสร้างขึ้นโดยอัตโนมัติในบล็อกtry
เมื่อตรวจพบข้อผิดพลาด มีค่าของประเภทข้อผิดพลาด เรียกมันว่า "ข้อยกเว้นของเรา" - สำหรับกรณีเฉพาะของเราพร้อมคำอธิบายข้อผิดพลาดเฉพาะของเรา ผู้สร้างภาษา Java ได้สร้างรายการข้อผิดพลาดทั่วไปและตัวเลือกทั่วไปไว้ล่วงหน้าล่วงหน้าสำหรับการแก้ไขนั่นคือใน java มีไลบรารี่ของ Exceptionsซึ่งเราสามารถหันไปใช้เพื่อจัดการกับข้อผิดพลาดที่เกิดขึ้นดังนั้น ไม่ต้องเขียนโค้ดประมวลผลเอง ดังนั้น OurException จึงน่าจะมีคนอธิบายไว้อยู่แล้ว ดังนั้นเราเพียงแค่ต้องรู้ว่าชื่อข้อยกเว้นใดที่จะแทรกลงในโปรแกรมของเราเพื่อจัดการกับโค้ดที่อาจเกิดความล้มเหลวได้ หากเราทำผิดพลาดและเลือกข้อยกเว้น ที่ไม่ถูกต้องจากไลบรารี ตัวจัดการจะไม่ "จับ" มัน ข้อผิดพลาดจะไม่พบวิธีแก้ไขภายในโปรแกรมและคำขอจะถูกส่งไปยังโปรเซสเซอร์ แต่มีวิธีสำหรับคนขี้เกียจ หากเราไม่ทราบชื่อของข้อยกเว้นที่เราต้องการจากห้องสมุด เราก็สามารถใช้ข้อยกเว้นทั่วไปที่มีชื่อว่า " ข้อยกเว้น " ดังตัวอย่างที่อธิบายไว้ข้างต้น ข้อยกเว้นนี้สามารถจัดการกับข้อผิดพลาดประเภทใดก็ได้ แต่ไม่สามารถให้ข้อมูลเฉพาะเกี่ยวกับเหตุการณ์ที่เราสามารถบันทึกได้ ไลบรารีของ ข้อยกเว้นที่เขียนไว้ก่อนหน้านี้ประกอบด้วยการตรวจสอบและข้อยกเว้นที่ไม่ได้ตรวจสอบ สิ่งที่ตรวจสอบได้คือสิ่งที่สามารถแก้ไขได้โดยไม่ขัดจังหวะการทำงานของโปรแกรมนั่นคือถ้าเราพยายามเปิดไฟล์ในโฟลเดอร์ที่ไม่มีอยู่ระบบจะแจ้งให้เราทราบเราสามารถวางไฟล์ได้ ลงในโฟลเดอร์ที่ต้องการและดำเนินโปรแกรมต่อไป นั่นคือในความเป็นจริง คำขอขัดจังหวะ ถูกส่งไปยังโปรเซสเซอร์ แต่ไม่มีคำถาม: "มองหาว่าจะทำอย่างไรกับปัญหานี้?!?!!" เราส่งการขัดจังหวะซึ่งเราตรวจพบเองพร้อมกับคำสั่งสำเร็จรูปซึ่งโปรเซสเซอร์ประมวลผลและดำเนินการโปรแกรมต่อไป ข้อผิดพลาดที่ ไม่ได้ตรวจสอบคือข้อผิดพลาดที่ไม่สามารถแก้ไขได้และโปรแกรมจะถูกปิดก่อนที่จะเสร็จสิ้นนั่นคือ คำขอ ขัดจังหวะ จะถูกส่งไปยังโปรเซสเซอร์ซึ่งไม่ว่าในกรณีใดก็ตามจะขัดขวางการทำงานของโปรแกรม จุดเดียวในการเขียนข้อยกเว้นดังกล่าวในโปรแกรมคือให้ผู้ใช้เข้าใจว่าเกิดอะไรขึ้น เนื่องจากเมื่อพบการหยุดชะงักนี้แล้ว เราสามารถแสดงข้อความข้อมูลบนหน้าจอได้เนื่องจากโปรแกรมขัดข้อง เหตุผลที่สองในการตรวจจับการหยุดชะงักดังกล่าวคือความสามารถในการบันทึกไว้ในบันทึกเพื่อการวิเคราะห์ในภายหลัง (คุณถูกแฮ็ก แต่อย่างน้อยคุณก็รู้ว่าอยู่ที่ไหน) ผลที่ตามมาจากการมีห้องสมุดดังกล่าวคือความจำเป็นที่ต้องจำไว้ว่าต้องรวมห้องสมุดเหล่านั้นด้วย (คุณสามารถดูรายการข้อยกเว้นที่ถูกตรวจสอบและไม่ได้ตรวจสอบกับไลบรารีได้ที่นี่ ) หากเราไม่ทราบแน่ชัดว่าจะรวมไลบรารีใดหรือมีตัวเลือกข้อผิดพลาดหลายตัวเลือก เราก็สามารถcatch
แสดงรายการข้อยกเว้นที่จำเป็นในหลายรายการได้ ระบบจะเลือกตัวจัดการที่ถูกต้องหากอยู่ในรายการ แทนที่จะเป็นข้อยกเว้น เฉพาะ คุณสามารถเขียน " ข้อยกเว้น " ทั่วไปที่สามารถจัดการข้อยกเว้น ประเภทใดก็ได้ หากไม่ได้รับการประมวลผลในบล็อกก่อนหน้า
int a = 4;
String b = “hello”;
int S = 0;
try {
S = a + b;
int r = 1;
}
catch(NullPointerException blabla2) {
System.out.println("Exception handling code for the NullPointerException.");
}
catch (ArithmeticException ex1) {
S = a;
}
catch(Exception uups1) {
System.out.println("Exception occured");
}
return S;
หากมีการบล็อกtry
ข้อยกเว้นจะถูกสร้างขึ้นโดยอัตโนมัติ หากเราจำเป็นต้องบังคับ ข้อยกเว้นณ จุดใดจุดหนึ่ง คำสั่งก็จะถูกthrow
ใช้ นั่นคือเราสร้างวัตถุอย่างอิสระnew throw
... หลังจากนั้นโปรแกรมจะหยุดทำงานส่ง คำขอ ขัดจังหวะ ไปยังโปรเซสเซอร์ และโอนไปยังส่วนของโปรแกรมcatch
จากที่ที่มันพยายามรับคำแนะนำสำหรับการดำเนินการต่อไป ด้วยการสร้างException ด้วยตนเอง เราสามารถระบุประเภทเฉพาะจากไลบรารีได้:
throw new ArithmeticException("Access denied - You must be at least 18 years old.");
จากนั้นตัวจัดการจะค้นหาบล็อก ที่มี ข้อยกเว้นcatch
นี้ - ค้นหาทั่ว ทั้งโปรแกรมจากทุกด้าน หลังจาก คำสั่งการ จัดการข้อยกเว้น โค้ดโปรแกรมที่เหลือทั้งหมดจะไม่ถูกดำเนินการ ยกเว้นโค้ดที่อยู่ในบล็อก หากไม่พบตัวจัดการในโปรแกรม โปรเซสเซอร์จะถูกถามคำถาม: "ตัดสินใจด้วยตัวเองว่าต้องทำอะไร" และจะขัดจังหวะโปรแกรม โทร... ได้ทั้งภายในและภายนอกบล็อค (ตรงไหนก็ได้ในโปรแกรม) catch
throw
catch
new throw
>try
try {
/* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
/* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
/* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
/* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
/* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
/* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}
การแจ้งข้อยกเว้น
วิธีการเขียนก่อนหน้านี้โดยใครบางคนอาจรวมถึงการขว้างปาข้อยกเว้น เพื่อความปลอดภัย โปรแกรมเมอร์ที่เขียนโค้ดได้เตือนโปรแกรมเมอร์คนถัดไปว่าอาจเกิดข้อผิดพลาดในวิธีการที่เขาเขียน ตัวอย่างเช่น วิธีการสร้างไฟล์ที่อธิบายไว้ด้านล่างนี้กำหนดว่าเมื่อสร้างไฟล์อาจมีข้อผิดพลาดเกิดขึ้น (ไม่มีไฟล์ในพาธที่กำหนด) ซึ่งหมายความว่าจำเป็นต้องใช้ตัวจัดการข้อผิดพลาด:public void createFile(String path, String text) throws IOException {
FileWriter writer = new FileWriter(path, true);
writer.write(text);
writer.close();
}
แต่ในขณะเดียวกันก็ไม่มีตัวจัดการซึ่งหมายความว่าตอนนี้เราไม่สามารถเรียกวิธีการเขียนในโปรแกรมของเราในโหมดปกติได้ ตอนนี้เราต้องเขียนตัวจัดการข้อผิดพลาดและเรียกวิธีนี้ในบล็อกtry
:
String filePath = "hello.txt";
String text = "Hello World";
try {
createFile(filePath, text);
} catch (IOException ex) {
System.err.println("Error creating file: " + ex);
}
ข้อยกเว้นดั้งเดิม
คุณสามารถเขียนข้อยกเว้นของคุณเองเพื่อจัดการกับข้อผิดพลาดบางอย่างได้ หากไลบรารีที่มีอยู่ไม่เพียงพอสำหรับเรา ในการทำเช่นนี้ เราเพียงแค่สร้างคลาสที่สืบทอดมาจากคลาส Exceptionpublic class StudentNotFoundException extends Exception {
public StudentNotFoundException (String message) {
super(message);
}
}
มีกฎสองข้อที่ควรคำนึงถึงเมื่อสร้างข้อยกเว้นของคุณเอง:
- ชื่อชั้นเรียนของเราต้องลงท้ายด้วย "ข้อยกเว้น"
- คลาสจะต้องมีตัวสร้างที่มีตัวแปรสตริงที่อธิบายรายละเอียดของปัญหาข้อยกเว้น ใน Constructor นั้น Super Constructor จะถูกเรียกและข้อความจะถูกส่งผ่าน
public class StudentManager {
public Student find(String studentID) throws StudentNotFoundException {
if (studentID.equals("123456")) {
return new Student();
} else {
throw new StudentNotFoundException(
"Could not find student with ID " + studentID);
}
}
}
เราจับข้อยกเว้นนี้ด้วยรหัส:
public class StudentTest {
public static void main(String[] args) {
StudentManager manager = new StudentManager();
try {
Student student = manager.find("0000001");
} catch (StudentNotFoundException ex) {
System.err.print(ex);
}
}
}
ผลลัพธ์ของการรันโปรแกรมจะเป็น: StudentNotFoundException: ไม่พบนักเรียนที่มี ID 0000001
GO TO FULL VERSION