Java 在某些场景中,异常流控制是否更好?

Java 在某些场景中,异常流控制是否更好?,java,enums,Java,Enums,有许多文章解释了为什么应该避免异常流控制,并将其视为反模式。然而,在下面的示例中使用异常流控制有意义吗 我有一个具有许多值的枚举类型,需要检查它是否包含给定的字符串 使用Enum.valueof的解决方案将抛出IllegalArgumentException,并可用于返回false。甚至ApacheCommonsLang3库也使用相同的方法。我们在所有后续调用中重用一次惰性初始化的enumConstantDirectory映射 return EnumUtils.isValidEnum(MyEnu

有许多文章解释了为什么应该避免异常流控制,并将其视为反模式。然而,在下面的示例中使用异常流控制有意义吗

我有一个具有许多值的枚举类型,需要检查它是否包含给定的字符串

使用Enum.valueof的解决方案将抛出IllegalArgumentException,并可用于返回false。甚至ApacheCommonsLang3库也使用相同的方法。我们在所有后续调用中重用一次惰性初始化的enumConstantDirectory映射

return EnumUtils.isValidEnum(MyEnum.class, myValue);
另一个解决方案是迭代

return Stream.of(MyEnum.values()).anyMatch(e -> e.name().equals(value));

编程总是要在“非正式标准”和有意义的偏离规则之间取得平衡

是的,Java是一种“三思而后行”(检查条件)的语言;不像Python那样,你“请求原谅”(而不是许可)

换句话说:大多数时候,一个Java程序员会发现,看到使用异常作为控制流的代码时会感到惊讶。但是:这并不意味着一个人永远不应该这样工作


我个人的两点意见是:我认为当异常情况表明您的程序中存在真正的异常情况时,您应该依赖异常。意思:当您正在检查的字符串应该表示枚举常量时。。。一个例外就可以了。但是,当在运行时字符串有一定的可能性(甚至可能是“有效”的原因)无效时,我宁愿使用一个方法
boolean isValid()
,而不抛出异常。

确实有很多这样的文章,但所有这些文章的问题都是异常是一种流控制形式。控制权从投掷点转移到捕捉点。这就是它们的目的,与其他形式的控制相比,它们的优势在于,它们将一段数据(例外)带到它们身边。编程决策应该基于逻辑,而不是毫无意义的教条。。。而不找出它无效的原因?例外情况会告诉你什么?