Cách sử dụng TRY CATCH trong JAVA

Ngày đăng: 03/06/2020   -    Cập nhật: 14/04/2021
Đã 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

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ó.


 
> Cách gỡ lỗi Java (Như một "Chiên gia")

---
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

Bình luận Facebook
Khóa học liên quan đến bài viết

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

Lập trình PHP với Laravel Framework

42 giờ
Khóa học Lập trình PHP với Laravel Framework được NIIT - ICT HÀ NỘI xây dựng nhằm hoàn thiện kỹ năng lập trình web các các bạn đã biết Lập trình Web PHP thuần.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!