Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

assert(false) vs RuntimeException?

I'm reading the source of XWalkUIClientInternal and I ran into the following code:

    switch(type) {
        case JAVASCRIPT_ALERT:
            return onJsAlert(view, url, message, result);
        case JAVASCRIPT_CONFIRM:
            return onJsConfirm(view, url, message, result);
        case JAVASCRIPT_PROMPT:
            return onJsPrompt(view, url, message, defaultValue, result);
        case JAVASCRIPT_BEFOREUNLOAD:
            // Reuse onJsConfirm to show the dialog.
            return onJsConfirm(view, url, message, result);
        default:
            break;
    }
    assert(false);
    return false;

I've never really seen this technique nor really thought about it before, but I guess this essentially means "this is unreachable code and should not happen ever", and crash the app no matter what. Although technically you can do that with a Throwable, as long as it's not caught.

So my question is, which one is better and why, assert(false) or throwing a RuntimeException, or maybe an Error?

like image 899
EpicPandaForce Avatar asked Feb 12 '15 14:02

EpicPandaForce


Video Answer


1 Answers

The biggest difference between

assert false;

(The parenthesis are not needed, assert is not a function but a statement.) and

throw new RuntimeException();

is that the assertion can be disabled. Actually, it is disabled by default unless the JVM is started with the -ea (“enable assertions”) flag. If assertions are enabled, assert false will unconditionally throw an AssertionError which derives from Error. But since assertions can be disabled, there are two problems,

  • the error might go undetected and
  • control flow analysis requires a dummy return statement after the assert (which is mostly clutter).

Therefore, in the above case, I'd certainly go with an explicit (and more concise)

throw new AssertionError("invalid type " + type);

instead of an assert followed by a dummy return.

As mentioned in the comments, this is assuming that type is an internal parameter and an invalid value indicates a bug in the logic itself. If it is an input parameter, it should be validated according to the usual rules and an IllegalArgumentException be thrown if validation fails.

like image 169
5gon12eder Avatar answered Sep 19 '22 18:09

5gon12eder