Please explain RuntimeException in Java and where it should be used

前端 未结 2 1020
没有蜡笔的小新
没有蜡笔的小新 2020-12-07 23:30

I am following this great discussion at SO, titled: The case against checked exceptions , but I am unable to follow where exactly RuntimeException should be used and how it

2条回答
  •  庸人自扰
    2020-12-08 00:12

    Quotes from Effective Java 2nd Edition, Item 58: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors

    The Java programming language provides three kinds of throwables: checked exceptions, runtime exceptions, and errors. There is some confusion among programmers as to when it is appropriate to use each kind of throwable. While the decision is not always clear-cut, there are some general rules that provide strong guidance.

    The cardinal rule in deciding whether to use checked exception or an unchecked one is this:

    • Use checked exceptions for conditions from which the caller can reasonably be expected to recover. By throwing a checked exception, you force the caller to handle the exception in a catch clause or to propagate it outward. Each checked exception that a method is declared to throw is therefore a potent indication to the API user that associated condition is a possible outcome of invoking the method.
    • Use runtime exceptions to indicate programming errors. The great majority of runtime exceptions indicate precondition violations. A precondition violation is simply a failure by the client of an API to adhere to the contract specified by the API specification.

    Here's an example:

    • When trying to read a file of arbitrary name, the file may not exists. It's not strictly a programming error when a file does not exist (e.g. perhaps it did before but was then accidentally deleted). Clients may want to recover from this. Thus, FileNotFoundException is a checked exception.
    • If you give a null string as a filename, then NullPointerException (or perhaps an IllegalArgumentException -- another contentious debate) should be thrown. Client of the API is supposed to provide a valid string value; null isn't. As far as the API is concerned, this is a programmer error, which was easily preventable. Both of these exceptions are runtime exceptions.

    Item 59: Avoid unnecessary use of checked exceptions also provides additional guidance:

    Checked exceptions are a wonderful feature of the Java programming language. Unlike return codes, they force the programmer to deal with exceptional conditions, greatly enhancing reliability. That said, overuse of checked exceptions can make an API far less pleasant to use. If a method throws one or more checked exceptions, the code that invokes the method must handle the exceptions in one or more catch blocks, or it must declare that it throws the exceptions and let them propagate outward. Either way, it places a nontrivial burden on the programmer.

    The burden is justified if:

    • the exceptional condition cannot be prevented by proper use of the API, and
    • the programmer using the API can take some useful action once confronted with the exception.

    Unless both of these conditions hold, an unchecked exception is more appropriate.

    So here's a short summary of the recommendation from Effective Java 2nd Edition:

    • Preventable exceptions that happen due to API user errors should be unchecked.
    • Exceptions that can't be handled reasonably should also be unchecked.
    • Otherwise, the exception should be checked.

    See also

    • Effective Java 2nd Edition
      • Item 58: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors
      • Item 59: Avoid unnecessary use of checked exceptions
      • Item 60: Favor the use of standard exceptions
      • Item 61: Throw exceptions appropriate to the abstraction
      • Item 62: Document all exceptions thrown by each method

    Technical definition

    An unchecked exception is defined as RuntimeException and its subclasses, and Error and its subclasses. They do not have to be declared in a method's throws clause.

    References

    • JLS 11.2 Compile-Time Checking of Exceptions

    Related questions

    • In Java, when should I create a checked exception, and when should it be a runtime exception?
    • When to choose checked and unchecked exceptions
    • The case against checked exceptions
    • IllegalArgumentException or NullPointerException for a null parameter?

提交回复
热议问题