1. Làm quen với Exception: Checked và Unchecked Exception, Error
1.1 Lời mở đầu
- Trong cuộc sống, không phải lúc nào mọi việc cũng diễn ra suôn sẻ, không phải lúc nào mọi thứ cũng theo đúng kế hoạch. Đôi khi, có những tình huống không mong muốn xảy ra, và chúng ta cần phải xử lý chúng.
![[Java Core] B7: Exception trong Java 10 image - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-1024x536.png)
- Khi một ứng dụng ngày càng lớn lên, chắc chắn ta không thể đảm bảo ứng dụng luôn hoạt động như cách ta muốn 100% mọi lúc được. Đến lúc nào đó, sẽ có lỗi xảy ra.
Ví dụ:
- Khi một ứng dụng cần đọc một file từ ổ cứng, nhưng file đó không tồn tại.
- Khi ứng dụng cần quyền chụp ảnh từ camera, nhưng người dùng không cho phép.
- Khi ứng dụng kết nối tới một server, nhưng server đang bị mất điện và không kết nối được.
Khi đó, hệ thống cần có những cách xử lý riêng cho người dùng biết vấn đề đang xảy ra, và có những cách xử lý riêng cho hệ thống có thể tiếp tục hoạt động mà không bị ảnh hưởng quá nhiều.
Ví dụ:
- Khi file không tồn tại, ứng dụng cần thông báo cho người dùng biết rằng file không tồn tại và yêu cầu người dùng chọn file khác, hoặc kiểm tra lại đường dẫn file.
- Khi người dùng không cho phép ứng dụng chụp ảnh, ứng dụng cần thông báo cho người dùng biết rằng không thể chụp ảnh và yêu cầu người dùng cấp quyền.
- Khi server bị mất điện, ứng dụng cần thông báo cho người dùng biết rằng không thể kết nối tới server và yêu cầu người dùng thử lại sau, hoặc kiểm tra xem đường truyền wifi, 3G, 4G có vấn đề gì không.
1.2 Exception là gì?
- Exception dịch ra tiếng Việt có nghĩa là ngoại lệ. Exception là một sự kiện xảy ra trong quá trình thực thi chương trình, làm ảnh hưởng đến luồng thực thi của chương trình.
1.3 Checked và Unchecked Exception
1.3.1 Checked Exception
![[Java Core] B7: Exception trong Java 11 image 1 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-1.png)
- Ảnh ví dụ: Khi ta thử đọc 1 file, IDE ngay lập tức thông báo có thể xảy ra FileNotFoundException (Ngoại lệ file không tồn tại) và yêu cầu ta phải xử lý nó.
- Checked Exception thường là những lỗi phổ biến mà chúng ta có thể dự đoán được sẽ xảy ra cho một thao tác nào đó.
- Ví dụ, khi đi dã ngoại, để phòng ngừa việc có mưa, ta mang theo áo mưa. Việc trời mưa là một ngoại lệ mà ta đã dự đoán trước và lên trước kế hoạch để xử lý nó.
1.3.2 Unchecked Exception
- Đây là những Exception không được kiểm tra tại thời điểm biên dịch (compile time). Tức là chúng ta không nhận được thông báo lỗi từ trình biên dịch khi mà nó phát hiện ra rằng chúng ta chưa xử lý nó.
- Đây là các exception khá nguy hiểm, khi mà chúng ta không thể dự đoán được chúng sẽ xảy ra khi nào. Bởi vì Exception này xảy ra khi ứng dụng đang thực thi, nên nó còn có thể gọi là
Runtime Exception. - Ví dụ, khi một ứng dụng chia một số cho 0, nó sẽ ném ra một ngoại lệ
ArithmeticException(Ngoại lệ toán học).
![[Java Core] B7: Exception trong Java 12 image 2 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-2-1024x434.png)
- Trong đoạn code trên, nếu ta nhập vào 1 số không tồn tại trong mảng, nó sẽ bị một Exception
ArrayIndexOutOfBoundsException(Ngoại lệ vượt quá giới hạn của mảng)., đây là một ví dụ về Unchecked Exception. Vì ta không thể biết được trước khi chạy chương trình, nó sẽ xảy ra khi nào.
1.4 Error
- Error là một dạng ngoại lệ mà chúng ta không thể xử lý được. Error thường xảy ra khi mà hệ thống gặp phải những vấn đề nghiêm trọng, không thể khắc phục được.
- Ví dụ, khi một ứng dụng chạy hết bộ nhớ, nó sẽ ném ra một ngoại lệ
OutOfMemoryError(Lỗi hết bộ nhớ). Đây là một ví dụ về Error. Đây là một ngoại lệ ta không thể xử lý được, và nó thường xảy ra khi mà hệ thống gặp phải những vấn đề nghiêm trọng, không thể khắc phục được.
2. Bắt Exception với try-catch
Bài tập
- Hãy viết chương trình nhập vào 1 String, và sử dụng
Integer.parseIntđể chuyển đổi String đó sang kiểu int. Thử nếu nhập vào 1 chuỗi không phải là số, xem chương trình sẽ báo lỗi như thế nào.
![[Java Core] B7: Exception trong Java 13 image 3 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-3.png)
- Khi chạy chương trình trên, ta sẽ nhận được một ngoại lệ
NumberFormatException(Ngoại lệ không đúng định dạng số). Đây là một ví dụ vềUnchecked Exception. Vì lúc compile, ta không nhận lỗi nào báo trước cả, do IDE không biết trước được String truyền vào khi chạy chương trình
![[Java Core] B7: Exception trong Java 14 image 5 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-5.png)
2.1 Cách bắt Exception
- Để bắt Exception, ta sử dụng cấu trúc try-catch. Cấu trúc try-catch sẽ giúp chúng ta bắt ngoại lệ, và xử lý nó một cách an toàn.
- Cấu trúc try-catch có dạng như sau:
![[Java Core] B7: Exception trong Java 15 image 6 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-6-1024x513.png)
- Trong đó:
try: Là một khối lệnh, chứa các câu lệnh có thể ném ra ngoại lệ.catch: Là một khối lệnh, chứa các câu lệnh xử lý ngoại lệ. Trong đó,Exception elà một biến, chứa thông tin về ngoại lệ xảy ra.
2.2 Ví dụ
- Ví dụ, ta sẽ sử dụng cấu trúc try-catch để bắt ngoại lệ
NumberFormatExceptionkhi chuyển đổi một chuỗi không phải là số sang kiểu int.
![[Java Core] B7: Exception trong Java 16 image 7 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-7-1024x718.png)
- Khi chạy chương trình trên, ta sẽ nhận được thông báo “Chuỗi không phải là số” khi chuyển đổi chuỗi “4.5a” sang kiểu float.
2.3 catch nhiều Exception
- Ta cũng có thể bắt nhiều ngoại lệ trong cùng một cấu trúc try-catch, bằng cách sử dụng nhiều khối catch.
Bài tập
- Hãy viết chương trình nhập vào số n, sau đó nhập vào n string. Sau đó nhập vào 1 số m, và in ra string thứ m. Nếu truy cập ngoài mảng, hãy in ra thông báo “Truy cập ngoài mảng”, còn nếu không in ra số được chuyển đổi từ string đó sang kiểu int, nếu không thể chuyển đổi được, hãy in ra thông báo “Chuỗi không phải là số”.\
![[Java Core] B7: Exception trong Java 17 image 8 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-8-1024x841.png)
- Như ví dụ trên, ta thấy ta có thể catch nhiều Exception trong cùng một cấu trúc try-catch.
2.4 Catch Exception cha
- Ta cũng có thể bắt Exception cha của một Exception con. Ví dụ, ta có thể bắt Exception cha của
NumberFormatExceptionlàException.
Bài tập
- Tương tự bài tập trên, nhưng chỉ dùng 1 catch, và có bất kì lỗi gì xảy ra ta đều in ra “Lỗi xảy ra + tên lỗi”.
![[Java Core] B7: Exception trong Java 18 image 9 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-9-1024x780.png)
- Như ví dụ trên, ta thấy ta có thể bắt Exception cha của
NumberFormatExceptionlàException.
3. Sử dụng finally
3.1 finally là gì?
- finally là một khối lệnh, chứa các câu lệnh sẽ được thực thi sau khi khối lệnh try-catch kết thúc.
- finally sẽ được thực thi sau khi khối lệnh try-catch kết thúc, bất kể có ngoại lệ xảy ra hay không.
3.2 Ví dụ
- Ví dụ, ta sẽ sử dụng finally để đóng Scanner sau khi sử dụng xong.
![[Java Core] B7: Exception trong Java 19 image 10 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-10-1024x810.png)
- Trong đoạn code trên, ta sẽ đóng Scanner sau khi sử dụng xong, bất kể có ngoại lệ xảy ra hay không.
Tác dụng
- finally thường được sử dụng để giải phóng tài nguyên, như đóng file, đóng kết nối, đóng Scanner, … Đây là một practice nên làm đó là giải phóng tài nguyên sau khi sử dụng xong, tránh lãng phí tài nguyên.
3.3 Một số câu hỏi
3.3.1 Tại sao không sử dụng Exception là xong mà cần catch Exception cụ thể, có nhiều class Exception con
- Khi sử dụng Exception là xong, ta sẽ bắt được tất cả các Exception, nhưng đôi khi ta cần xử lý một cách cụ thể cho từng Exception. Vì khi có lỗi xảy ra, cứ chỉ báo là đã có lỗi xảy ra thì thứ nhất người dùng rất khó chịu, ta khi sửa lỗi cũng không biết lỗi xảy ra là gì, ở đâu. Thứ hai, ta cũng không thể xử lý lỗi một cách cụ thể.
- Việc catch đúng Exception cụ thể sẽ giúp ta xử lý lỗi một cách cụ thể. Ví dụ: Nếu lỗi là chia cho 0, ta báo cho người dùng rằng họ nhập sai để họ biết sai ở đâu và sửa lại, còn nếu lỗi là không tìm thấy file, ta báo cho người dùng biết rằng file không tồn tại để họ biết cần phải tạo file mới. Hoặc nếu là các lỗi người dùng không hiểu được, ta cần báo các lỗi cụ thể, có định danh rõ ràng để lập trình viên có thể biết và sửa lỗi
- Ví dụ, trong window đôi lúc ta bị màn hình xanh, ta có các mã lỗi kiểu như
0x0000000A,0x0000000B, … những mã lỗi này không phục vụ cho người dùng hiểu, nhưng người dùng có thể dùng nó để báo cáo, và lập trình viên có thể dùng nó để sửa lỗi.
3.3.2 Có thể Try không có Catch không?
- Có thể, nhưng ta cần có một khối finally để giải phóng tài nguyên.
- Ví dụ, ta có thể sử dụng try-finally để giải phóng tài nguyên, mà không cần catch Exception.
![[Java Core] B7: Exception trong Java 20 image 11 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-11-1024x841.png)
4. Cây phân cấp Exception
- Trong Java, Exception được phân cấp theo một cấu trúc cây, với
Throwablelà gốc của cây,ErrorvàExceptionlà 2 nhánh con củaThrowable.
![[Java Core] B7: Exception trong Java 21 image 12 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-12.png)
- Interface Iterable nhằm ám chỉ những class bên dưới kế thừa có tính “có thể ném ra được”
- Lí do tại sao cần 1 cây Exception sẽ được giải thích bên dưới, mục câu hỏi tại sao không catch mọi exception
4.1 Throw, tung ra ngoại lệ
- Đến hiện tại, ta đã biết các Exception có sẵn trong Java, và cách bắt nó bằng cấu trúc try-catch.
- Ta nhận thấy, các Exception đều triển khai từ
Throwable, và có thể tung ra (throw) một Exception bằng cách sử dụng từ khóathrow.
Ví dụ: Ta cần nhập vào một số là tuổi của người dùng, ta sử dụng nextInt của Scanner để nhập vào, nhưng nếu người dùng nhập vào một chuỗi không phải là số, ta sẽ tung ra một Exception InputMismatchException (Ngoại lệ nhập không đúng).
![[Java Core] B7: Exception trong Java 22 image 13 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-13-1024x647.png)
![[Java Core] B7: Exception trong Java 23 image 15 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-15.png)
- Tuy nhiên, người dùng vẫn có thể nhập vào
1 số âm, lúc này ta có thể thêm các điều kiện của riêng mình và throw ra Exception nếu muốn
![[Java Core] B7: Exception trong Java 24 image 16 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-16-1024x570.png)
4.2 Throws
throwslà một từ khóa, dùng để khai báo một phương thức có thể ném ra một ngoại lệ.- Ví dụ: Ta chia 1 hàm riêng để nhập vào thông tin nhân viên, nếu nhập sai ta sẽ trả ra 1 số Exception như
InputMismatchException,NumberFormatException, …. Tuy nhiên ta muốn nơi gọi đến hàm này tự xử lý ngoại lệ, ta có thể sử dụngthrowsđể khai báo phương thức có thể ném ra ngoại lệ.
![[Java Core] B7: Exception trong Java 25 image 17 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-17-1024x725.png)
- Như code trên, ở hàm
inputInfota sử dụngthrowsđể khai báo phương thức có thể ném ra ngoại lệ. Lúc này ở nơi gọi đến hàminputInfosẽ bị yêu cầu xử lý ngoại lệInputMismatchExceptionmà ta đã khai báo.
![[Java Core] B7: Exception trong Java 26 image 19 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-19.png)
- Như ảnh trên, ta thấy ở bên phải là luồng gọi hàm, và bên trái là luồng Exception được quay ngược lên trên để tìm nơi xử lý nó.
4.3 Tạo ra Exception của riêng mình
- Đôi khi, ta cần tạo ra Exception của riêng mình, để phục vụ cho mục đích của riêng mình.
- Tên
Throwablecó nghĩa là “có thể ném ra”, nghĩa là các Exception bên dưới của chúng ta có thể sử dụng các từ khoáthrows, throwđể ném ra. - Để tạo ra Exception của riêng mình, ta cần tạo ra một class kế thừa từ
ExceptionhoặcRuntimeException. Để tạo 1Checked Exception, ta kế thừa từException, còn để tạo 1Unchecked Exception, ta kế thừa từRuntimeException. - Ví dụ, ta cần tạo ra 1 Exception
AgeException(Ngoại lệ tuổi), nếu tuổi nhập vào nhỏ hơn 0, ta sẽ ném ra Exception này.
![[Java Core] B7: Exception trong Java 27 image 20 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-20-1024x564.png)
- Ví dụ, ta sẽ sử dụng
AgeExceptionđể ném ra Exception khi tuổi nhập vào nhỏ hơn 0.
![[Java Core] B7: Exception trong Java 28 image 21 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/02/image-21-1024x796.png)
- Như code trên, ta sử dụng
AgeExceptionđể ném ra Exception khi tuổi nhập vào nhỏ hơn 0.
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 30 image 60 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-60.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 31 image 62 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-62.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 32 image 63 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-63.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 33 image 64 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-64-719x1024.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 34 image 65 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-65.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 35 image 66 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-66-1024x869.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 36 image 67 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-67-1024x883.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 37 image 68 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-68-1024x757.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 38 image 69 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-69-1024x594.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 39 image 70 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-70-1024x1006.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 40 image 71 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-71-964x1024.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 41 image 72 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-72-1024x976.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 42 image 73 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-73-1024x320.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 43 image 74 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-74-954x1024.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 44 image 75 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-75-1024x474.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 45 image 76 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-76-1024x941.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 46 image 77 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-77-1024x338.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 47 image 78 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-78-1024x958.png)
![[Java Core] B6: Design Pattern Iterator. Iterable và Collection trong Java 48 image 79 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-79-1024x658.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 50 image 48 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-48-1024x569.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 51 image 50 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-50-780x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 52 image 51 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-51-1024x900.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 53 image 52 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-52-663x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 54 image 53 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-53-934x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 55 image 55 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-55-826x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 56 image 56 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-56-537x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 57 image 47 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-47.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 59 image 46 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-46.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 60 image 57 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-57-966x1024.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 61 image 58 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-58-1024x876.png)
![[Java Core] B5: Tính chất trừu tượng, Interface và Abstract Class trong Java 62 image 59 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-59-1016x1024.png)


















