我尝试使用三元运算和 orElseThrow
抛出自定义异常,如下所示:
public static MainProviderType getMainProviderType(ProviderType providerType) {
return Optional.ofNullable(MainProviderType.valueOf(providerType.name()))
.orElseThrow(() -> new ProviderTypeNotFoundException(providerType.name()));
}
但是,当 providerType
为 null 时,此方法返回 NullPointerException
而不是 ProviderTypeNotFoundException
。我认为问题与此有关;它无法评估 MainProviderType.valueOf(providerType.name())
,因为 providerType.name()
。真的吗?我应该如何使用它并解决问题?
最佳答案
public static MainProviderType getMainProviderType(ProviderType providerType) {
return Optional.ofNullable(providerType)
.map(ProviderType::name)
.map(MainProviderType::valueOf)
.orElseThrow(() -> new ProviderTypeNotFoundException("some message"));
}
更新带有测试用例的完整示例
private enum ProviderType {
ONE,
TWO
}
private enum MainProviderType {
ONE,
TWO,
THREE
}
public MainProviderType getMainProviderType(ProviderType providerType) {
return Optional.ofNullable(providerType)
.map(ProviderType::name)
.map(MainProviderType::valueOf)
.orElseThrow();
}
@Test
void selectMainProviderType() {
var mainProviderType = getMainProviderType(ProviderType.ONE);
assertEquals(MainProviderType.ONE, mainProviderType);
}
关于java - 无法在 Java 中使用 orElseThrow 抛出自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68767447/