【问题标题】:why some IOException is thrown out from library code?为什么从库代码中抛出一些 IOException?
【发布时间】:2012-01-19 05:50:11
【问题描述】:

我正在使用第三方库代码,只调用一种方法。该方法被声明为抛出ZZException,但是在实际环境中运行时,我们发现该方法有时抛出了IOExceoption。

public void TestMethod() throws ZZException

我想知道为什么没有抛出 IOException 的 decalrtion?如果不声明 throw IOException,是否可以抛出 IOException?

顺便说一句,ZZException 是 RuntimeException 的子类

【问题讨论】:

  • 您确定抛出的是 IOException 而不是由 IOException 引起的 ZZException(这是合法且推荐的方法)吗?
  • 我确定是 IOException 被抛出。
  • ZZException 是 IOException 的子类吗?如果是这样,捕获 IOException 也会捕获 ZZException。这可能是正在发生的事情吗?
  • 另外,是来自 SDK 的 java.io.IOException,或者开发人员创建了自己的 IOException 使其成为运行时异常。您可以通过捕获 IOException 来检查它。如果您只能通过 Exception 捕获它和/或从运行时错误继承,这将是一个强烈的信号,这就是他们所做的,而且是一个非常糟糕的主意。
  • 如果您只是通过删除敏感信息发布堆栈跟踪,一切都会变得清晰......

标签: java


【解决方案1】:

这可能是库代码中的错误或使用库时的其他错误,最好的了解方法是将其报告给开发人员,包括一些代码并查看他的答案。

【讨论】:

  • 为什么会出现这样的错误。如果发生此错误,Java 无法编译?
  • 好吧,任何失败或中断的 I/O 操作都会导致 IOException,这与编译无关,即使您的代码在运行时有效,仍然可能会出现问题并且出现异常抛出,如果这个异常没有被错误捕获,它将显示在更高的级别。
【解决方案2】:

除非ZZExceptionIOException 的超类,否则IOException 不能代替ZZException 被丢弃。异常链接的概念允许您为给定的异常指定“原因”。您确定您没有在堆栈跟踪中看到IOException 是原始ZZException 的“原因”吗?如果您能向我们展示您获得的堆栈跟踪信息,将会有所帮助。

【讨论】:

    【解决方案3】:

    除非 ZZException 是 IOException 的子类,否则文档中的方法不能抛出 IOException。文档很可能是错误的/过时的。当您针对类进行编译时会发生什么?编译器认为它可以抛出 IOException 吗?

    另一种解释是它根本没有被抛出,但它只是在日志文件中看起来是这样,因为代码记录了一个堆栈跟踪,或者因为它抛出了一个包装了 IOException 的 ZZException(作为其原因)。

    【讨论】:

    • 超类或父类,而不是子类。
    • 如果 ZZException 扩展了 IOException,那么该方法可以抛出一个 IOException(即 ZZException),而不是 any IOException。
    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2017-11-22
    • 2012-01-13
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多