当我创建一个新的Exception时,我必须抛弃它,还是可以将它放在List中?

JRS*_*fty 1 java exception-handling

我有一个项目,我必须解析格式化的ASCII数据.解析器有可能识别格式化中的问题(预期未找到,发现意外数据).通常,如果我发现某些事情失败,我会抛出异常.但是,这一次,我想继续解析过程,并将解析器错误存储在结束类中.我的问题是,是否可以创建一个新的Exception并将其存储在一个List而不是抛出它以免停止处理?

Ste*_*n C 6

我的问题是,是否可以创建一个新的Exception并将其存储在一个List而不是抛出它以免停止处理?

是.那可行.但它相当昂贵,因为Exception对象捕获所有当前线程的堆栈帧.如果你不打算使用堆栈帧而不是抛出异常,那么你已经做了很多不必要的工作.除非有一个特定的原因你必须使用一个Exception,然后一个简单的类来捕获错误细节是一个更好的主意.

但是,有一个聪明的黑客/技巧可以用来使异常对象实例化成本更低.如果您查看ThrowableAPI,您会注意到有一个名为的方法fillInStackTrace().该方法由Throwable构造函数本身调用以捕获堆栈帧,而实现(in Throwable)在一些本机代码中执行此操作.但是,此方法不是final,因此您可以在自定义异常类中覆盖它以将其转换为无操作.

瞧!一个运行速度更快的构造函数!但是,当然,如果你需要一个异常的堆栈跟踪,那你就不走运了.所以我建议非常谨慎地使用这个黑客/技巧.