JavaRush /Blog Java /Random-VI /Các ngoại lệ và cách xử lý
articles
Mức độ

Các ngoại lệ và cách xử lý

Xuất bản trong nhóm
Các ngoại lệ hoặc các tình huống (trạng thái) ngoại lệ là các lỗi xảy ra trong một chương trình trong quá trình hoạt động của nó. Tất cả các ngoại lệ trong Java đều là đối tượng. Do đó, chúng không chỉ có thể được tạo tự động khi xảy ra tình huống đặc biệt mà còn do chính nhà phát triển tạo ra. Hệ thống phân cấp của các lớp ngoại lệ: Những trường hợp ngoại lệ và cách xử lý - 1Các ngoại lệ được chia thành nhiều lớp, nhưng chúng đều có một tổ tiên chung - lớp Throwable. Hậu duệ của nó là các lớp con ExceptionError. Các ngoại lệ ( Exceptions) là kết quả của các vấn đề trong một chương trình, về nguyên tắc, có thể giải quyết được và có thể dự đoán được. Ví dụ: phép chia cho số 0 xảy ra với số nguyên. Lỗi ( Errors) là các vấn đề nghiêm trọng hơn mà đặc tả Java nêu rõ rằng bạn không nên cố gắng xử lý trong chương trình của riêng mình vì chúng là các vấn đề cấp độ JVM. Ví dụ: các trường hợp ngoại lệ thuộc loại này xảy ra nếu bộ nhớ khả dụng cho máy ảo đã hết. Chương trình vẫn không thể cung cấp thêm bộ nhớ cho JVM. Trong Java, tất cả các ngoại lệ được chia thành ba loại: ngoại lệ được kiểm tra ( checked) và ngoại lệ không được kiểm tra ( unchecked) bao gồm lỗi ( Errors) và ngoại lệ trong thời gian chạy ( RuntimeExceptionsclass con cháu Exception). Các ngoại lệ được kiểm soát là các lỗi có thể và nên được xử lý trong một chương trình; tất cả các lớp con của một lớp Exception(trừ RuntimeException) đều thuộc loại này. Việc xử lý ngoại lệ có thể được thực hiện bằng cách sử dụng các toán tử try…catchhoặc được chuyển sang phần bên ngoài của chương trình. Ví dụ: một phương thức có thể vượt qua các ngoại lệ xảy ra ở cấp độ cao hơn trong hệ thống phân cấp cuộc gọi mà không cần tự xử lý nó. Các ngoại lệ không được kiểm tra không yêu cầu xử lý, nhưng bạn có thể xử lý các ngoại lệ của lớp nếu muốn RuntimeException. Hãy biên dịch và chạy chương trình sau:
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
Khi khởi chạy, thông báo sau sẽ được hiển thị trên bảng điều khiển:
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
Thông báo hiển thị loại ngoại lệ đã xảy ra - ArithmeticException. Ngoại lệ này có thể được xử lý:
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
Bây giờ, thay vì một thông báo lỗi tiêu chuẩn, một khối sẽ được thực thi catch, tham số của nó là đối tượng e của lớp tương ứng với ngoại lệ (bản thân đối tượng có thể được đặt bất kỳ tên nào, nó sẽ cần thiết nếu chúng ta muốn ném mạnh ngoại lệ này một lần nữa để nó được kiểm tra bởi một số trình xử lý khác). Trong trường hợp này, khối trychứa đoạn chương trình có khả năng xảy ra ngoại lệ. Người ta trycó thể tương ứng với một số khối bắt với các lớp ngoại lệ khác nhau.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
Nếu sau khi khởi chạy chương trình được trình bày, người dùng nhập từ bàn phím 1 hoặc 2, chương trình sẽ chạy mà không tạo ra bất kỳ ngoại lệ nào. Nếu người dùng nhập 0, ngoại lệ của lớp sẽ xảy ra ArithmeticExceptionvà sẽ được xử lý bởi khối đầu tiên catch. Nếu người dùng nhập 3, một ngoại lệ lớp sẽ xảy ra ArrayIndexOutOfBoundsException(mảng nằm ngoài giới hạn) và nó sẽ được xử lý bởi khối thứ hai catch. Nếu người dùng nhập một số không nguyên, chẳng hạn như 3.14, thì ngoại lệ lớp sẽ xảy ra InputMismatchException(loại đầu vào không khớp) và nó sẽ được đưa ra định dạng lỗi tiêu chuẩn vì chúng tôi không xử lý nó theo bất kỳ cách nào. Tuy nhiên, bạn có thể thêm trình xử lý cho lớp Exception, vì lớp này là lớp cha cho tất cả các ngoại lệ được kiểm tra khác, nên nó sẽ bắt bất kỳ ngoại lệ nào trong số đó (kể cả InputMismatchException).
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
Vì các ngoại lệ được xây dựng trên hệ thống phân cấp của các lớp và lớp con, nên trước tiên bạn nên cố gắng xử lý các ngoại lệ cụ thể hơn và chỉ sau đó mới xử lý các ngoại lệ chung hơn. Nghĩa là, nếu chúng ta đặt khối có xử lý ngoại lệ lớp đầu tiên (chứ không phải thứ ba) Exception, chúng ta sẽ không bao giờ thấy bất kỳ thông báo lỗi nào ngoài “Một số ngoại lệ khác đã xảy ra” (tất cả các ngoại lệ sẽ bị khối này bắt ngay lập tức và sẽ không đạt được nghỉ ngơi). Phần bổ sung tùy chọn cho khối try…catchcó thể là khối finally. Các lệnh được đặt trong đó sẽ được thực thi trong mọi trường hợp, bất kể ngoại lệ có xảy ra hay không. Mặc dù thực tế là khi xảy ra một ngoại lệ chưa được xử lý, phần chương trình còn lại sau khi tạo ra ngoại lệ này sẽ không được thực thi. Ví dụ: nếu xảy ra ngoại lệ trong một số phép tính dài, finallybạn có thể hiển thị hoặc lưu kết quả trung gian trong một khối. Liên kết tới nguồn: Ngoại lệ và cách xử lý chúng
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION