Câu hỏi về Exception Handling trong Java
50 Câu Hỏi Cơ Bản và Trả Lời
Ngoại lệ (Exception) là gì trong Java?
- Ngoại lệ là các tình huống lỗi hoặc bất thường xảy ra trong quá trình thực thi chương trình.
Phân biệt giữa Error và Exception?
- Error là lỗi nghiêm trọng không thể phục hồi, Exception là lỗi có thể xử lý được trong mã nguồn.
Checked Exception là gì?
- Checked Exception là các ngoại lệ phải được xử lý hoặc khai báo trong mã nguồn.
Unchecked Exception là gì?
- Unchecked Exception là các ngoại lệ không bắt buộc phải xử lý hoặc khai báo trong mã nguồn.
Ví dụ của Checked Exception?
- IOException, SQLException.
Ví dụ của Unchecked Exception?
- NullPointerException, ArithmeticException.
Cấu trúc try-catch-finally trong Java là gì?
trygiám sát mã có thể gây ra ngoại lệ,catchxử lý ngoại lệ,finallyluôn được thực thi.
Lợi ích của khối finally?
- Đảm bảo tài nguyên được giải phóng đúng cách, bất kể ngoại lệ có xảy ra hay không.
Cách sử dụng từ khóa throw?
throw new ExceptionType("message");
Khi nào nên sử dụng ngoại lệ tùy chỉnh?
- Khi cần thông báo lỗi cụ thể và rõ ràng hơn.
Ví dụ về ngoại lệ tùy chỉnh?
public class InvalidAgeException extends Exception { ... }
Multi-Catch block là gì?
- Cho phép bắt nhiều loại ngoại lệ trong một khối catch duy nhất, ngăn cách bằng dấu
|.
- Cho phép bắt nhiều loại ngoại lệ trong một khối catch duy nhất, ngăn cách bằng dấu
Lợi ích của Multi-Catch block?
- Giảm sự trùng lặp mã và làm cho mã nguồn gọn gàng hơn.
Cách truyền ngoại lệ qua các phương thức?
- Sử dụng từ khóa
throwstrong khai báo phương thức.
- Sử dụng từ khóa
Stack trace là gì?
- Danh sách các phương thức đã được gọi dẫn đến việc ném ngoại lệ.
Cách đọc stack trace?
- Xem thông tin về tên phương thức, lớp, và số dòng mã nguồn nơi xảy ra ngoại lệ.
Lợi ích của ghi log ngoại lệ?
- Theo dõi và debug các vấn đề xảy ra trong ứng dụng.
Ghi log ngoại lệ bằng cách nào?
- Sử dụng
LoggerhoặcSystem.err.println.
- Sử dụng
Không nên bắt ngoại lệ chung chung vì sao?
- Che giấu các lỗi cụ thể và làm cho mã nguồn khó bảo trì.
Khi nào cần tái ném ngoại lệ?
- Khi cần thêm thông tin bổ sung và bảo tồn ngữ cảnh gốc của ngoại lệ.
Ví dụ về tái ném ngoại lệ?
throw new ArithmeticException("Exception in methodA: " + e.getMessage());
Cấu trúc try-with-resources là gì?
- Tự động đóng các tài nguyên khi kết thúc khối try.
Lợi ích của try-with-resources?
- Giảm nguy cơ rò rỉ tài nguyên và làm cho mã nguồn gọn gàng hơn.
Khi nào nên sử dụng finally?
- Để giải phóng tài nguyên, ví dụ như đóng file hoặc kết nối cơ sở dữ liệu.
Exception propagation là gì?
- Quá trình mà ngoại lệ di chuyển ngược lại qua các stack frame.
Lợi ích của việc bắt ngoại lệ cụ thể?
- Giúp mã nguồn rõ ràng và dễ bảo trì hơn.
Cách sử dụng từ khóa throws?
- Khai báo rằng một phương thức có thể ném ra một ngoại lệ cụ thể.
Ví dụ về sử dụng throws?
public void method() throws IOException { ... }
Ghi log ngoại lệ trong lập trình đồng thời như thế nào?
- Sử dụng
LoggerhoặcSystem.err.printlnbên trong luồng.
- Sử dụng
ExecutorService là gì?
- Một API để quản lý các luồng trong Java.
Cách bắt ngoại lệ trong ExecutorService?
- Bắt và xử lý bên trong luồng hoặc sử dụng
Futuređể bắt ngoại lệ.
- Bắt và xử lý bên trong luồng hoặc sử dụng
CompletableFuture là gì?
- Một API để xử lý lập trình bất đồng bộ trong Java.
Cách xử lý ngoại lệ với CompletableFuture?
- Sử dụng
exceptionally,handle, hoặcwhenComplete.
- Sử dụng
UncaughtExceptionHandler là gì?
- Cơ chế để xử lý các ngoại lệ chưa được bắt trong một luồng.
Cách thiết lập UncaughtExceptionHandler cho một luồng?
thread.setUncaughtExceptionHandler((t, e) -> { ... });
Tại sao không nên sử dụng ngoại lệ cho logic bình thường?
- Sử dụng ngoại lệ không hợp lý có thể làm giảm hiệu suất.
Thông báo lỗi hữu ích nên như thế nào?
- Cụ thể và cung cấp thông tin chi tiết về lỗi.
Ví dụ về thông báo lỗi hữu ích?
throw new InvalidAgeException("Age must be at least 18", age);
Làm thế nào để đảm bảo tài nguyên được giải phóng?
- Sử dụng khối
finallyhoặc cấu trúctry-with-resources.
- Sử dụng khối
Khi nào nên sử dụng ngoại lệ tùy chỉnh?
- Khi cần cung cấp các thông báo lỗi cụ thể và rõ ràng hơn.
Cách tạo ngoại lệ tùy chỉnh?
- Kế thừa từ
ExceptionhoặcRuntimeException.
- Kế thừa từ
Lợi ích của multi-catch block?
- Giảm sự trùng lặp mã và làm cho mã nguồn gọn gàng hơn.
Exception propagation ảnh hưởng như thế nào đến chương trình?
- Ngoại lệ di chuyển ngược lại qua các stack frame cho đến khi được bắt.
Cách tối ưu hóa xử lý ngoại lệ trong lập trình đồng thời?
- Sử dụng các phương thức như
exceptionally,handle, và thiết lậpUncaughtExceptionHandler.
- Sử dụng các phương thức như
Khi nào nên sử dụng
try-catchthay vìthrows?- Khi bạn muốn xử lý ngoại lệ ngay trong phương thức đó.
Ghi log ngoại lệ giúp ích gì?
- Theo dõi và xử lý các vấn đề xảy ra trong ứng dụng.
Ví dụ về ngoại lệ phổ biến trong Java?
NullPointerException,ArithmeticException.
Cách sử dụng
finallyđể giải phóng tài nguyên?- Đặt mã giải phóng tài nguyên trong khối
finally.
- Đặt mã giải phóng tài nguyên trong khối
Lợi ích của
try-with-resources?- Tự động đóng các tài nguyên khi kết thúc khối
try.
- Tự động đóng các tài nguyên khi kết thúc khối
Sử dụng ngoại lệ tùy chỉnh để làm gì?
- Để cung cấp thông báo lỗi cụ thể và rõ ràng hơn trong ngữ cảnh của ứng dụng.
50 Câu Hỏi Nâng Cao và Trả Lời
Làm thế nào để tạo một ngoại lệ tùy chỉnh kế thừa từ RuntimeException?
- Kế thừa từ
RuntimeExceptionvà định nghĩa các constructors cần thiết.
- Kế thừa từ
Tại sao việc ghi log ngoại lệ trong các hệ thống phân tán lại quan trọng?
- Để theo dõi và debug các vấn đề xảy ra trên các thành phần khác nhau của hệ thống.
Điều gì xảy ra khi ngoại lệ không được bắt trong luồng?
- Luồng sẽ kết thúc và ngoại lệ có thể được xử lý bởi
UncaughtExceptionHandler.
- Luồng sẽ kết thúc và ngoại lệ có thể được xử lý bởi
Khi nào nên sử dụng
CompletableFuture.supplyAsync?- Khi cần thực thi một tác vụ bất đồng bộ và trả về kết quả.
Cách xử lý ngoại lệ trong các phương thức bất đồng bộ của
CompletableFuture?- Sử dụng các phương thức như
exceptionally,handle, hoặcwhenComplete.
- Sử dụng các phương thức như
Phương thức
handlecủaCompletableFuturecó ưu điểm gì so vớiexceptionally?handlexử lý cả kết quả bình thường và ngoại lệ, trong khiexceptionallychỉ xử lý ngoại lệ.
Khi nào cần sử dụng
ThreadPoolExecutorthay vìExecutors?- Khi cần tùy chỉnh hành vi của pool như số lượng luồng, chiến lược từ chối, hoặc thời gian tồn tại của luồng.
Làm thế nào để tái sử dụng các khối
catchtrong nhiều phương thức?- Sử dụng một phương thức xử lý ngoại lệ chung và gọi phương thức đó trong các khối
catch.
- Sử dụng một phương thức xử lý ngoại lệ chung và gọi phương thức đó trong các khối
Cách truyền thông tin bổ sung qua ngoại lệ tùy chỉnh?
- Thêm các thuộc tính và phương thức getter trong ngoại lệ tùy chỉnh.
Sự khác biệt giữa
throwvàthrowslà gì?throwđược sử dụng để ném ngoại lệ,throwsđược sử dụng để khai báo ngoại lệ mà phương thức có thể ném.
Làm thế nào để kiểm tra nếu một ngoại lệ có nguyên nhân gốc (cause)?
- Sử dụng phương thức
getCause()củaThrowable.
- Sử dụng phương thức
Cách ném ngoại lệ từ khối
finally?- Bất kỳ ngoại lệ nào ném từ
finallysẽ ghi đè ngoại lệ ném từ khốitryhoặccatch.
- Bất kỳ ngoại lệ nào ném từ
Lợi ích của việc sử dụng các API logging như SLF4J hoặc Log4J?
- Cung cấp các tính năng mạnh mẽ và linh hoạt hơn cho việc ghi log so với
System.err.println.
- Cung cấp các tính năng mạnh mẽ và linh hoạt hơn cho việc ghi log so với
Làm thế nào để định dạng stack trace trước khi ghi log?
- Sử dụng
StringWritervàPrintWriterđể chuyển stack trace thành chuỗi và ghi log chuỗi đó.
- Sử dụng
Lợi ích của việc bắt và xử lý ngoại lệ tại các điểm chung trong ứng dụng?
- Giảm sự trùng lặp mã và dễ bảo trì hơn.
Cách xử lý ngoại lệ trong ứng dụng Java EE hoặc Spring?
- Sử dụng các cơ chế xử lý ngoại lệ toàn cục như
@ControllerAdvicetrong Spring.
- Sử dụng các cơ chế xử lý ngoại lệ toàn cục như
Khi nào nên sử dụng
try-finallythay vìtry-catch-finally?- Khi bạn không cần xử lý ngoại lệ cụ thể mà chỉ cần giải phóng tài nguyên.
Cách sử dụng các annotations để đánh dấu các phương thức có thể ném ngoại lệ?
- Sử dụng các annotations như
@Throws(trong Kotlin).
- Sử dụng các annotations như
Làm thế nào để kiểm tra nếu một ngoại lệ là một ngoại lệ tùy chỉnh?
- Sử dụng từ khóa
instanceofđể kiểm tra kiểu của ngoại lệ.
- Sử dụng từ khóa
Sự khác biệt giữa
InterruptedExceptionvàExecutionExceptionlà gì?InterruptedExceptionxảy ra khi một luồng bị gián đoạn,ExecutionExceptionbao bọc ngoại lệ xảy ra trong tác vụ bất đồng bộ.
Cách sử dụng
assertđể kiểm tra lỗi logic mà không cần ném ngoại lệ?- Sử dụng câu lệnh
assert condition : message;.
- Sử dụng câu lệnh
Tại sao việc sử dụng
catch (Exception e)có thể là một thực hành tồi?- Vì nó bắt tất cả các ngoại lệ, bao gồm cả những ngoại lệ không mong muốn, làm cho mã nguồn khó debug hơn.
Làm thế nào để thiết lập một chiến lược từ chối cho
ThreadPoolExecutor?- Sử dụng
RejectedExecutionHandlervà thiết lập nó choThreadPoolExecutor.
- Sử dụng
Lợi ích của việc sử dụng ngoại lệ tùy chỉnh trong API công khai?
- Giúp người dùng API dễ dàng hiểu và xử lý các lỗi cụ thể.
Cách xử lý ngoại lệ trong các tác vụ lập lịch (scheduled tasks)?
- Sử dụng các cơ chế xử lý ngoại lệ tương tự như trong các tác vụ đồng bộ và bất đồng bộ, và ghi log ngoại lệ.
Làm thế nào để bắt ngoại lệ trong một biểu thức lambda?
- Sử dụng một phương thức bao bọc để ném ngoại lệ từ biểu thức lambda.
Cách tạo một ngoại lệ chuỗi (chained exception)?
- Sử dụng constructors của ngoại lệ để chỉ định nguyên nhân gốc (
cause).
- Sử dụng constructors của ngoại lệ để chỉ định nguyên nhân gốc (
Sự khác biệt giữa
ThrowablevàExceptionlà gì?Throwablelà lớp gốc của tất cả các đối tượng có thể được ném ra trong Java,Exceptionlà một lớp con củaThrowable.
Làm thế nào để chuyển đổi giữa các loại ngoại lệ?
- Bắt ngoại lệ cũ và ném ngoại lệ mới, có thể bao gồm ngoại lệ cũ như là nguyên nhân gốc.
Tại sao việc không xử lý ngoại lệ trong lập trình đồng thời lại nguy hiểm?
- Ngoại lệ không được xử lý có thể làm gián đoạn luồng hoặc gây ra các vấn đề khác khó phát hiện.
Cách sử dụng
@ExceptionHandlertrong Spring để xử lý ngoại lệ?- Định nghĩa một phương thức với
@ExceptionHandlertrong một lớp@ControllerAdvice.
- Định nghĩa một phương thức với
Làm thế nào để ghi lại stack trace đầy đủ của ngoại lệ?
- Sử dụng
Throwable.printStackTrace()hoặc ghi logThrowablevới logger.
- Sử dụng
Cách sử dụng các ngoại lệ chuẩn trong các phương thức API công khai?
- Sử dụng các ngoại lệ chuẩn như
IllegalArgumentExceptionhoặcNullPointerExceptionđể thông báo về các lỗi thường gặp.
- Sử dụng các ngoại lệ chuẩn như
Làm thế nào để xác định nếu một ngoại lệ có thể bỏ qua được?
- Xác định dựa trên ngữ cảnh ứng dụng và logic kinh doanh.
Lợi ích của việc sử dụng
Thread.setDefaultUncaughtExceptionHandler?- Thiết lập một trình xử lý ngoại lệ mặc định cho tất cả các luồng trong ứng dụng.
Cách xử lý ngoại lệ trong các phương thức thư viện tiêu chuẩn?
- Bắt ngoại lệ và chuyển đổi chúng thành các ngoại lệ tùy chỉnh hoặc ghi log chúng.
Tại sao cần phải truyền tải ngoại lệ lên tầng cao hơn?
- Để cho phép các tầng cao hơn có đủ ngữ cảnh để xử lý hoặc ghi log ngoại lệ đúng cách.
Làm thế nào để kiểm tra hiệu suất của mã nguồn có sử dụng ngoại lệ?
- Sử dụng các công cụ phân tích hiệu suất hoặc viết các bài test hiệu suất.
Cách bắt và xử lý ngoại lệ trong các ứng dụng web Java?
- Sử dụng các cơ chế xử lý ngoại lệ của khung công tác web, như
@ExceptionHandlertrong Spring MVC.
- Sử dụng các cơ chế xử lý ngoại lệ của khung công tác web, như
Làm thế nào để xác định nếu một ngoại lệ cần được ghi log ở mức độ cảnh báo (warning)?
- Dựa trên mức độ nghiêm trọng của ngoại lệ và ngữ cảnh ứng dụng.
Sự khác biệt giữa
RuntimeExceptionvàExceptionlà gì?RuntimeExceptionlà một loạiUnchecked Exception, trong khiExceptionlàChecked Exception.
Làm thế nào để kiểm tra nếu một ngoại lệ đã được xử lý đúng cách?
- Viết các bài test đơn vị kiểm tra xử lý ngoại lệ.
Cách xử lý ngoại lệ trong các ứng dụng đa nền tảng?
- Sử dụng các cơ chế xử lý ngoại lệ chuẩn của ngôn ngữ và khung công tác.
Lợi ích của việc sử dụng các khối
catchnhiều lớp?- Cho phép xử lý riêng biệt cho từng loại ngoại lệ.
Làm thế nào để xử lý ngoại lệ trong các phương thức khởi tạo (constructor)?
- Bắt và chuyển đổi ngoại lệ thành các ngoại lệ hợp lý hoặc ghi log.
Cách sử dụng
ThreadLocalđể xử lý ngoại lệ trong các luồng?- Lưu trữ thông tin ngoại
lệ trong ThreadLocal để truy cập từ các luồng khác.
Làm thế nào để kiểm tra và xử lý các ngoại lệ thời gian chạy (runtime exceptions)?
- Sử dụng các bài test đơn vị và bắt ngoại lệ trong mã nguồn.
Sự khác biệt giữa
IOExceptionvàSQLExceptionlà gì?IOExceptionliên quan đến lỗi I/O,SQLExceptionliên quan đến lỗi cơ sở dữ liệu.
Làm thế nào để tối ưu hóa mã nguồn khi bắt ngoại lệ?
- Bắt các ngoại lệ cụ thể và tránh sử dụng ngoại lệ cho logic bình thường.
Cách sử dụng
ThreadFactoryđể xử lý ngoại lệ trong các luồng mới tạo? - Sử dụngThreadFactoryđể tạo các luồng mới vớiUncaughtExceptionHandlerđược thiết lập.