Testing and Debugging
Result Status
A small result object can carry both a success flag and a value.
status object
A status object lets a method return success information without throwing for expected failures.
checked result
The caller checks the status before trusting the computed value.
Result Status
ResultStatus.java
Replay: real traced execution (multi-file project)
public class ResultStatus {
record DivideResult(boolean ok, int value) {}
static DivideResult divide(int numerator, int denominator) {
if (denominator == 0) {
return new DivideResult(false, 0);
}
return new DivideResult(true, numerator / denominator);
}
public static void main(String[] args) {
int denominator = 4;
DivideResult result = divide(80, denominator);
System.out.println("ok=" + result.ok() + " value=" + result.value());
}
}
public class ResultStatus {
record DivideResult(boolean ok, int value) {}
static DivideResult divide(int numerator, int denominator) {
if (denominator == 0) {
return new DivideResult(false, 0);
}
return new DivideResult(true, numerator / denominator);
}
public static void main(String[] args) {
int denominator = 0;
DivideResult result = divide(80, denominator);
System.out.println("ok=" + result.ok() + " value=" + result.value());
}
}
public class ResultStatus {
record DivideResult(boolean ok, int value) {}
static DivideResult divide(int numerator, int denominator) {
if (denominator == 0) {
return new DivideResult(false, 0);
}
return new DivideResult(true, numerator / denominator);
}
public static void main(String[] args) {
int denominator = 10;
DivideResult result = divide(80, denominator);
System.out.println("ok=" + result.ok() + " value=" + result.value());
}
}
denominator ← 4
11public static void main(String[] args) {12 int denominator→ 4 = 4; //@denominator=0, 1013 DivideResult result = divide(80, denominator4);static DivideResult divide(int numerator, int denominator)
4static DivideResult divide(int numerator80, int denominator4) {5 if (denominator == 0) {6 return new DivideResult(false, 0);7 }8 return new DivideResult(true, numerator / denominator);9}result ← DivideResult[ok=true, value=20]
12 int denominator = 4; //@denominator=0, 1013 DivideResult result→ DivideResult[ok=true, value=20] = divide(80, denominator4);1415 System.out.println("ok=" + result.ok() + " value=" + result.value());16}outputok=true value=20
denominator ← 0
11public static void main(String[] args) {12 int denominator→ 0 = 0;13 DivideResult result = divide(80, denominator0);static DivideResult divide(int numerator, int denominator)
4static DivideResult divide(int numerator80, int denominator0) {5 if (denominator == 0) {if (denominator == 0)
4static DivideResult divide(int numerator, int denominator) {5 if (denominator0 == 0) {6 return new DivideResult(false, 0);7 }result ← DivideResult[ok=false, value=0]
12 int denominator = 0;13 DivideResult result→ DivideResult[ok=false, value=0] = divide(80, denominator0);1415 System.out.println("ok=" + result.ok() + " value=" + result.value());16}outputok=false value=0
denominator ← 10
11public static void main(String[] args) {12 int denominator→ 10 = 10;13 DivideResult result = divide(80, denominator10);static DivideResult divide(int numerator, int denominator)
4static DivideResult divide(int numerator80, int denominator10) {5 if (denominator == 0) {6 return new DivideResult(false, 0);7 }8 return new DivideResult(true, numerator / denominator);9}result ← DivideResult[ok=true, value=8]
12 int denominator = 10;13 DivideResult result→ DivideResult[ok=true, value=8] = divide(80, denominator10);1415 System.out.println("ok=" + result.ok() + " value=" + result.value());16}outputok=true value=8