检查等效于IllegalArgumentException?

use*_*692 19 java exception-handling exception

我有一个方法,它将枚举作为参数,并返回一些依赖于该参数的信息.但是,该枚举包含一些不应处理的值,并应引发错误条件.目前该方法抛出IllegalArgumentException,但我希望这是一个检查异常,强制调用者捕获它(并正常返回,记录错误).有什么合适的东西,还是我应该创建自己的Exception子类?

我也对其他模式持开放态度.一个合理的反应是应该处理枚举的所有值,但事实并非如此.当一个新的值被添加到枚举时,我想确保这个方法做正确的事情 - 在这种情况下,警告一个人比使用一些默认的返回值更可取.

谢谢你的建议.

Jef*_*rey 5

您当然可以创建自己的检查异常(例如 UnhandledEnumType),或者您可以捕获并处理 IllegalArgumentException。只应处理枚举的某些值,这听起来有点可疑。枚举的目的之一是将值绑定到一组特定的值,我希望所有的值都能得到处理。如果您担心添加新值,则应该进行一个测试来测试所有值是否都得到正确处理(通过使用枚举的 value() 方法来确保它们都经过测试)。

  • 问题似乎主要是关于如何强制处理非法参数(无论它是否是枚举)。您不必捕获或声明_unchecked_异常,例如“IllegalArgumentException”。这个答案建议创建或重用现有的_checked_异常,编译器将强制执行。这是大多数人的处理方式。 (3认同)

Pét*_*rök 3

问题是:

  • 使用不合适的枚举参数调用方法时的情况有多“正常”?
  • 你能优雅地处理这些情况然后继续处理吗?

根据您的描述,这不是“正常”的(仅当添加新的枚举值并且方法未正确更新时才会发生 - 即引入错误时)。所以对我来说,这听起来更像是 RuntimeException 的情况(即未经检查)。如果他们确实愿意,此方法的调用者仍然可以捕获未经检查的异常,但他们不是被迫这样做。

OTOH 我会尝试通过移动您的方法在枚举内部返回的数据来消除您描述的情况。这样,每当添加新的枚举值时,相关数据就不会被忘记。

如果你有兴趣,你可能想看看这个教程