![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 85 1*B2f9ycR5sN6thAhCe0vfiA - quochung.cyou PTIT](https://miro.medium.com/v2/resize:fit:700/1*B2f9ycR5sN6thAhCe0vfiA.gif)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 86 1*1Hyocpa6Xpy mXqYeb zqw - quochung.cyou PTIT](https://miro.medium.com/v2/resize:fit:700/1*1Hyocpa6Xpy-mXqYeb-zqw.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 87 1 PRLCk7qPIL PHT mNXw2cQ - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/1_PRLCk7qPIL_PHT_mNXw2cQ.gif)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 88 image 3 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-3-1024x456.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 89 image 1 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-1.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 90 image 2 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-2.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 91 image 4 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-4.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 92 1 lRxsDk6eaUy9O4 RaVuJ1g - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/1_lRxsDk6eaUy9O4-RaVuJ1g.gif)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 93 image 6 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-6.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 94 image 8 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-8.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 95 image 9 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-9.png)
![[Phần 2] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 97 image 11 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2024/01/image-11-1024x479.png)
![[Phần 1] Session Token và JWT Token, Refresh Token, khi nào quyết định sử dụng, ưu và nhược điểm 99 image 14 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/12/image-14.png)
![[Phần 1] Session Token và JWT Token, Refresh Token, khi nào quyết định sử dụng, ưu và nhược điểm 100 image 15 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/12/image-15.png)
![[Phần 1] Session Token và JWT Token, Refresh Token, khi nào quyết định sử dụng, ưu và nhược điểm 102 image 18 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/12/image-18.png)








![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 114 image 31 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-31-1024x538.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 115 image 32 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-32-1024x760.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 116 image 33 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-33-1024x757.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 117 image 34 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-34-1024x756.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 118 image 35 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-35-1024x759.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 119 image 36 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-36-1024x756.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 120 image 37 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-37-1024x757.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 121 image 38 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-38.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 122 image 39 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-39.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 123 image 40 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-40-1024x486.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 124 image 41 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-41-1024x305.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 125 image 42 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-42.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 126 image 43 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-43-1024x362.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 127 image 44 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-44-1024x642.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 128 image 45 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-45-1024x350.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 129 image 46 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-46.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 130 image 50 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-50.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 131 image 51 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-51.png)
![[Java Memory 2] Cách Garbage Collector Java giải phóng bộ nhớ (Stop The World, Reference Counting, Sweep, ..) 132 image 52 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-52.png)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 134 Encapsulation](https://scaler.com/topics/images/member-functions-in-encapsulation.webp)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 135 image 26 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-26.png)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 136 image 28 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-28-1024x901.png)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 138 image 27 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-27.png)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 139 image 29 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-29-752x1024.png)
![[Java Core] B4: Tính chất đóng gói, kế thừa và đa hình trong Java 142 image 30 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-30-1024x736.png)