JavaRush /จาวาบล็อก /Random-TH /ข้อยกเว้นใน Java
Roman
ระดับ

ข้อยกเว้นใน Java

เผยแพร่ในกลุ่ม
เมื่อฉันเจอหัวข้อ "ข้อยกเว้น" มีคำถามมากมายเกิดขึ้นซึ่งฉันต้องค้นหาคำตอบจากมุมต่างๆ ของอินเทอร์เน็ตเพื่อทำความเข้าใจรายละเอียดวิธีการทำงานทั้งหมด เลยรวบรวมคำอธิบายของตัวเองมาซึ่งอาจเข้าใจได้ง่ายกว่าสำหรับมือใหม่ที่เพิ่งเจอปรากฏการณ์นี้ ข้อยกเว้นใน Java - 1ในคอมพิวเตอร์การขัดจังหวะเป็นสัญญาณขาเข้าไปยังโปรเซสเซอร์ว่ามีเหตุการณ์เกิดขึ้นซึ่งจำเป็นต้องมีการตอบสนองในทันที สัญญาณขัดจังหวะต้องการให้โปรเซสเซอร์หยุดโปรแกรมที่รันอยู่ชั่วคราวเพื่อให้สามารถดำเนินการต่อได้ในภายหลังนั่นคือคอมพิวเตอร์จะต้องจดจำข้อมูลทั้งหมดที่เกี่ยวข้องกับการทำงานของโปรแกรม การหยุดชะงักดังกล่าวเกิดขึ้นเพียงชั่วคราว หากไม่เป็นอันตรายถึงชีวิต การหยุดชะงักดังกล่าวอาจเกิดจากรหัสโปรแกรมหรือการทำงานของฮาร์ดแวร์บางอย่าง (เช่น เพียงกดปุ่มบนแป้นพิมพ์ ตัวจับเวลา เช่น เพื่อปิดคอมพิวเตอร์โดยอัตโนมัติ) จำนวนการขัดจังหวะนั้น จำกัด อยู่ที่จำนวนหนึ่งซึ่งสร้างขึ้นในการผลิตโปรเซสเซอร์เฉพาะนั่นคือ "ช่องทาง" การสื่อสารพิเศษที่ได้รับการจัดสรรไว้สำหรับสิ่งนี้ทำให้คุณสามารถเข้าถึงโปรเซสเซอร์ได้โดยข้ามกระบวนการอื่น ๆ ทั้งหมด การขัดจังหวะจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อมีข้อผิดพลาดเกิดขึ้นในโค้ดโปรแกรมที่รัน (เช่น หากเกิดการหารด้วยศูนย์) การหยุดชะงักดังกล่าวมักเรียกว่ากับดักหรือข้อยกเว้น ในกรณีเช่นนี้ เป็นธรรมเนียมที่จะพูดว่า: "ข้อยกเว้นถูกโยนทิ้ง" นั่นคือข้อยกเว้น ถูกทริกเกอร์ หรือข้อยกเว้นถูกโยนทิ้ง (โยนทิ้ง) นั่นคือ คำขอสำหรับการขัดจังหวะกับคำถามที่ว่า “จะทำอย่างไร?” ส่งไปยังโปรเซสเซอร์ ในขณะนี้โปรเซสเซอร์หยุดทำงานโดยจดจำจุดที่หยุดทำงานหรือค่อนข้างจะเป็นคลัสเตอร์ของเซลล์ถัดไปซึ่งจะต้องดำเนินการข้อมูล คำสั่งที่ดำเนินการและไม่ดำเนินการทั้งหมดจะถูกจดจำ หลังจากนั้นโปรเซสเซอร์จะอ่านคำสั่งจากหน่วยความจำเพื่อดำเนินการในกรณีที่เกิดข้อผิดพลาดดังกล่าว ตามคำสั่งนี้ มันสามารถป้อนค่าใหม่ลงในคลัสเตอร์บางกลุ่ม เพิ่มสายโซ่ของการกระทำหรือรอบใหม่ (เช่น รอบการส่งคืนหรือการวนซ้ำ) ฯลฯ นั่นคือขึ้นอยู่กับข้อผิดพลาดที่วางไว้ก่อนหน้านี้ คำสั่งดาวน์ถูกดำเนินการ ระบบคอมพิวเตอร์มีการขัดจังหวะอัตโนมัติจำนวนมากในตัว ซึ่งจะถูกกระตุ้นหลังจากระยะเวลาหนึ่ง เช่น เพื่อควบคุมกระบวนการที่ทำงานบนคอมพิวเตอร์หรือเรียกใช้การเตือนที่ตั้งไว้ รวบรวมสัญญาณภายนอกที่เข้ามา และตัวแปลงข้อมูลต่างๆ เป็นที่น่าจดจำว่าการขัดจังหวะจำนวนมากสามารถ "หยุด" ระบบได้อย่างสมบูรณ์ด้วยเหตุผลหลายประการ ข้อผิดพลาดในรหัสโปรแกรมจะทำให้โปรเซสเซอร์หยุดชะงักโดยอัตโนมัติซึ่งจะพยายามประมวลผลตามคำแนะนำที่วางไว้ แต่ไม่ใช่ว่าการขัดจังหวะทั้งหมดจะได้รับการออกแบบให้จัดการกับสิ่งเหล่านั้น หรืออาจทำให้เกิดขั้นตอนที่ไม่เหมาะกับเรา เช่น จะทำให้แอปพลิเคชันเสียหาย ดังนั้นในการเขียนโปรแกรมจึงเป็นไปได้ที่จะจัดระเบียบการขัดจังหวะของคุณเองสำหรับโค้ดบางส่วนซึ่งโปรแกรมเมอร์อาจมองเห็นความเป็นไปได้ที่จะเกิดข้อผิดพลาด ในกรณีนี้ ข้อผิดพลาดจะได้รับการประมวลผลภายในโปรแกรมและจะไม่ติดต่อกับโปรเซสเซอร์เพื่อขอคำแนะนำในการประมวลผล คำจำกัดความของบล็อกดังกล่าวถูกจัดระเบียบโดยการสร้าง ออบเจ็กต์ " ข้อ ยกเว้น" 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นี้ - ค้นหาทั่ว ทั้งโปรแกรมจากทุกด้าน หลังจาก คำสั่งการ จัดการข้อยกเว้น โค้ดโปรแกรมที่เหลือทั้งหมดจะไม่ถูกดำเนินการ ยกเว้นโค้ดที่อยู่ในบล็อก หากไม่พบตัวจัดการในโปรแกรม โปรเซสเซอร์จะถูกถามคำถาม: "ตัดสินใจด้วยตัวเองว่าต้องทำอะไร" และจะขัดจังหวะโปรแกรม โทร... ได้ทั้งภายในและภายนอกบล็อค (ตรงไหนก็ได้ในโปรแกรม) catchthrowcatchnew 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);
}

