总是有人告诉我,Java 异常处理非常昂贵。
我在问在程序开始时创建特定类型的异常实例而不创建新实例是否是一种好习惯,总是抛出相同的异常对象。
我只是想举个例子。常用代码:
if (!checkSomething(myObject))
throw new CustomException("your object is invalid");
选择:
static CustomException MYEXP = new CustomException("your object is invalid");
//somewhere else
if (!checkSomething(myObject))
throw MYEXP;
当然,我在这里做了一些假设:
MyCustomException
没有参数- 客户端代码,无论何时是一个好的实践,都很大程度上基于异常处理,重构不是一种选择。
所以问题是:
- 这是一个好习惯吗?
- 这会损坏一些 JVM 机制吗?
- 如果 1 是肯定的,是否有可能获得性能提升?(我认为不是,但不确定)
- 如果 1 和 3 是肯定的,为什么不作为实践赞助?
- 如果 1 不是,为什么 Martin Odersky 在他对 Scala 的介绍中说 Scala 在某些情况下是这样工作的?(在 28.30 分钟,他告诉执行 break 时抛出了异常,观众说这很耗时,他回答说不是每次都创建异常)Fosdem 2009
我希望这不是一个无聊/愚蠢的问题,我对此很好奇。我认为异常处理的真正成本是处理而不是创建。
编辑 添加了关于 FOSDEM 演示文稿的精确讨论的参考
免责声明:我的代码都没有像提议的那样工作,我也无意管理这样的异常,我只是在做一个“假设”问题,这种好奇心是从该视频的确认中产生的。我想:如果它是在 Scala 中完成的,为什么不在 Java 中呢?