Skip to main content

Command Palette

Search for a command to run...

Câu hỏi về Exception Handling trong Java

Published
12 min readView as Markdown

50 Câu Hỏi Cơ Bản và Trả Lời

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Ví dụ của Checked Exception?

    • IOException, SQLException.
  6. Ví dụ của Unchecked Exception?

    • NullPointerException, ArithmeticException.
  7. Cấu trúc try-catch-finally trong Java là gì?

    • try giám sát mã có thể gây ra ngoại lệ, catch xử lý ngoại lệ, finally luôn được thực thi.
  8. 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.
  9. Cách sử dụng từ khóa throw?

    • throw new ExceptionType("message");
  10. 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.
  11. Ví dụ về ngoại lệ tùy chỉnh?

    • public class InvalidAgeException extends Exception { ... }
  12. 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 |.
  13. 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.
  14. Cách truyền ngoại lệ qua các phương thức?

    • Sử dụng từ khóa throws trong khai báo phương thức.
  15. 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ệ.
  16. 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ệ.
  17. 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.
  18. Ghi log ngoại lệ bằng cách nào?

    • Sử dụng Logger hoặc System.err.println.
  19. 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ì.
  20. 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ệ.
  21. Ví dụ về tái ném ngoại lệ?

    • throw new ArithmeticException("Exception in methodA: " + e.getMessage());
  22. 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.
  23. 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.
  24. 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.
  25. Exception propagation là gì?

    • Quá trình mà ngoại lệ di chuyển ngược lại qua các stack frame.
  26. 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.
  27. 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ể.
  28. Ví dụ về sử dụng throws?

    • public void method() throws IOException { ... }
  29. Ghi log ngoại lệ trong lập trình đồng thời như thế nào?

    • Sử dụng Logger hoặc System.err.println bên trong luồng.
  30. ExecutorService là gì?

    • Một API để quản lý các luồng trong Java.
  31. 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ệ.
  32. CompletableFuture là gì?

    • Một API để xử lý lập trình bất đồng bộ trong Java.
  33. Cách xử lý ngoại lệ với CompletableFuture?

    • Sử dụng exceptionally, handle, hoặc whenComplete.
  34. UncaughtExceptionHandler là gì?

    • Cơ chế để xử lý các ngoại lệ chưa được bắt trong một luồng.
  35. Cách thiết lập UncaughtExceptionHandler cho một luồng?

    • thread.setUncaughtExceptionHandler((t, e) -> { ... });
  36. 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.
  37. 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.
  38. Ví dụ về thông báo lỗi hữu ích?

    • throw new InvalidAgeException("Age must be at least 18", age);
  39. Làm thế nào để đảm bảo tài nguyên được giải phóng?

    • Sử dụng khối finally hoặc cấu trúc try-with-resources.
  40. 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.
  41. Cách tạo ngoại lệ tùy chỉnh?

    • Kế thừa từ Exception hoặc RuntimeException.
  42. 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.
  43. 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.
  44. 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ập UncaughtExceptionHandler.
  45. Khi nào nên sử dụng try-catch thay vì throws?

    • Khi bạn muốn xử lý ngoại lệ ngay trong phương thức đó.
  46. 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.
  47. Ví dụ về ngoại lệ phổ biến trong Java?

    • NullPointerException, ArithmeticException.
  48. 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.
  49. 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.
  50. 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

  1. 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ừ RuntimeException và định nghĩa các constructors cần thiết.
  2. 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.
  3. Đ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.
  4. 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ả.
  5. 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ặc whenComplete.
  6. Phương thức handle của CompletableFuture có ưu điểm gì so với exceptionally?

    • handle xử lý cả kết quả bình thường và ngoại lệ, trong khi exceptionally chỉ xử lý ngoại lệ.
  7. Khi nào cần sử dụng ThreadPoolExecutor thay 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.
  8. Làm thế nào để tái sử dụng các khối catch trong 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.
  9. 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.
  10. Sự khác biệt giữa throwthrows là 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.
  11. 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ủa Throwable.
  12. Cách ném ngoại lệ từ khối finally?

    • Bất kỳ ngoại lệ nào ném từ finally sẽ ghi đè ngoại lệ ném từ khối try hoặc catch.
  13. 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.
  14. Làm thế nào để định dạng stack trace trước khi ghi log?

    • Sử dụng StringWriterPrintWriter để chuyển stack trace thành chuỗi và ghi log chuỗi đó.
  15. 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.
  16. 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ư @ControllerAdvice trong Spring.
  17. Khi nào nên sử dụng try-finally thay 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.
  18. 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).
  19. 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ệ.
  20. Sự khác biệt giữa InterruptedExceptionExecutionException là gì?

    • InterruptedException xảy ra khi một luồng bị gián đoạn, ExecutionException bao bọc ngoại lệ xảy ra trong tác vụ bất đồng bộ.
  21. 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;.
  22. 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.
  23. Làm thế nào để thiết lập một chiến lược từ chối cho ThreadPoolExecutor?

    • Sử dụng RejectedExecutionHandler và thiết lập nó cho ThreadPoolExecutor.
  24. 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ể.
  25. 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ệ.
  26. 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.
  27. 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).
  28. Sự khác biệt giữa ThrowableException là gì?

    • Throwable là lớp gốc của tất cả các đối tượng có thể được ném ra trong Java, Exception là một lớp con của Throwable.
  29. 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.
  30. 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.
  31. Cách sử dụng @ExceptionHandler trong Spring để xử lý ngoại lệ?

    • Định nghĩa một phương thức với @ExceptionHandler trong một lớp @ControllerAdvice.
  32. Làm thế nào để ghi lại stack trace đầy đủ của ngoại lệ?

    • Sử dụng Throwable.printStackTrace() hoặc ghi log Throwable với logger.
  33. 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ư IllegalArgumentException hoặc NullPointerException để thông báo về các lỗi thường gặp.
  34. 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.
  35. 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.
  36. 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.
  37. 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.
  38. 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.
  39. 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ư @ExceptionHandler trong Spring MVC.
  40. 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.
  41. Sự khác biệt giữa RuntimeExceptionException là gì?

    • RuntimeException là một loại Unchecked Exception, trong khi ExceptionChecked Exception.
  42. 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ệ.
  43. 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.
  44. Lợi ích của việc sử dụng các khối catch nhiều lớp?

    • Cho phép xử lý riêng biệt cho từng loại ngoại lệ.
  45. 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.
  46. 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.

  1. 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.
  2. Sự khác biệt giữa IOExceptionSQLException là gì?

    • IOException liên quan đến lỗi I/O, SQLException liên quan đến lỗi cơ sở dữ liệu.
  3. 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.
  4. Cách sử dụng ThreadFactory để xử lý ngoại lệ trong các luồng mới tạo? - Sử dụng ThreadFactory để tạo các luồng mới với UncaughtExceptionHandler được thiết lập.

More from this blog

devngu

169 posts