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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
import org.checkerframework.checker.nullness.qual.*;
public class BoxingNullness {
void withinOperation() {
Integer i1 = 3;
int i1u = i1 + 2; // valid
Integer i2 = null;
// :: error: (unboxing.of.nullable)
int i2u = i2 + 2; // invalid
Integer i3 = i1;
i3.toString();
}
void withinAssignment() {
Integer i1 = 5;
int i1u = i1;
Integer i2 = null;
// :: error: (unboxing.of.nullable)
int i2u = i2; // invalid
}
void validWithinUnary() {
// within blocks to stop flow
Integer i1 = 1, i2 = 1, i3 = 1, i4 = 1;
++i1;
i2++;
}
void invalidWithinUnary() {
// within blocks to stop flow
Integer i1 = null, i2 = null, i3 = null, i4 = null;
// :: error: (unboxing.of.nullable)
++i1; // invalid
// :: error: (unboxing.of.nullable)
i2++; // invalid
}
void validCompoundAssignmentsAsVariable() {
@NonNull Integer i = 0; // nonnull is needed because flow is buggy
i += 1;
i -= 1;
@NonNull Boolean b = true;
b &= true;
}
void invalidCompoundAssignmentsAsVariable() {
Integer i = null;
// :: error: (unboxing.of.nullable)
i += 1; // invalid
Boolean b = null;
// :: error: (unboxing.of.nullable)
b &= true; // invalid
}
void invalidCompoundAssignmentAsValue() {
@NonNull Integer var = 3;
Integer val = null;
// :: error: (unboxing.of.nullable)
var += val;
Boolean b1 = null;
boolean b2 = true;
// :: error: (unboxing.of.nullable)
b2 &= b1; // invalid
}
void randomValidStringOperations() {
String s = null;
s += null;
}
void equalityTest() {
Integer bN = null;
Integer bN1 = null;
Integer bN2 = null;
Integer bN3 = null;
Integer bN4 = null;
Integer bN5 = null;
Integer bN6 = null;
Integer bN7 = null;
Integer b1 = 1;
int u1 = 1;
System.out.println(bN == bN1); // valid
System.out.println(bN2 == b1); // valid
System.out.println(bN3 != bN4); // valid
System.out.println(bN5 != b1); // valid
System.out.println(u1 == b1);
System.out.println(u1 != b1);
System.out.println(u1 == u1);
System.out.println(u1 != u1);
// :: error: (unboxing.of.nullable)
System.out.println(bN6 == u1); // invalid
// :: error: (unboxing.of.nullable)
System.out.println(bN7 != u1); // invalid
}
void addition() {
Integer bN = null;
Integer bN1 = null;
Integer bN2 = null;
Integer bN3 = null;
Integer b1 = 1;
int u1 = 1;
// :: error: (unboxing.of.nullable)
System.out.println(bN + bN1); // invalid
// :: error: (unboxing.of.nullable)
System.out.println(bN2 + b1); // invalid
System.out.println(u1 + b1);
System.out.println(u1 + u1);
// :: error: (unboxing.of.nullable)
System.out.println(bN3 + u1); // invalid
}
void visitCast() {
Integer bN = null;
Integer bN2 = null;
Integer b1 = 1;
int u1 = 1;
println(bN);
// :: error: (unboxing.of.nullable)
println((int) bN2); // invalid
println(b1);
println((int) b1);
println(u1);
println((int) u1);
}
void println(@Nullable Object o) {}
void testObjectString() {
Object o = null;
o += "m";
}
void testCharString() {
CharSequence cs = null;
cs += "m";
}
}
|