Debugging in Java with preconditions

183 views Asked by At

Working with Chromium codebase I got used to macros like CHECK(condition);, DCHECK(contidtion) and NOTREACHED;. They introduce assertions (usually preconditions) to the code and allow to terminate program with some info in a log, an in debug build DCHECK and NOTREACHED would also stop debugger to investigate the case. First one is active only in release mode and latter two only in debug - when "unactive" they would be replaced by an empty macro and not cause any overhead.

Is there some library in Java that allows such thing? I know that I could create some static method/object and depending on configuration swap configuration but I cannot see the way to avoid creating overhead. Besides, I wouldn't want to reinvent the wheel.

2

There are 2 answers

3
aioobe On BEST ANSWER

You can use the assert keyword:

public void yourMethod(String arg) {
    assert arg != null : "arg may not be null";
    // ...
}

which is equivalent to

public void yourMethod(String arg) {
    if (arg == null) throw new AssertionError("arg may not be null");
    // ...
}

Asserts are disabled unless the -ea switch is given when starting the JVM and will have close to 0 overhead when disabled.

The equivalent to NOTREACHED would be assert false;

Related: What does the "assert" keyword do?

0
Gili On

I authored a library that helps writing preconditions, postconditions with an emphasis on readability. For example:

// Input
List<Integer> actual = Arrays.asList(2, 3, 4, 6);
List<Integer> expected = Arrays.asList(1, 3, 5);
requireThat(actual, "actual").containsAll(expected);

// Output
java.lang.IllegalArgumentException: actual must contain all elements in: [1, 3, 5]
Actual : [2, 4, 6]
Missing: [1, 5]