Java 抑制异常和原因之间的区别

Java 抑制异常和原因之间的区别,java,exception,Java,Exception,我有自己的异常,由我的类BrowserException引发。 这可能是因为某些内部问题,即UnSupportOrderEncodingException 现在我有两个选择: Throwable.addsupprested(Throwable异常) 可丢弃的。初始原因(可丢弃的原因) 在异常情况下,抑制异常和原因之间有什么区别? 我希望何时使用它们中的每一个?被抑制的异常是在没有发生另一个异常的情况下会发生的异常。我只知道发生这种情况的一种情况,那就是try with resources语句。报

我有自己的异常,由我的类BrowserException引发。
这可能是因为某些内部问题,即UnSupportOrderEncodingException

现在我有两个选择:

  • Throwable.addsupprested(Throwable异常)
  • 可丢弃的。初始原因(可丢弃的原因)
  • 在异常情况下,抑制异常和原因之间有什么区别?

    我希望何时使用它们中的每一个?

    被抑制的异常是在没有发生另一个异常的情况下会发生的异常。我只知道发生这种情况的一种情况,那就是try with resources语句。报告说:

    资源的关闭顺序与初始化资源的顺序相反。资源只有在初始化为非空值时才会关闭。关闭一个资源时出现的异常不会阻止关闭其他资源。如果初始值设定项、try块或关闭资源之前引发了异常,则会抑制此类异常

    因此,假设您正试图写入U盘上的文件流,并且U盘已被移除。
    write
    调用抛出一个
    IOException
    ——但是
    close
    调用也抛出一个异常,因为它试图刷新缓冲区。
    write
    调用的原始异常将是调用者看到的异常,但他们将能够得到
    close
    作为抑制异常抛出的异常

    如果异常实际上是将一个异常转换为另一个异常的结果,那么它就有原因。假设您正在编写一个与本地文件系统对话的SQL系统。您的JDBC驱动程序方法只能抛出
    SQLException
    ,因此,如果底层代码抛出
    IOException
    ,因为它无法从磁盘读取,您该怎么办?您可能希望
    IOException
    的详细信息在
    SQLException
    中可见,因此将其传递到
    SQLException
    的构造函数中,
    IOException
    是异常的原因

    您不太可能需要自己添加抑制的异常,但是创建一个由另一个异常引起的异常(通常通过构造函数而不是调用
    initCause
    )是相当常见的。请参阅此链接并了解原因