A small result object can carry both a success flag and a value.

Result Status

ResultStatus.java
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 = ;
        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 = ;
        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 = ;
        DivideResult result = divide(80, denominator);

        System.out.println("ok=" + result.ok() + " value=" + result.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.