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.
Không Phải Lúc Nào Try Thì Luồng Cũng Bị Bẻ Vào Catch
Như bạn đã làm quen, không phải lúc nào các câu lệnh bên trong khối try cũng gây ra Exception, và vì vậy không phải lúc nào các câu lệnh bên trong khối catch cũng được thực thi đâu nhé, nếu logic trong try được thực thi an toàn. Như ví dụ ngay trên đây, nếu bạn không thực hiện việc chia 10 cho 0 thì sẽ không có câu thông báo “Có một phép chia không thực hiện được” được in ra màn hình.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Try catch trong Java dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!
Từ khóa finally
Từ khóa finally có ý nghĩa sẽ chạy những dòng code sau khi kết thúc try catch bất kì có lỗi hay không.
Ví dụ:
public static void main(String[] args) { // TODO Auto-generated method stub int S=0; try { for (String arg : args) { S+= Integer.parseInt(arg); System.out.println(arg); } } catch (Exception e) { System.out.println("Error:"+e.toString()); } finally { System.out.println("This is end"); } }
Bài Tập Số 1
Giả sử mình có chương trình sau. Chương trình sẽ tạo ra 10 số nguyên ngẫu nhiên và lưu vào mảng 10 phần tử. Chương trình sẽ cho người dùng nhập vào một chỉ số của mảng rồi xuất giá trị của mảng đó ra console.
// Tạo một mảng 10 các số nguyên ngẫu nhiên int randomIntNumbers[] = new int[10]; Random rand = new Random(); for(int i = 0; i < 10; i++) { randomIntNumbers[i] = rand.nextInt(100); } // Cho người dùng nhập một số nguyên và in ra màn hình // phần tử mảng tương ứng Scanner input = new Scanner(System.in); System.out.println(“Bạn muốn in ra phần tử mảng thứ mấy? “); int index = input.nextInt(); System.out.println(“OK, phần tử mảng thứ ” + index + ” mang giá trị ” + randomIntNumbers[index]);
Tất nhiên, chương trình này tiềm ẩn nhiều nguy cơ gây ra Exception ở runtime. Bạn hãy cố gắng ràng các try catch tương ứng để khi có Exception xảy ra thì chương trình có thể thông báo lỗi kịp thời đến với người dùng nhé.
Và đây là code đáp án, bạn nên tự code và tự “phá” chương trình trước khi click vào đáp án này.
// Tạo một mảng 10 các số nguyên ngẫu nhiên int randomIntNumbers[] = new int[10]; Random rand = new Random(); for(int i = 0; i < 10; i++) { randomIntNumbers[i] = rand.nextInt(100); } try { // Cho người dùng nhập một số nguyên và in ra màn hình // phần tử mảng tương ứng Scanner input = new Scanner(System.in); System.out.println(“Bạn muốn in ra phần tử mảng thứ mấy? “); int index = input.nextInt(); System.out.println(“OK, phần tử mảng thứ ” + index + ” mang giá trị ” + randomIntNumbers[index]); } catch (InputMismatchException e) { System.out.println(“Phần tử mảng chưa hợp lệ, vui lòng nhập vào một số nguyên!”); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(“Phần tử mảng chưa hợp lệ, vui lòng nhập vào giá trị từ 0 đến 9!”); }
Thực Hành Kiểm Chứng Cách Hoạt Động Của Try Catch
Với bài thực hành này bạn sẽ hiểu rõ hơn thực chất việc “bẫy” lỗi và việc thực hiện các dòng code catch xảy ra ngay như thế nào khi cái “bẫy” đã bẫy được lỗi nhé.
Bạn xem đoạn code với try catch đầy đủ như sau. Hãy thử đoán xem kết quả in ra console sẽ như thế nào.
try { System.out.println(“Bài toán thực hiện phép chia:”); int ketQua = 10 / 2; System.out.println(“10 chia 2 bằng ” + ketQua); ketQua = 10 / 1; System.out.println(“10 chia 1 bằng ” + ketQua); ketQua = 10 / 0; System.out.println(“10 chia 0 bằng ” + ketQua); } catch (ArithmeticException e) { System.out.println(“Có một phép chia không thực hiện được”); }
Và đây là kết quả.
Ồ. Dòng in ra consolde System.out.println(“10 chia 0 bằng ” + ketQua); đâu rồi nhỉ. Thực ra là, ngay khi hệ thống phát hiện có Exception trong khối try xảy ra, thì các dòng code bên dưới của khối try đó sẽ không được thực thi nữa mà nhường chỗ cho các khối lệnh trong catch thực thi kế tiếp. Như minh họa vui mắt một chút như sau.
Một Số Quy Tắc Với Try Catch
Đến đây thì bạn đã biết cách bao lấy các dòng code có khả năng gây ra Exception bằng try catch như thế nào rồi. Tuy nhiên mình biết với các bạn mới bắt đầu làm quen với try catch sẽ có rất nhiều câu hỏi, mình xin liệt kê chúng dưới dạng các quy tắc sau.
Bài Tập Số 2
Mình có đoạn code sau đã được try catch “cẩn thận”, bạn xem try catch như vậy có còn khả năng gây ra lỗi nào nữa không.
Scanner input = new Scanner(System.in); Integer intNumber = null; try { System.out.println(“Hãy nhập vào một số nguyên: “); String strNumber = input.nextLine(); intNumber = new Integer(strNumber); } catch (NumberFormatException e) { System.out.println(“Vui lòng nhập vào một số nguyên”); } System.out.println(“Chuyển thành Hexa: ” + Integer.toHexString(intNumber));
Và mình đã phát hiện nó chưa tốt. Vì nếu có Exception xảy ra với đoạn kêu người dùng nhập vào một số, thì intNumber khi đó chưa được khởi tạo (mang giá trị null), và sẽ có một Exception khác xảy ra cho đoạn code cuối cùng. Mình sửa lại code này như sau.
try { Scanner input = new Scanner(System.in); Integer intNumber = null; System.out.println(“Hãy nhập vào một số nguyên: “); String strNumber = input.nextLine(); intNumber = new Integer(strNumber); System.out.println(“Chuyển thành Hexa: ” + Integer.toHexString(intNumber)); } catch (NumberFormatException e) { System.out.println(“Vui lòng nhập vào một số nguyên”); }
Các bạn vừa xem xong phần 2 của loạt bài về Exception. Qua bài học này chúng ta đã cùng nhau làm quen với việc bắt lỗi và bẻ luồng của ứng dụng thông qua công cụ try catch. Try catch sẽ còn có “biến thể” nữa và mình sẽ dành phần sau để nói tiếp nhé.
Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:
– Đánh giá 5 sao bên dưới mỗi bài nếu thấy thích.– Comment bên dưới mỗi bài nếu có thắc mắc.– Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.– Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.
Nội dung
Để đọc hiểu bài này, tốt nhất các bạn nên có kiến thức cơ bản về các phần sau:
- CÁC BIẾN TRONG JAVA.
- CÁC KIỂU DỮ LIỆU TRONG JAVA.
- CÁC HẠNG TOÁN TỬ TRONG JAVA
- CẤU TRÚC RẼ NHÁNH TRONG JAVA
- VÒNG LẶP WHILE TRONG JAVA
- VÒNG LẶP FOR TRONG JAVA
- MẢNG TRONG JAVA
- VÒNG LẶP FOR-EACH TRONG JAVA
- VAI TRÒ BREAK, CONTINUE TRONG VÒNG LẶP JAVA
- SWITCH TRONG JAVA
- LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- CLASS TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- CÁC LOẠI PHẠM VI TRUY CẬP TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- TỪ KHÓA STATIC TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- TỪ KHÓA THIS TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- THỪA KẾ TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- SETTER & GETTER TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- OVERRIDING VÀ OVERLOADING TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- TÍNH TRỪU TƯỢNG TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- INTERFACE TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- PHƯƠNG THỨC MAIN TRONG JAVA
Bài này chúng ta sẽ tìm hiểu những vấn đề sau:
- Try Catch là gì?
- Cú pháp Try Catch
- Từ khóa finally
- Từ khóa throw
The throw keyword
The
throw
statement allows you to create a custom error.
The
throw
statement is used together with an exception type. There are many exception types available in Java:
ArithmeticException
,
FileNotFoundException
,
ArrayIndexOutOfBoundsException
,
SecurityException
, etc:
Example
Throw an exception if age is below 18 (print “Access denied”). If age is 18 or older, print “Access granted”:
public class Main { static void checkAge(int age) { if (age < 18) { throw new ArithmeticException("Access denied - You must be at least 18 years old."); } else { System.out.println("Access granted - You are old enough!"); } } public static void main(String[] args) { checkAge(15); // Set age to 15 (which is below 18...) } }
The output will be:
Exception in thread "main" java.lang.ArithmeticException: Access denied - You must be at least 18 years old.at Main.checkAge(Main.java:4)at Main.main(Main.java:12)
If age was 20, you would not get an exception:
Example
checkAge(20);
The output will be:
Access granted - You are old enough!
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.
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
Thực Hành Xây Dựng Try Với Nhiều Catch
Ở bài thực hành này, bạn sẽ được làm quen với các Checked Exception, và làm quen với cách nhanh nhất để thêm khối lệnh try catch (hoặc try với nhiều catch) trong Eclipse.
Đầu tiên, bạn hãy code dòng sau vào một phương thức nào đó.
FileOutputStream outputStream; outputStream = new FileOutputStream(“E://file.txt”); outputStream.write(65); outputStream.close();
Bạn sẽ ngay lập tức thấy các báo lỗi từ trình biên dịch.
Đây không hẳn là một lỗi. Vì khi bạn click vào icon hình bóng đèn bên trái, bạn sẽ thấy một gợi ý khắc phục như sau.
Rõ ràng đây là một Checked Exception, và hệ thống đang gợi ý cho bạn với hai lựa chọn.
– Add throws declaration: lựa chọn này cho phép bạn không cần phải tạo ra bất kỳ khối try catch nào, mà tiếp tục “quăng cho thằng nào đó” try catch giúp. Kỹ thuật này sẽ được mình nói đến ở bài tiếp theo.– Surround with try/catch: đây là lựa chọn mà chúng ta mong muốn, với việc chọn lựa tùy chọn này, hệ thống sẽ bao lấy code của bạn bằng một khối try catch với Exception có tên là FileNotFoundException.
Bạn có thể tự gõ vào try catch như gợi ý. Nhưng nếu bạn chọn tùy chọn thứ hai, hệ thống sẽ try catch tự động cho bạn, tuy nhiên cái tự động này khá “vụng về”, bạn cứ nên sửa lại cho code nhìn đẹp đẹp như sau.
try { FileOutputStream outputStream; outputStream = new FileOutputStream(“E://file.txt”); outputStream.write(65); outputStream.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Và bạn có thể thấy, dù cho đã try catch với FileNotFoudException, thì hệ thống vẫn cứ đang báo lỗi. Chúng ta cùng xem.
Thì ra là hệ thống cần bạn phải catch thêm một Exception khác có tên IOException. Lúc bấy giờ tùy chọn có thể nhiều hơn. Như hình trên, chúng bao gồm.
– Add throws declaration: giống như mình đã nói ở trên.– Add catch clause to surrounding try: thêm một catch nữa, dạng try catch catch như cú pháp thứ nhất trong mục này.– Add exception to existing catch clause: thêm một Exception vào trong catch sẵn có. Dạng try catch (ExceptionClass1 | ExceptionClass2) như cú pháp thứ hai trong mục này.– Surround with try/catch: lồng thêm một try catch vào try catch hiện tại, cách này mình ít áp dụng vì nhìn code phức tạp lắm.
Đến đây bạn có thể chọn cách thứ hai để code trông như thế này.
try { FileOutputStream outputStream; outputStream = new FileOutputStream(“E://file.txt”); outputStream.write(65); outputStream.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Hoặc chọn cách thứ ba để ra code này.
try { FileOutputStream outputStream; outputStream = new FileOutputStream(“E://file.txt”); outputStream.write(65); outputStream.close(); } catch (FileNotFoundException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Thực Hành Xây Dựng Try Catch
Chúng ta cùng xem loại đoạn code có khả năng gây ra Exception, bạn có thể xem lại chúng ở mục này. Còn đây mình sẽ viết chúng lại.
int num[] = {1, 2, 3, 4}; System.out.println(num[5]);
Bạn đã biết code đây rơi vào một Unchecked Exception, tức là trình biên dịch sẽ không nhận biết và kiểm tra giúp bạn liệu Exception có xảy ra hay không.
Nhưng nếu trình biên dịch không làm gì cả thì chúng ta cũng đừng đứng khoanh tay nhé. Để chắc chắn ứng dụng của chúng ta “khỏe mạnh”, bạn nên lường trước các tình huống có khả năng xảy ra Exception và bao các đoạn code “có khả năng gây bệnh” vào khối try catch.
Nếu ngoan cố thực thi ứng dụng, bạn sẽ nhận được một thông báo lỗi như thế này. Bạn hãy chú ý cái Exception nhé, chúng ta sẽ catch chúng lại ở bên dưới.
Nào, chúng ta hãy bao đoạn có khả năng gây ra lỗi bằng khối try catch như sau.
try { int num[] = {1, 2, 3, 4}; System.out.println(num[5]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(“Không thể in được vì không tìm thấy phần tử mảng như mong đợi.”); }
Khi này, nếu bạn thực thi lại ứng dụng, người dùng sẽ dễ hiểu hơn với kiểu thông báo lỗi mang “tính người” hơn như sau.
Java try and catch
The
try
statement allows you to define a block of code to be
tested for errors while it is being executed.
The
catch
statement allows you to define a block of code to
be executed, if an error occurs in the try block.
The
try
and
catch
keywords
come in pairs:
Syntax
try { // Block of code to try } catch(Exception e) { // Block of code to handle errors }
Consider the following example:
This will generate an error, because myNumbers[10] does not exist.
public class Main { public static void main(String[ ] args) { int[] myNumbers = {1, 2, 3}; System.out.println(myNumbers[10]); // error! } }
The output will be something like this:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10at Main.main(Main.java:4)
If an error occurs, we can use
try...catch
to catch the error and execute some code to handle it:
Example
public class Main { public static void main(String[ ] args) { try { int[] myNumbers = {1, 2, 3}; System.out.println(myNumbers[10]); } catch (Exception e) { System.out.println("Something went wrong."); } } }
The output will be:
Something went wrong.
✅ Bắt lỗi ngoại lệ trong Java là gì?
Khi chạy chương trình, có rất nhiều loại lỗi khác nhau có thể xảy ra như: lỗi do sai lầm người viết, lỗi do sai thông tin đầu vào hoặc những lỗi mà không thể lường trước được. Và khi có lỗi, Java sẽ dừng lại và hiển thị thông tin lỗi ra, kĩ thuật đó thường được gọi là “throw an exception/error”.Ví dụ chương trình Java sẽ ném lỗi như sau:
Lỗi trên có thể nhấn Ctrl S mà nó dính chữ “s” vào trong giá trị tham số của hàm chẳng hạn 😆. Và có những lỗi xuất phát từ người dùng, thì lúc đó ta không thể cho họ xem thông tin lỗi như thế này được. Với những người không thành thạo về máy vi tính hoặc tiếng Anh thì họ nghĩ chương trình bạn viết bị lỗi mà không phải lỗi từ họ.Vì vậy, Try Catch có nhiệm vụ bắt (Catch) các lỗi mà thực tế có thể xảy ra để xử lý sao cho chương trình thân thiện với người dùng hơn.
Nhiều khối catch trong Java
Nếu bạn phải thực hiện các tác vụ khác nhau mà có thể xảy ra các exception khác nhau, bạn sử dụng nhiều khối catch trong Java. Bạn theo dõi ví dụ đơn giản sau:
public class TestMultiCatchBlock{ public static void main(String args[]){ try{ int a[]=new int[5]; a[5]=30/0; } catch(ArithmeticException e){System.out.println(“Task1 duoc hoan thanh”);} catch(ArrayIndexOutOfBoundsException e){System.out.println(“Task2 duoc hoan thanh”);} catch(Exception e){System.out.println(“Task chung duoc hoan thanh”);} System.out.println(“Phan code con lai…”); } }
Chương trình sẽ cho kết quả sau:
Task1 duoc hoan thanh Phan code con lai…
Qui tắc 1: Tại một thời điểm, chỉ một exception được xuất hiện và tại một thời điểm chỉ có một khối catch được thực thi.
Qui tắc 2: Tất cả khối catch phải được sắp xếp từ cụ thể nhất tới chung nhất, ví dụ: việc bắt ArithimeticExption phải ở trước việc bắt Exception.
class TestMultipleCatchBlock1{ public static void main(String args[]){ try{ int a[]=new int[5]; a[5]=30/0; } catch(Exception e){System.out.println(“Task chung duoc hoan thanh”);} catch(ArithmeticException e){System.out.println(“Task1 duoc hoan thanh”);} catch(ArrayIndexOutOfBoundsException e){System.out.println(“Task2 duoc hoan thanh”);} System.out.println(“Phan code con lai…”); } }
Chạy chương trình trên sẽ cho một lỗi compile time error.
Từ khóa throw
Từ khóa throw mục đích chính là để ném lỗi, thường khi bạn viết các phương thức cho người khác người dùng và bắt người khác phải tự xử lý những trường hợp đó. Bản chất các Exception là các class, nên khi ném lỗi có nghĩa là: Bạn khởi tạo đối tượng Exception và throw cho người viết sau này phải catch lại:
Ví dụ: Throw lỗi nếu người dùng nhập tham số lớn hơn 100, ta sử dụng class ArithmeticException để xử lý:
public class HelloWorld { static void inputValue(int value) { if (value>100) { throw new ArithmeticException("Value>100"); } } public static void main(String[] args) { // TODO Auto-generated method stub inputValue(102); } }
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.
Lồng khối try trong Java
Việc một khối try bên trong một khối try khác thì được gọi là các khối try được lồng vào nhau, hay là lồng các khối try trong Java.
Tại sao sử dụng các khối try lồng nhau trong Java
Đôi khi có một tình huống là một phần của một khối code có thể gây ra một lỗi và toàn bộ khối lại có thể gây ra lỗi khác. Trong các tình huống đó, Exception Handler phải được lồng vào nhau. Cú pháp:
…. try { lenh 1; lenh 2; try { lenh 1; lenh 2; } catch(Exception e) { } } catch(Exception e) { } ….
Ví dụ về các khối try lồng nhau trong Java
class Excep6{ public static void main(String args[]){ try{ try{ System.out.println(“Thuc hien phep chia”); int b =39/0; }catch(ArithmeticException e){System.out.println(e);} try{ int a[]=new int[5]; a[5]=4; }catch(ArrayIndexOutOfBoundsException e){System.out.println(e);} System.out.println(“Lenh khac”); }catch(Exception e){System.out.println(“Da xu ly”);} System.out.println(“Luong chuan..”); } }
Chương trình sẽ cho kết quả sau:
Thuc hien phep chia java.lang.ArithmeticException: / by zero java.lang.ArrayIndexOutOfBoundsException: 5 Lenh khac Luong chuan..
Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng….miễn phí. Tải ngay ứng dụng trên Android và iOS.
Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập Java. Khóa học có giá chỉ 300K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.
Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp a Tuyền, cựu sinh viên Bách Khoa K53, fb: https://www.facebook.com/tuyen.vietjack
Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com
Follow facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile…. mới nhất của chúng tôi.
Bài học Java phổ biến tại vietjack.com:
NỘI DUNG BÀI HỌC
✳️ Cách sử dụng Try Catch trong Java
✳️ Các loại Exception trong Java
✅ Cách sử dụng Try Catch trong Java
🔆 Khi nào cần sử dụng try catch
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ệ trong Java
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 }
✳️ 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 TryCatchDemo1 { 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 Bai17_TryCatch.TryCatchDemo1.main(TryCatchDemo1.java:5)
Trình biên dịch đã dừng lại ngay tại dòng
int data = 5 / 0và 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 TryCatchDemo1 { 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 TryCatchDemo2 { 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: Index 6 out of bounds for length 5 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 TryCatchDemo3 { 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 Bai17_TryCatch.TryCatchDemo3.main(TryCatchDemo3.java:6)
Và cũng ví dụ này, nhưng mình thử không sử dụng khối catch:
public class TryCatchDemo3 { 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
finallyluô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 TryCatchDemo4 { 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.
Giải quyết bằng xử lý ngoại lệ
public class TestTryCatch2 { public static void main(String args[]) { try { int data = 50 / 0; } catch (ArithmeticException e) { System.out.println(e); } System.out.println(“rest of the code…”); } }
Output:
java.lang.ArithmeticException: / by zero rest of the code…
Trong ví dụ này, phần còn lại của code được thực thi nghĩa là dòng chữ “rest of the code…” được in ra màn hình.
Đăng nhập/Đăng ký
Danh sách bài
Giới thiệu về Java
Hello World
JDK, JRE & JVM
Làm quen với Java
Biến & hằng
Toán tử
Biểu thức & câu lệnh
Kiểu dữ liệu
Chuỗi ký tự
Nhập xuất
Chú thích
Luồng điều khiển trong Java
Switch
If…else
Đệ quy
Hướng đối tượng trong Java
Lớp & đối tượng
Chỉ định truy cập
Phương thức
Hàm tạo
Nạp chồng
Kế thừa
Instanceof
Final
Con trỏ this
Ghi đè
Từ khóa super
Tính trừu tượng
Interface
Lớp Singleton
Enum
Reflection
Đa hình
Đóng gói
Lớp lồng nhau
Lớp ẩn danh
Xử lý ngoại lệ trong Java
Ngoại lệ
Try Catch
Xử lý nhiều ngoại lệ
Try-with-resources
Annotation
Các kiểu Annotation
Throw & Throws
Ghi log
Assertion
Các lớp nâng cao trong Java
Collection Interface
Arraylist
Queue Interface
PriorityQueue
Deque Interface
LinkedList
ArrayDeque
BlockingQueue Interface
ArrayBlockingQueue
LinkedBlockingQueue
Map Interface
Hashmap
LinkedHashmap
Stack
Vector
Framework Collection
WeakHashMap
EnumMap
SortedMap Interface
NavigableMap Interface
TreeMap
ConcurrentMap Interface
ConcurrentHashMap
Set Interface
Hashset
EnumSet
LinkedHashSet
NavigableSet Interface
SortedSet Interface
TreeSet
Phương thức có sẵn
Iterator Interface
ListIterator Interface
Luồng nhập xuất trong Java (Đọc file và ghi file)
Luồng nhập xuất
InputStream
OutputStream
FileInputStream
FileOutputStream
ByteArrayInputStream
ByteArrayOutputStream
ObjectInputStream
ObjectOutputStream
BufferedInputStream
BufferedOutputStream
PrintStream
Reader & Writer
InputStreamReader & OutputStreamWriter
FileReader & FileWriter
BufferedReader & BufferedWriter
StringReader & StringWriter
PrintWriter
Scanner
Kiến thức bổ sung
Ép kiểu
Autoboxing & Unboxing
Biểu thức Lambda
Tính tổng quát
File
Wrapper
Tham số trên CommandLine
Tutorial
Java Tutorial
Trang trước
Trang tiếp theo
Bạn cần
đăng nhập
để bình luận bài viết này
Chưa có bình luận nào, hãy là người đầu tiên bình luận
Chia sẻ kiến thức – Kết nối tương lai
Về chúng tôi
Về chúng tôi
Giới thiệu
Chính sách bảo mật
Điều khoản dịch vụ
Học miễn phí
Học miễn phí
Khóa học
Luyện tập
Cộng đồng
Cộng đồng
Kiến thức
Tin tức
Hỏi đáp
CÔNG TY CỔ PHẦN CÔNG NGHỆ GIÁO DỤC VÀ DỊCH VỤ BRONTOBYTE
The Manor Central Park, đường Nguyễn Xiển, phường Đại Kim, quận Hoàng Mai, TP. Hà Nội
THÔNG TIN LIÊN HỆ
[email protected]
©2024 TEK4.VN
Copyright © 2024
TEK4.VN
Java try block is used to enclose the code that might throw an exception. It must be used within the method. If an exception occurs at the particular statement in the try block, the rest of the block code will not execute. So, it is recommended not to keep the code in try block that will not throw an exception. Java try block must be followed by either catch or finally block. Java catch block is used to handle the Exception by declaring the type of exception within the parameter. The declared exception must be the parent class exception ( i.e., Exception) or the generated exception type. However, the good approach is to declare the generated type of exception. The catch block must be used after the try block only. You can use multiple catch block with a single try block. The JVM firstly checks whether the exception is handled or not. If exception is not handled, JVM provides a default exception handler that performs the following tasks: But if the application programmer handles the exception, the normal flow of the application is maintained, i.e., rest of the code is executed. Let’s try to understand the problem if we don’t use a try-catch block. TryCatchExample1.java Test it Now Output:
As displayed in the above example, the rest of the code is not executed (in such case, the rest of the code statement is not printed). There might be 100 lines of code after the exception. If the exception is not handled, all the code below the exception won’t be executed. Let’s see the solution of the above problem by a java try-catch block. TryCatchExample2.java Test it Now Output:
As displayed in the above example, the rest of the code is executed, i.e., the rest of the code statement is printed. In this example, we also kept the code in a try block that will not throw an exception. TryCatchExample3.java Test it Now Output:
Here, we can see that if an exception occurs in the try block, the rest of the block code will not execute. Here, we handle the exception using the parent class exception. TryCatchExample4.java Test it Now Output:
Let’s see an example to print a custom message on exception. TryCatchExample5.java Test it Now Output:
Let’s see an example to resolve the exception in a catch block. TryCatchExample6.java Test it Now Output:
In this example, along with try block, we also enclose exception code in a catch block. TryCatchExample7.java Test it Now Output:
Here, we can see that the catch block didn’t contain the exception code. So, enclose exception code within a try block and use catch block only to handle the exceptions. In this example, we handle the generated exception (Arithmetic Exception) with a different type of exception class (ArrayIndexOutOfBoundsException). TryCatchExample8.java Test it Now Output:
Let’s see an example to handle another unchecked exception. TryCatchExample9.java Test it Now Output:
Let’s see an example to handle checked exception. TryCatchExample10.java Test it Now Output:
Next TopicMultiple catch block in java |
Khối try-catch trong Java
Catch Với Lớp Exception Luôn Được Không?
Bạn không nhất thiết phải catch với cụ thể các lớp con như ArrayIndexOutOfBoundsException hay ArithmeticException như các ví dụ trên kia. Mà bạn có thể sử dụng lớp cha Exception luôn. Khi đó câu lệnh sẽ là try {…} catch (Exception e) {…}. Vì đâu phải lúc nào bạn cũng nhớ các lớp con của Exception đâu! Nhưng hãy cẩn thận! Hãy học việc sử dụng các Exception con cụ thể, đừng vì lười mà sử dụng luôn lớp Exception, thậm chí là lớp Throwable để thay thế.
Để làm chi ư, dĩ nhiên đầu tiên code của bạn sẽ dễ dàng để quản lý hơn, và việc tung ra lỗi cho người dùng sẽ cụ thể hơn, điều này sẽ được sáng tỏ khi bạn làm quen với việc bắt nhiều lỗi cùng lúc như mục dưới đây.
Try Với Nhiều Catch
Có nhiều khi chúng ta nhồi nhét quá nhiều code vào khối try, khiến nó có khả năng gây ra nhiều hơn một Exception. Thì chúng ta hoàn toàn có thể áp dụng cú pháp sau để có thể bắt nhiều Exception ở cùng một lần try.
try { // Các dòng code có khả năng gây ra Exception } catch (ExceptionClass1 e1) { // Bắt các EceptionClass1 } catch (ExceptionClass2 e2) { // Bắt các EceptionClass2 } catch (ExceptionClass3 e3) { // Bắt các EceptionClass3 }
Theo như cú pháp trên đây, bạn vẫn sẽ bao lấy các câu lệnh có khả năng gây ra Exception vào một khối try. Rồi mỗi catch sẽ là một Exception riêng biệt. Sau đó, với bất cứ dòng nào gây ra Exception, hệ thống sẽ lần lượt tìm đến các khối catch bên dưới try cho đến khi tìm thấy một Exception tương ứng.
Đối với Java 7, bạn còn có thể viết cú pháp try với nhiều catch như sau. Các Exception ở cách viết này được nằm trong cùng một catch thôi nhưng chúng cách nhau bởi ký tự “|“.
try { // Các dòng code có khả năng gây ra Exception } catch (ExceptionClass1|ExceptionClass2|ExceptionClass3 e) { // Bắt các EceptionClass1, EceptionClass2 và EceptionClass3 }
Chúng ta sẽ làm quen với việc xây dựng nhiều catch như thế này ở bài thực hành tiếp theo.
Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Khóa học
Lập trình Java cơ bản đến hướng đối tượng
Với mục đích giới thiệu đến mọi người về Ngôn ngữ Java – một ngôn ngữ lập trình khá mới mẻ so với C, C++, Java, PHP ở Việt Nam.
Thông qua khóa học LẬP TRÌNH JAVA CƠ BẢN ĐẾN HƯỚNG ĐỐI TƯỢNG, Kteam sẽ hướng dẫn các bạn kiến thức cơ bản của Java. Để từ đó, có được nền tảng cho phép bạn tiếp tục tìm hiểu những kiến thức tuyệt vời khác của Java hoặc là một ngôn ngữ khác.
Cụ thể trong khóa học này, Kteam sẽ giới thiệu với các bạn Java ở phiên bản Java 8
Đánh giá
Siêu dễ hiểu và ngắn gọn chứ k lan man ! Công nhận bài học rất hay, bổ ích !
Nội dung chính
✅ Các loại Exception 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.
Chào mừng các bạn đã đến với bài học Java số 38, bài học về Exception (phần tiếp theo). Đây là bài học trong chuỗi bài về lập trình ngôn ngữ Java của Yellow Code Books.
Ở bài hôm trước các bạn đã làm quen với khái niệm Exception, và thử tạo một vài Exception để cùng “xem chơi”. Tuy nhiên, cái chính mà Exception ra đời không phải để chúng ta chỉ đứng nhìn một cách “bất lực” như vậy đâu. Chúng ta hoàn toàn có thể đối mặt với Exception, bằng cách bắt lấy chúng, chặn chúng lại không để chương trình bị lỗi, và làm những gì chúng ta mong muốn, như bài trước mình có dùng từ “bẻ luồng”.
Như vậy, phần thứ hai của chuỗi bài về Exception hôm nay chúng ta nói đến các kỹ thuật để bắt các Exception này.
Bạn có thể xem lại kiến thức giới thiệu về Exception ở phần đầu tiên này.
Làm Quen Với Try Catch
Như phần đầu bài học có giới thiệu, hôm nay chúng ta tìm cách bắt Exception, hay một số tài liệu gọi là “bẫy lỗi”.
Và tất nhiên, làm gì cũng vậy, nếu muốn chúng ta làm một điều gì đó, phải cung cấp cho chúng ta công cụ để thực hiện. Công cụ bẫy được cái Exception mà chúng đa đang nói tới có cái tên Try Catch.
Try catch là một công cụ giúp bạn bao bọc lấy đoạn code có khả năng xảy ra Exception. Hoặc các đoạn code đã được báo lỗi bởi hệ thống (chính là các Checked Exception). Các đoạn code mình nói đến này sẽ được chúng ta bao trong khối try. Để rồi nếu quả thực cái Exception đó xảy ra trong khối try đó, thì hệ thống sẽ nhanh chóng “bẻ” luồng logic của ứng dụng, chuyển sang thực thi các đoạn code bên trong khối catch.
Dựa vào lý giải trên đây, mời bạn cùng xem qua cú pháp cho try catch như sau.
try { // Các dòng code có khả năng gây ra Exception } catch (ExceptionClass e) { // Nếu thực sực Exception xảy ra, các dòng code này sẽ được gọi }
Để dễ hiểu hơn, mời bạn cùng try catch thử cho một trường hợp có khả năng xảy ra lỗi mà bài học trước bạn đã biết thông qua bài thực hành sau.
Cú pháp Try Catch
Cú pháp:
try {
//Những khối lệnh có thể phát sinh lỗi
} catch (Exception e) { //tham số e là tên lỗi muốn xử lý
//Chương trình thực hiện khi gặp lỗi trên
Ví dụ: khi gặp lỗi lấy phần tử trong mảng mà không tồn tại
Ta thấy chương trình sẽ throw lỗi là ArrayIndexOutOfBoundsException, ta sẽ catch lỗi đó như sau:
public static void main(String[] args) { // TODO Auto-generated method stub try { int[] a = {5,6,7}; System.out.println(a[4]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Index does not exist"); } }
Nếu bạn không thể lường trước toàn bộ lỗi, ta có thể đặt mặc định Exception để xử lý lỗi mà bạn chưa tính đến được.
Ví dụ: Tính tổng các tham số truyền vào trong phương thức main
public static void main(String[] args) { // TODO Auto-generated method stub int S=0; try { for (String arg : args) { S+= Integer.parseInt(arg); System.out.println(arg); } } catch (Exception e) { System.out.println("Error:"+e.toString()); } }
Ta dùng phương thức parseInt trong class Integer để chuyển giá trị kiểu String sang giá trị kiểu int (với điều kiện chuỗi đó mang ý nghĩa con số). Giả sử người dùng cho tham số truyền vào không phải kí tự số
Như vậy lỗi có tên là: java.lang.NumberFormatException
Vấn đề không có ngoại lệ xử lý
public class TestTryCatch1 { public static void main(String args[]) { int data = 50 / 0; // ném ra ngoại lê ở đây System.out.println(“rest of the code…”); } }
Output:
Exception in thread “main” java.lang.ArithmeticException: / by zero at vn.tpv.exception1.TestTryCatch1.main(TestTryCatch1.java:5)
Trong ví dụ trên, phần còn lại của code không được thực thi (dòng chữ “rest of the code…” không được in ra màn hình). Tất cả các lệnh không được thực thi sau khi xảy ra ngoại lệ.
Try Catch là gì?
Khi chạy chương trình, có rất nhiều loại lỗi khác nhau có thể xảy ra như: lỗi do sai lầm người viết, lỗi do sai thông tin đầu vào hoặc những lỗi mà không thể lường trước được. Và khi có lỗi, Java sẽ dừng lại và hiện thị thông tin lỗi ra, kĩ thuật đó thường được gọi là ‘throw an exception/error’.
Chương trình Java sẽ ném lỗi như sau:
Và có những lỗi xuất phát từ người dùng, thì lúc đó ta không thể cho họ xem thông tin lỗi như thế này được. Với những người không thành thạo về máy vi tính hoặc tiếng Anh thì họ nghĩ chương trình bạn viết bị lỗi mà không phải lỗi từ họ.
Vì vậy, Try Catch có nhiệm vụ bắt (Catch) các lỗi mà thực tế có thể xảy ra để xử lý sao cho chương trình thân thiện với người dùng hơn.
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: [email protected]
Fanpage: https://facebook.com/NIIT.ICT/
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #python #java #php
Try catch trong Java
Khối lệnh try trong java
Khối lệnh try trong java được sử dụng để chứa một đoạn code có thế xảy ra một ngoại lệ. Nó phải được khai báo trong phương thức.
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.
Cú pháp của khối lệnh try-catch trong java
try { // code có thể ném ra ngoại lệ } catch(Exception_class_Name ref) { // code xử lý ngoại lệ }
Cú pháp của khối lệnh 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 }
Vấn đề khi không có Exception Handling
Chúng ta cùng tìm hiểu vấn đề nếu không sử dụng khối try-catch.
public class Testtrycatch1{ public static void main(String args[]){ int data=50/0;//co the nem exception System.out.println(“Phan code con lai…”); } }
Chương trình sẽ cho kết quả sau:
Exception in thread “main” java.lang.ArithmeticException: / by zero
Như trong ví dụ trên, phần còn lại của code không được thực thi (trong ví dụ này là lệnh in Phan code con lai… không được in). Giả sử nếu có khoảng 100 dòng code sau exception, thì tất cả các dòng code này sẽ không được thực thi.
Finally
The
finally
statement lets you execute code, after
try...catch
, regardless of the result:
Example
public class Main { public static void main(String[] args) { try { int[] myNumbers = {1, 2, 3}; System.out.println(myNumbers[10]); } catch (Exception e) { System.out.println("Something went wrong."); } finally { System.out.println("The 'try catch' is finished."); } } }
The output will be:
Something went wrong.The 'try catch' is finished.
Xử lý vấn đề trên bởi Exception Handling trong Java
Bây giờ, cùng ví dụ trên, chúng ta sử dụng khối try-catch để xử lý vấn đề trên.
public class Testtrycatch2{ public static void main(String args[]){ try{ int data=50/0; }catch(ArithmeticException e){System.out.println(e);} System.out.println(“Phan code con lai…”); } }
Chương trình sẽ cho kết quả sau:
java.lang.ArithmeticException: / by zero Phan code con lai…
Lúc này, phần còn lại của code đã được thực thi.
Chế độ làm việc nội tại của khối try-catch trong Java
Đầu tiên, JVM kiểm tra xem exception đã được xử lý hay chưa. Nếu exception chưa được xử lý, JVM cung cấp một Exception Handler mặc định, để thực hiện các tác vụ sau:
-
In ra miêu tả của exception đó.
-
In ra stack trace (cấu trúc thứ bậc của phương thức nơi mà exception xuất hiện).
-
Làm cho chương trình ngừng lại.
Nhưng nếu exception đã được xử lý bởi Lập trình viên, thì luồng chuẩn của ứng dụng được duy trì (hay là phần còn lại của code được thực thi).
Keywords searched by users: try and catch java
Categories: Tóm tắt 74 Try And Catch Java
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/