【问题标题】:Having a problem adding a throws clause to a toString method header将 throws 子句添加到 toString 方法标头时出现问题
【发布时间】:2020-03-14 04:36:18
【问题描述】:

有人可以帮忙吗?我是一名 CS 学生,正在从事 Java 课程的项目。我们需要创建一个在 LinkedQueue 类中抛出的检查异常。这一切都很好。在我的 LinkedQueue 上面的类中,我们需要确认异常而不是处理它。因此,对于调用 LinkedQueue 方法的类中的每个方法,我都添加了“抛出 EmptyQueueException”。除了 toString 方法外,它都有效。当我添加 throws 子句时,我收到一个错误提示

"覆盖 java.lang.Object.toString"

异常 EmptyQueueException 与 Object.toString 中的 throws 子句不兼容。

有什么想法/帮助吗?

非常感谢

【问题讨论】:

  • 你不能那样做。您的类会覆盖 toString 方法,这意味着您无法更改其签名。这包括例外情况。
  • 它与toString() 签名有关。由于它是一个覆盖,它需要保持与它覆盖的方法相同的形式。这包括返回类型、访问级别、参数和抛出声明。

标签: java exception checked


【解决方案1】:

你不能。 Object#toString() 方法的约定保证它不会抛出任何已检查异常,并且由于 Object(所有内容)都必须满足此约定,因此您不能添加已检查异常。 toString() 不应该永远抛出任何类型的异常,因为它在整个应用程序的数千个地方都使用过,并且应该“安全”调用。

【讨论】:

  • 那我该怎么办?我问我的教授是否可以将其更改为未经检查的异常,答案是否定的。它被抛出到linkedqueue 的.front() 方法中,如果我想知道我在打印什么,我需要在toString 中调用它!我可以在其他地方承认这一点以覆盖 toString 或以不同的方式处理它吗?谢谢
  • @WantaghMomma 那么你必须catch 处理异常而不是从方法中抛出它。
  • @WantaghMomma 事实上,toString() 经常在抛出异常时被调用以提供额外的上下文细节。从catch 块中抛出异常将是一个可怕的想法,因为当前异常将被中止并且其上下文丢失。相反,返回一个空字符串或默认值。这样可以节省很多时间。
  • @WantaghMomma 你不应该无条件地调用front() 或任何方法。相反,请先检查您的队列是否为空。如果您包含 toString() 的实际代码,我们可能会提供帮助。
  • 谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 2013-04-11
  • 1970-01-01
  • 2023-03-23
  • 2020-07-03
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多