làm thế nào để nhận biết được checked exception hay runtime exception???

Discussion in 'Xây dựng các ứng dụng Java khác, các vấn đề khác' started by jojo trần, 20/12/16.

  1. jojo trần

    jojo trần New Member

    Chào mọi người, em đang thắc mắc 1 vấn đề liên quan đến Exception trong Java. Cụ thể là như sau, theo tutorial về Exception của Java
    https://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
    thì em thấy có dòng định nghĩa như sau:

    "The third kind of exception is the runtime exception. These are exceptional conditions that are internal to the application, and that the application usually cannot anticipate or recover from. These usually indicate programming bugs, such as logic errors or improper use of an API. For example, consider the application described previously that passes a file name to the constructor for FileReader. If a logic error causes a null to be passed to the constructor, the constructor will throw NullPointerException. The application can catch this exception, but it probably makes more sense to eliminate the bug that caused the exception to occur."

    Em vẫn chưa rõ 2 vấn đề (được in đậm và gạch dưới ở trên) có nghĩa là sao? Đầu tiên, Runtime exception được định nghĩa như là "cannot recover from", lúc sau Runtime exception được giải thích là "can recover from" [nhưng tốt hơn là nên loại bỏ nó và không recover].

    Mặt khác, theo một số topic và tài liệu mà em tham khảo thì "recover from" hay "cannot recover from" (có thể gọi dưới tên khác là "recoverable" hay "un-recoverable") được hiểu như sau:

    1. "recoverable" ~ "un-recoverable" chỉ mang tính chất tương đối, nó tùy thuộc vào business logic của chương trình và hướng suy nghĩ của programmer.
    2. "recoverable" có nghĩa là đã có 1 solution hay scenario được định nghĩa trước (do programmer định nghĩa) để chương trình có thể chạy bình thường, trơn tru trong trường hợp có exception phát sinh (mục đích của cấu trúc catch trong try-catch là để recover). Ví dụ: khi đọc 1 file mà file đó không tồn tại thì nhắc nhở user nhập file khác hoặc tạo mới file đó và tiếp tục thao tác XYZ, tái định tuyến hoặc hủy gói tin nếu như server bị sập, nhập 1 string khác valid trong trường hợp string nhập bị sai format (NumberFormatException), đổi số 0 thành một số khác trong trường hợp tồn tại phép chia 0 (ArithmeticException),...
    3. "un-recoverable" có nghĩa là không có solution hay scenarion nào được định nghĩa trong trường hợp có exception phát sinh (mặc định chương trình sẽ bị abort ngay lúc đó).
    4. "recoverable" không có nghĩa là lúc nào chương trình cũng sẽ fix được lỗi/nguyên nhân gây ra exception đó (mặc dù trong vài tình huống, điều đó là có thể).
    5. Do đó, mọi exception (bao gồm Runtime exception và Checked exception) đều có thể recoverable được (tùy thuộc vào programmer hoặc business logic của chương trình). Chỉ có duy nhất Error là không thể bao giờ recoverable được.

    Ngoài ra, theo định nghĩa trong tutorial trên thì Runtime exception sẽ liên quan đến lỗi lập trình (như sai API, lỗi logic,....), còn Checked exception sẽ liên quan đến vấn đề ở ngoài như (lỗi file, lỗi CSDL,...). Cũng dựa theo định nghĩa này, em đang không hiểu và chưa phân biệt được một số điểm như sau:


    1. Nếu NumberFormatException là lỗi lập trình (~Runtime exception) thì tại sao ParseException lại không là lỗi lập trình (~CheckedException) trong khi 2 exception này đều là do dữ liệu đầu vào của API xử lý không đúng chuẩn. Ngoài ra, đối với trường hợp NumberFormatException thì nếu chương trình yêu cầu user nhập 1 string khác (giả sử là valid) hoặc tự động gán giá trị cho string đó khi bị lỗi thì có được gọi là
    "recover from" không?

    2. Nếu tạo mới 1 exception (ví dụ ABCException) thì làm sao để biết đó là Runtime exception hay Checked exception (giả sử programmer đã có solution/scenario trong trường hợp xảy ra Exception).

    Mong mọi người giải đáp giúp em!!!
  2. QuangTrung93

    QuangTrung93 New Member

    Nếu extends trực tiếp class "Exception" thì là Checked exception, còn nếu extends "RuntimeException" thì là RuntimeException
  3. jojo trần

    jojo trần New Member

    Có cách nào để nhận biết được ngoài cách extends không bạn @QuangTrung93? Chẳng hạn như dựa vào nguyên nhân gây lỗi: lỗi lập trình (~runtime exception) hay lỗi do yếu tố bên ngoài (~checked exception)..Lấy ví dụ ở trên (NumberFormatException và ParseException)...
  4. badboy3283

    badboy3283 Active Member

    Bản chất API Exception của JAVA là để hỗ trợ debug, một số công ty nổi tiếng bắt developer phải xử lý throw exception một cách rõ ràng, dễ nhận thấy trong 1 số Framework nổi tiếng.

    Cho nên vấn đề là cách debug khi có lỗi.

    Điểm khác nhau giữa RuntimeException và Exception:

    Code:
    public void test(){
    throw new RuntimeException("")
    }
    
    public void test() throws Exception{
    throw new Exception("")
    }
  5. JackV

    JackV Administrator Staff Member

    Rắc rối vậy sao ta.
    • Runtime exception là exception chỉ xuất hiện lúc chạy, nó liên quan đến các vấn đề về đồng bộ và bộ nhớ này kia.
    • Checked exception là các exception tường minh, gần như chắc chắn nó có thể xảy ra khi xử lý không phù hợp hoặc thay đổi không phù hợp, trong lúc viết lập trình viên phải try catch nó không thì phải throws nó đi.
    • Unchecked exception là các exception không kiểm tra, nó ẩn hiểm ở đâu đó trong logic của code nhưng không nhất thiết phải xử lý try catch vì có khi xảy ra mà đúng logic thì không bao giờ xảy ra, ví dụ như chia cho zero.
    Đọc cái này cho dễ hiểu https://en.wikibooks.org/wiki/Java_Programming/Checked_Exceptions

Chia sẻ trang này