java - 共享异常实例是否安全

标签 java exception exception-handling

我们正在制作一个类似 Excel 的系统。当我们打开文档并发现不受支持的函数时,我们抛出异常。我们只支持一小部分 excel 函数,这可能会经常发生。问题是当有很多包含不受支持的函数的单元格时,会创建很多很多异常实例。创建那么多异常实例会消耗不可忽视的时间。

我们在异常类中没有任何特殊属性。我们需要知道的是抛出异常的事实。我们刚刚发现错误发生并将单元格标记为错误。

所以我们决定共享一个异常实例,并在需要时抛出它。异常实例可以由多个线程抛出。我怀疑堆栈跟踪可能已损坏,但是,我们没有看到它。我们只是捕获异常,并将相应的单元格标记为错误。

我的问题是: 在这种情况下,共享异常实例是否安全? 好吧,我阅读了以下文章: Java: is Exception class thread-safe? 但语境似乎有所不同。

感谢您提前阅读这么长的问题和回复。

最佳答案

[...] is it safe to share exception instance?

是的,如果你小心的话。

如果你不小心,getStackTrace例如可能会搞砸。要么确保每个线程都有自己的异常对象,要么覆盖 getStackTrace 并返回一个空数组。

(在某些情况下,JVM 实际上会重用异常实例。如果内存不足,它将重用预分配的 OutOfMemoryError 而不是尝试创建一个新的实例。在这种情况下 getStackTrace 返回一个空数组。)

相关问题:

关于java - 共享异常实例是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473263/

相关文章:

java - 如果在线程的运行函数中执行 return 语句,线程是否会在 java 中停止

java - Android Studio Proguard 运行失败

java - 在 Android 中实现搜索的最佳方式是什么?

java - StringIndexOutOfBoundException 原因不明

c# - 如何在单元测试中模拟抛出异常?

java - 在 Java 中现有数据之间添加文本文件中的数据

java - 启动线程时出现非法线程状态异常

c++ - 关于语法错误的 Python 异常文本(boost 库)

exception-handling - Powershell - 为什么根据 stderr 重定向/如何在 catch 中访问 "multiple"异常以不同方式处理异常?

c# - 将对象 (List<string>) 作为异常的一部分传递