Java try – catch

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về câu lệnh try catch trong Java với sự trợ giúp của các ví dụ.

Các try...catchkhối trong Java được sử dụng để xử lý trường hợp ngoại lệ và ngăn ngừa việc chấm dứt bất thường của chương trình.

Đây là cú pháp của một try...catchkhối trong Java.

try{
  // code
}
catch(exception) {
  // code
}

Các trykhối bao gồm mã mà có thể tạo ra một ngoại lệ.

Các catchkhối bao gồm mã được thực hiện khi có xảy ra một ngoại lệ bên trong trykhối.

Ví dụ: Java try … catch khối

class Main {
  public static void main(String[] args) {

    try {
      int divideByZero = 5 / 0;
      System.out.println("Rest of code in try block");
    }

    catch (ArithmeticException e) {
      System.out.println("ArithmeticException => " + e.getMessage());
    }
  }
}

Đầu ra

ArithmeticException => / by zero

Trong ví dụ trên, hãy lưu ý dòng,

int divideByZero = 5 / 0;

Ở đây, chúng tôi đang cố gắng chia một số cho số không . Trong trường hợp này, một ngoại lệ xảy ra. Do đó, chúng tôi đã bao gồm mã này bên trong trykhối.

Khi chương trình gặp mã này, ArithmeticExceptionxảy ra. Và, ngoại lệ được catchkhối bắt và thực thi mã bên trong catchkhối.

Các catchkhối được chỉ thực hiện nếu có tồn tại một ngoại lệ bên trong trykhối.

Lưu ý : Trong Java, chúng ta có thể sử dụng một trykhối mà không cần một catchkhối. Tuy nhiên, chúng ta không thể sử dụng một catchkhối mà không có trykhối.

Java thử … cuối cùng đã chặn

Chúng ta cũng có thể sử dụng trykhối cùng với một khối cuối cùng.

Trong trường hợp này, khối cuối cùng luôn được thực thi cho dù có ngoại lệ bên trong khối thử hay không.

Ví dụ: Java try … last block

class Main {
  public static void main(String[] args) {
    try {
      int divideByZero = 5 / 0;
    }

    finally {
      System.out.println("Finally block is always executed");
    }
  }
}

Đầu ra

Finally block is always executed
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)

Trong ví dụ trên, chúng ta đã sử dụng trykhối cùng với finallykhối. Chúng ta có thể thấy rằng mã bên trong trykhối đang gây ra một ngoại lệ.

Tuy nhiên, mã bên trong finallykhối được thực thi bất kể ngoại lệ.

Java thử … bắt … cuối cùng chặn

Trong Java, chúng ta cũng có thể sử dụng khối cuối cùng sau try...catchkhối. Ví dụ,

import java.io.*;

class ListOfNumbers {

  // create an integer array
  private int[] list = {5, 6, 8, 9, 2};

  // method to write data from array to a fila
  public void writeList() {
    PrintWriter out = null;

    try {
      System.out.println("Entering try statement");

      // creating a new file OutputFile.txt
      out = new PrintWriter(new FileWriter("OutputFile.txt"));

      // writing values from list array to Output.txt
      for (int i = 0; i < 7; i++) {
        out.println("Value at: " + i + " = " + list[i]);
      }
    }
    
    catch (Exception e) {
      System.out.println("Exception => " + e.getMessage());
    }
    
    finally {
      // checking if PrintWriter has been opened
      if (out != null) {
        System.out.println("Closing PrintWriter");
        // close PrintWriter
        out.close();
      }
      
      else {
        System.out.println("PrintWriter not open");
      }
    }

  }
}

class Main {
  public static void main(String[] args) {
    ListOfNumbers list = new ListOfNumbers();
    list.writeList();
  }
}

Đầu ra

Entering try statement
Exception => Index 5 out of bounds for length 5
Closing PrintWriter

Trong ví dụ trên, chúng ta đã tạo một danh sách có tên mảng và một tệp có tên là output.txt . Ở đây, chúng tôi đang cố gắng đọc dữ liệu từ mảng và lưu trữ vào tệp.

Lưu ý mã,

