java - 从 Kotlin 调用 Java 编写的抛出异常的方法时,如何实现空安全?

标签 java exception kotlin

我正在尝试在 Java 产品中使用 Kotlin 重写一个类。 我们的 Java 产品具有这样编写的自定义异常:

public class AppError {
    public static void exit(int res_code) {
        throw new AppException(res_code);
    }
    ...
}

public class AppException extends RuntimeException {
    private int res_code = CommonResCode.ERROR;

    public AppException() { super(); }

    public AppException(int res_code) {
        super();
        this.res_code = res_code;
    }
}

所以在现有的代码中,有这样的代码:

int point = null;
point = someMap.get("foo")
if (point == null) {
    AppError.exit(THE_GIVEN_PARAMETER_IS_INVALID_CODE)
}

我想用 Kotlin 之类的东西重写这段代码

val point: Int = someMap.getOrElse("foo", { AppError.exit(...) })
// or
val point: Int = someMap["foo"] ?: AppError.exit(...)

但是由于 exit 方法被视为返回 Unit,Kotlin 表示该点既是 Int 又是 Unit > 并建议我将 point 定义为 Any。 我可以做什么来避免这种情况? (除了执行与 Java 代码相同的操作之外?)

编辑

由于代码在逻辑上总是抛出异常,我认为强制转换可能是简单的方法:

val point: Int = someMap.getOrElse("foo", { AppError.exit(...) }) as Int

这是正确的吗?或者我应该避免这样做?

最佳答案

嗯,该方法返回 void(Kotlin 中的 Unit)。或者更确切地说,该方法根本不会“正常”返回。它永远不会完成,因为它总是抛出异常。

据我所知,没有任何内置内容允许使用自定义异常。但是,您可以创建一个类似于 Java 的 Objects.requireNonNull 的新帮助器方法。或 Kotlin 的 !! ( sure operator ):

static <T> T requireOrThrow(final T value, final Supplier<Throwable> exceptionSupplier) {
    // be aware of boxing of primitive types
    if (value == null) throw exceptionSupplier.get();
    return value;
}

然后可以在您的 Java 中使用它......

int point = requireOrThrow(someMap.get("foo"), () -> new AppException(THE_GIVEN_PARAMETER_IS_INVALID_CODE));

...和 ​​Kotlin 代码,这应该简化两者

val point: Int = requireOrThrow(someMap["foo"], { AppException(THE_GIVEN_PARAMETER_IS_INVALID_CODE) });

关于java - 从 Kotlin 调用 Java 编写的抛出异常的方法时,如何实现空安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59233052/

相关文章:

java - 查找 ArrayList 的大小,其中列表名称作为字符串传递

java - 如何防止并行线程中的异常杀死应用程序?

kotlin - 如何在 Kotlin 中引用匿名内部类?

kotlin - 如何反序列化格式为 "yyyy-mm-dd hh:mm:ss"的日期?

ios - 如何将方法的返回类型编写为符合协议(protocol)+ swift的类

java - 删除单击 DatePicker 时的蓝色效果

java - 类型为通用类型参数的 JAXB 编码字段

java - 在 DynamicJasper 中合并多个单元格

c++ - 不扔是零成本的时候,noexcept 是不是没用?

java - eclipse中的堆栈跟踪问题