Đã bao giờ bạn thắc mắc làm thế nào để một đoạn code Java bị lỗi nhưng vẫn có thể chạy được chưa?
Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu về cách sử dụng try catch trong Java để giúp bạn xử lý ngoại lệ, giữ dòng chạy ứng dụng được xuyên suốt.
Try Catch trong Java
Nội dung của bài viết này gồm:
-
Khi nào cần sử dụng try catch
-
Ví dụ cách sử dụng try catch trong Java
-
Cách sử dụng try-catch kết hợp finally trong Java
1. Khi nào cần sử dụng try catch trong Java
Khi thực thi một đoạn code Java nào đó, các lỗi khác nhau có thể xảy ra như:
-
Lỗi do chính coder tạo ra
-
Lỗi cú pháp
-
Lỗi logic
-
... những điều mà chúng ta có thể không lường trước.
Ví dụ như:
-
Người dùng nhập dữ liệu không hợp lệ
-
Truy cập vượt quá chỉ số mảng
-
Chia một số cho 0
-
……
Khi xảy ra lỗi, ngoại lệ, Java thông thường sẽ dừng thực thi chương trình và đưa ra một thông báo, hay nói cách khác là Java ném ra một exception – Ngoại lệ.
Xử lý ngoại lệ (Exception Handling) trong java là một cơ chế xử lý các lỗi runtime để có thể duy trì luồng bình thường của ứng dụng.
Quá trình xử lý exception được gọi là catch exception (bắt ngoại lệ), nếu Runtime System không xử lý được ngoại lệ thì chương trình sẽ kết thúc.
Khối lệnh try
trong java được sử dụng để chứa một đoạn code thực thi mà có thế trong quá trình thực thi nó sẽ xảy ra một ngoại lệ.
Sau một khối lệnh try
, bạn phải khai báo khối lệnh catch
hoặc finally
, hoặc cả hai.
Khối catch
trong java được sử dụng để xử lý nếu xảy ra Exception, nếu không thì nó bị bỏ qua.
Khối catch
phải được sử dụng ngay sau khối try
. Bạn có thể sử dụng nhiều khối catch
với nhưng chỉ có một khối try
duy nhất.
Cú pháp của try catch trong Java:
try {
// code có thể ném ra ngoại lệ
} catch(Exception_class_Name ex) {
// code xử lý ngoại lệ
}
Cú pháp của try finally trong Java
try {
// code có thể ném ra ngoại lệ
} finally {
// code trong khối này luôn được thực thi
}
Cú pháp của try catch finally trong Java
try {
// code có thể ném ra ngoại lệ
} catch(Exception_class_Name_1 ex) {
// code xử lý ngoại lệ 1
} catch(Exception_class_Name_2 ex) {
// code xử lý ngoại lệ 2
} catch(Exception_class_Name_n ex) {
// code xử lý ngoại lệ n
} finally {
// code trong khối này luôn được thực thi
}
2 kiểu ngoại lệ trong Java
Có 2 kiểu ngoại lệ trong Java:
-
Checked Exceptions: Các ngoại lệ này thường là bị buộc phải bắt hoặc khai báo. Nếu quy tắc này không được tuân theo thì trình biên dịch sẽ không thực thi chương trình.
-
Unchecked Exceptions: Ngoại lệ này thường là do viết code sai, truyền đối null hoặc tham số không chính xác...
Các ngoại lệ kiểu Checked Exceptions phổ biến:
-
IOException: Ngoại lệ liên quan đến file input / output
-
SQLException: Ngoại lệ liên quan đến cú pháp SQL
-
DataAccessException: Ngoại lệ liên quan đến việc truy cập CSDL
-
ClassNotFoundException: Bị ném khi JVM không thể tìm thấy một lớp mà nó cần, do lỗi dòng lệnh, sự cố đường dẫn hoặc tệp, class bị thiếu...
-
InstantiationException: Ngoại lệ khi cố gắng tạo đối tượng của một abstract class hoặc interface
Các ngoại lệ kiểu Unchecked Exceptions phổ biến:
-
NullPointerException: Ngoại lệ bị ném ra khi cố gắng truy cập một đối tượng có biến tham chiếu có giá trị hiện tại là null
-
ArrayIndexOutOfBound: Ngoại lệ khi cố gắng truy cập một phần tử vượt quá độ dài của mảng
-
IllegalArgumentException: Ngoại lệ bị ném ra khi một phương thức nhận được một đối số được định dạng khác với phương thức mong đợi.
-
IllegalStateException: Ngoại lệ bị ném ra khi trạng thái của môi trường không phù hợp với hoạt động cố gắng thực hiện, ví dụ: Sử dụng Scanner đã bị đóng.
-
NumberFormatException: Ngoại lệ bị ném khi một phương thức chuyển đổi một Chuỗi thành số nhưng không thể chuyển đổi.
-
ArithmeticException: Lỗi số học, chẳng hạn như chia cho 0.
Trên đây là cú pháp sử dụng try catch, và các ngoại lệ phổ biến. Còn sử dụng cụ thể như thế nào thì mời bạn sang tiếp phần tiếp theo.
2. Ví dụ về cách sử dụng try catch trong java
Ở phần này mình sẽ giới thiệu cho các bạn một số ví dụ để các bạn làm quen với try catch trong Java nhé.
Tuy nhiên, đầu tiên, nếu chúng ta không sử dụng try catch, hãy thử chạy một đoạn code lỗi sau, xem trình biên dịch sẽ báo như thế nào nhé.
public class TryCatchDemo {
public static void main(String[] args) {
int data = 5 / 0;
System.out.println("Phép chia cho 0");
}
}
Và đây là kết quả:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at demo.TryCatchDemo.main(TryCatchDemo.java:5)
Trình biên dịch đã dừng lại ngay tại dòng int data = 5 / 0
và ném ra một ngoại lệ (exception) ở trong màn hình console.
Lúc này dòng System.out.println("Phép chia cho 0");
chưa được thực thi.
Sau đây chúng ta sử dụng try catch để xử lý ngoại lệ chia cho số 0 trên xem sao nhé.
Ví dụ 1: Sử dụng try catch trong Java (với chỉ một khối catch)
public class TryCatchDemo {
public static void main(String[] args) {
//Xử lý ngoại lệ bằng try catch trong Java
try {
int data = 5 / 0;
} catch (ArithmeticException e) {
//In ra màn hình tên ngoại lệ
System.out.println(e);
}
System.out.println("Phép chia cho 0");
}
}
Và đây là kết quả:
java.lang.ArithmeticException: / by zero
Phép chia cho 0
Nếu như bình thường (giống ở ví dụ trên) thì lẽ ra chia một số cho số 0 thì chương trình Java sẽ gặp lỗi và dừng thực thi.
->
Câu lệnh sau đó System.out.println("Phép chia cho 0"); sẽ không bao giờ được thực thi.
Nhưng ở đây, cho dù gặp lỗi chia cho số 0 nhưng câu lệnh sau đó vẫn được thực thi.
Điều này chứng tỏ rằng, try catch đã làm việc thành công. Nó đã bắt được ngoại lệ và tiếp tục thực thi dòng chảy bình thường của chương trình.
Tiếp theo, chúng ta có thể sử dụng nhiều khối lệnh catch như ví dụ sau:
Ví dụ 2: Sử dụng try catch trong Java (với nhiều khối catch)
Trước tiên, bạn hãy đọc qua ví dụ ở dưới đây và xem kết quả. Mình sẽ giải thích ví dụ này sau:
public class TryCatchDemo {
public static void main(String[] args) {
try {
int arr[] = new int[5];
arr[6] = 4;
System.out.println("arr[6 = " + arr[6]);
int data = 0;
int div = 10 / data;
System.out.println("Average = " + div);
String obj = null;
System.out.println(obj.length());
} catch (NullPointerException ex) {
System.out.println(ex);
} catch (ArithmeticException ex) {
System.out.println(ex);
} catch (ArrayIndexOutOfBoundsException ex) {
System.out.println(ex);
}
System.out.println("Finished!");
}
}
Kết quả:
java.lang.ArrayIndexOutOfBoundsException: 6
Finished!
Ở ví dụ này, mình thử tạo một mảng với 5 phần tử.
Mình biết rõ là Java không cho phép truy cập vào phần tử không tồn tại trong mảng. Nhưng mình vẫn làm để cho nó xảy ra lỗi (Sau đó sẽ bắt ngoại lệ ArrayIndexOutOfBoundsException)
Tiếp theo nữa, mình cố gắng tạo ra một lỗi NullPointerException và một lỗi toán học (lỗi chia cho số 0)
Sau đó mình ném tất cả code thực thi vào khối try.
Ngay sau đó, mình lần lượt tạo ra các khối catch để bắt từng loại ngoại lệ mà mình nghĩ rằng trong quá trình thực thi sẽ xảy ra.
Lưu ý!
Khi bắt gặp một ngoại lệ, trình biên dịch Java sẽ ngay lập tức thực thi xử lý ngoại lệ tương ứng (do đó, nó thoát khỏi khối try và không tìm thấy 2 ngoại lệ khác mà mình đã cố tạo ra)
Ví dụ 3: Sử dụng try finally trong Java (ngoại lệ xảy ra nhưng không được xử lý)
Ở ví dụ này, mình thử bắt ngoại lệ với khối catch, nhưng mình sẽ bắt ngoại lệ không đúng.
public class TryCatchDemo {
public static void main(String[] args) {
try {
int data = 5 / 0;
} catch (NullPointerException ex) {
System.out.println(ex);
} finally {
System.out.println("Khối lệnh finally luôn được thực thi");
}
System.out.println("Finished!");
}
}
Kết quả:
Khối lệnh finally luôn được thực thi
Exception in thread "main" java.lang.ArithmeticException: / by zero
at demo.TryCatchDemo.main(TryCatchDemo.java:6)
Và cũng ví dụ này, nhưng mình thử không sử dụng khối catch:
public class TryCatchDemo {
public static void main(String[] args) {
try {
int data = 5 / 0;
} finally {
System.out.println("Khối lệnh finally luôn được thực thi");
}
System.out.println("Finished!");
}
}
Bạn thử chạy chương trình trên xem kết quả như thế nào?
Như phần đầu đã trình bày thì khối finally
luôn luôn được thực hiện dù có xảy ra ngoại lệ hay không.
Trong ví dụ trên, ngoại lệ có xảy ra nhưng mình cố tình bắt sai mã ngoại lệ, đúng ra phải là ArithmeticException
chứ không phải là NullPointerException
.
Do đó ngoại lệ vẫn xảy ra vì chưa bắt đúng, nhưng dòng System.out.println("Khối lệnh finally luôn được thực thi");
vẫn được thực thi và in ra màn hình, trong khi chương trình đã stop, không thực thi câu lệnh System.out.println("Finished!");
Ví dụ 4: Sử dụng try finally trong Java và nơi ngoại lệ xảy ra và được xử lý
Cũng tương tự ví dụ trên, nhưng lần này mình sẽ bắt đúng ngoại lệ.
public class TryCatchDemo {
public static void main(String[] args) {
try {
int data = 5 / 0;
} catch (ArithmeticException ex) {
System.out.println(ex);
} finally {
System.out.println("Khối lệnh finally luôn được thực thi");
}
System.out.println("Finished!");
}
}
Kết quả
java.lang.ArithmeticException: / by zero
Khối lệnh finally luôn được thực thi
Finished!
Nhìn vào ví dụ này, các bạn thấy đó, cho dù có bắt đúng ngoại lệ hay không thì khối finally cũng luôn được thực thi.
Đây là cách học lập trình mình luôn khuyến khích các bạn THỬ - SAI để hiểu rõ bản chất, các Java ứng xử với code của mình viết như thế nào.
Bằng cách này, nhiều học viên của mình đã rất tự tin khi review code cũng như trao đổi với cả các bạn làm lập trình lâu năm.
> Nếu bạn muốn phát triển sự nghiệp lập trình viên với ngôn ngữ Java nhanh hơn thì có thể tham gia KHÓA HỌC JAVA (6 tháng học offline thực chiến) này!
Chúc mừng, bạn đã hiểu rõ hơn về try catch trong Java
Như vậy chúng ta đã vừa tìm hiểu xong cách sử dụng try catch trong Java để xử lý các ngoại lệ phát sinh trong khi lập trình.
Cũng đơn giản thôi phải không nhỉ?
Nếu bạn sử dụng IDE thông minh như Eclipse thì nó còn có chức năng thông báo để bạn biết rằng khi nào bạn cẩn phải xử lý ngoại lệ.
Thậm chí chỉ cần click là có thể tự động tạo ra mã xử lý ngoại lệ, rất thuận tiện. Thế nên, nếu bạn đang học lập trình Java hãy chọn ngay một IDE và sử dụng nó.
---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #python #java #php