for (int i = 0; i < 7; i++) {
  out.println("Value at: " + i + " = " + list[i]);
}

Ở đây, kích thước của mảng là 5và phần tử cuối cùng của mảng là tại list[4]. Tuy nhiên, chúng tôi đang cố gắng truy cập các phần tử tại a[5]và a[6].

Do đó, mã tạo ra một ngoại lệ bị khối bắt.

Vì finallykhối luôn được thực thi, chúng tôi đã bao gồm mã để đóng PrintWriterbên trong khối cuối cùng.

Một thực tiễn tốt là sử dụng khối cuối cùng để bao gồm mã dọn dẹp quan trọng như đóng tệp hoặc kết nối.

Lưu ý : Có một số trường hợp khi một finallykhối không thực thi:

  • Use of System.exit() method
  • An exception occurs in the finally block
  • The death of a thread

Nhiều khối bắt

Đối với mỗi trykhối, có thể có 0 hoặc nhiều catchkhối. Nhiều catchkhối cho phép chúng tôi xử lý từng ngoại lệ khác nhau.

Loại đối số của mỗi catchkhối cho biết loại ngoại lệ có thể được xử lý bởi nó. Ví dụ,

class ListOfNumbers {
  public int[] arr = new int[10];

  public void writeList() {

    try {
      arr[10] = 11;
    }
    
    catch (NumberFormatException e1) {
      System.out.println("NumberFormatException => " + e1.getMessage());
    }
    
    catch (IndexOutOfBoundsException e2) {
      System.out.println("IndexOutOfBoundsException => " + e2.getMessage());
    }

  }
}

class Main {
  public static void main(String[] args) {
    ListOfNumbers list = new ListOfNumbers();
    list.writeList();
  }
}

Đầu ra

IndexOutOfBoundsException => Index 10 out of bounds for length 10

Trong ví dụ này, chúng tôi đã tạo một mảng số nguyên có tên là arrkích thước 10 .

Vì chỉ số mảng bắt đầu từ 0 nên phần tử cuối cùng của mảng là tại arr[9]. Lưu ý tuyên bố,

arr[10] = 11;

Ở đây, chúng tôi đang cố gắng gán một giá trị cho chỉ mục 10 . Do đó, IndexOutOfBoundExceptionxảy ra.

Khi một ngoại lệ xảy ra trong trykhối,

  • The exception is thrown to the first catch block. The first catch block does not handle an IndexOutOfBoundsException, so it is passed to the next catch block.
  • The second catch block in the above example is the appropriate exception handler because it handles an IndexOutOfBoundsException. Hence, it is executed.

Bắt nhiều ngoại lệ

Từ Java SE 7 trở lên, giờ đây chúng ta có thể bắt gặp nhiều loại ngoại lệ với một catchkhối.

Điều này làm giảm sự trùng lặp mã và tăng tính đơn giản và hiệu quả của mã.

Mỗi loại ngoại lệ có thể được xử lý bởi catchkhối được phân tách bằng thanh dọc |.

Cú pháp của nó là:

try {
  // code
} catch (ExceptionType1 | Exceptiontype2 ex) { 
  // catch block
}

Để tìm hiểu thêm, hãy truy cập Java để bắt nhiều ngoại lệ .

Câu lệnh try-with-resources trong Java

Câu lệnh try-with-resources là một câu lệnh try có một hoặc nhiều khai báo tài nguyên.

Cú pháp của nó là:

try (resource declaration) {
  // use of the resource
} catch (ExceptionType e1) {
  // catch block
}

Tài nguyên là một đối tượng được đóng ở cuối chương trình. Nó phải được khai báo và khởi tạo trong câu lệnh try.

Hãy lấy một ví dụ.

try (PrintWriter out = new PrintWriter(new FileWriter("OutputFile.txt")) {
  // use of the resource
}

Câu lệnh try-with-resources còn được gọi là quản lý tài nguyên tự động . Câu lệnh này tự động đóng tất cả các tài nguyên ở cuối câu lệnh.

Để tìm hiểu thêm, hãy truy cập câu lệnh java try-with-resources .









Gõ tìm kiếm nhanh...