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

denominator
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());
    }
}
  1. denominator ← 4

    11public static void main(String[] args) {12    int denominator→ 4 = 4;  //@denominator=0, 1013    DivideResult result = divide(80, denominator4);
  2. 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}
  3. 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
  1. denominator ← 0

    11public static void main(String[] args) {12    int denominator→ 0 = 0;13    DivideResult result = divide(80, denominator0);
  2. static DivideResult divide(int numerator, int denominator)

    4static DivideResult divide(int numerator80, int denominator0) {5    if (denominator == 0) {
  3. if (denominator == 0)

    4static DivideResult divide(int numerator, int denominator) {5    if (denominator0 == 0) {6        return new DivideResult(false, 0);7    }
  4. 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
  1. denominator ← 10

    11public static void main(String[] args) {12    int denominator→ 10 = 10;13    DivideResult result = divide(80, denominator10);
  2. 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}
  3. 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