ข้อยกเว้นดั้งเดิม

คุณสามารถเขียนข้อยกเว้นของคุณเองเพื่อจัดการกับข้อผิดพลาดบางอย่างได้ หากไลบรารีที่มีอยู่ไม่เพียงพอสำหรับเรา ในการทำเช่นนี้ เราเพียงแค่สร้างคลาสที่สืบทอดมาจากคลาส Exception
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
มีกฎสองข้อที่ควรคำนึงถึงเมื่อสร้างข้อยกเว้นของคุณเอง:
  1. ชื่อชั้นเรียนของเราต้องลงท้ายด้วย "ข้อยกเว้น"
  2. คลาสจะต้องมีตัวสร้างที่มีตัวแปรสตริงที่อธิบายรายละเอียดของปัญหาข้อยกเว้น ใน 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

ทำไมคุณต้องเขียนข้อยกเว้น?

ในปี 1996 จรวด Ariane 5 ตก เนื่องจากการแปลงตัวแปร float เป็นตัวแปรจำนวนเต็มไม่ถูกต้อง ไม่มีข้อยกเว้นหรือตัวจัดการสำหรับสถานการณ์นี้ หากในขณะที่ดาวน์โหลดไฟล์มีการสูญเสียการเชื่อมต่อกับอินเทอร์เน็ต การมีอยู่ของข้อยกเว้นจะช่วยให้คุณสามารถดาวน์โหลดต่อได้หลังจากการเชื่อมต่อได้รับการกู้คืนแล้ว หากไม่มีข้อยกเว้น การดาวน์โหลดจะต้องเริ่มต้นใหม่อีกครั้ง

อ้างอิง:

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION