我正在尝试在 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/