1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
import org.checkerframework.checker.nullness.qual.*;
import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
public class AssertAfter {
protected @Nullable String value;
@EnsuresNonNull("value")
public boolean setRepNonNull() {
value = "";
return true;
}
public void plain() {
// :: error: (dereference.of.nullable)
value.toString();
}
public void testAfter() {
setRepNonNull();
value.toString();
}
public void testBefore() {
// :: error: (dereference.of.nullable)
value.toString();
setRepNonNull();
}
public void withCondition(@Nullable String t) {
if (t == null) {
setRepNonNull();
}
// :: error: (dereference.of.nullable)
value.toString();
}
public void inConditionInTrue() {
if (setRepNonNull()) {
value.toString();
} else {
// nothing to do
}
}
// skip-test: Come back when working on improved flow
public void asCondition() {
if (setRepNonNull()) {
} else {
value.toString(); // valid!
}
}
}
// Test that private fields can be mentioned in pre- and post-conditions.
class A {
private @Nullable String privateField = null;
@EnsuresNonNull("privateField")
public void m1() {
privateField = "hello";
}
@RequiresNonNull("privateField")
public void m2() {}
}
class B {
void f() {
A a = new A();
a.m1();
a.m2();
}
}
|