【问题标题】:Why can you throw a non occurring exception but not catch it为什么你可以抛出一个未发生的异常但不能捕获它
【发布时间】:2016-11-22 19:30:23
【问题描述】:
public void throwTest() throws SQLException, IOException {
    try{  
    } catch (SQLException e) {
    }
}

为什么试图捕获一个不会发生的异常会产生编译错误,而我可以抛出任何异常,它不会产生错误?两者都可以在编译时检查,所以如果行为相同对我来说更有意义?

在给定的示例中,catch 块将生成编译时错误: 错误:在相应的 try 语句的主体中永远不会抛出异常 SQLException } 捕捉 (SQLException e) {

当我删除 catch 块时,代码编译得很好。这对我来说似乎不一致。 这种行为有什么特别的原因吗?

【问题讨论】:

  • 问题不是关于编译错误,而是关于这种情况下 throws 和 catch 行为的区别,所以我相信这不是一个重复的问题
  • 复习你是对的,这不是重复的问题。我的错误和道歉。
  • 没问题,我会努力学习我的“问题定义”技能;)

标签: java exception exception-handling


【解决方案1】:

捕获可以在编译时确定。 throws 声明实际上不能在当前方法中抛出,但确实在某些子类的 overriden 方法中。它是以子类的形式使用类的合同:它可能会抛出该异常,并且需要处理该异常。它还允许子类的方法抛出该方法。

【讨论】:

  • 它还允许自己在以后的版本中抛出异常。
  • 这确实是一个完美的答案,非常感谢(由于该问题目前被标记为重复,我似乎无法接受您的回答)。
  • @ExaSephiroth 重新打开。
【解决方案2】:

我不确定我是否理解您的问题,但我会试一试。编译器试图帮助您避免错误。如果您的 try 块中有抛出 SQLException 的代码,但您的 catch 块有错字并且您正在捕获 SLQException,那么您会希望编译器标记该错误。这就是为什么它会将其标记为错误,您捕获的异常永远不会被抛出。

我认为你的问题的第二部分是,为什么你可以在你的方法声明的 throws 子句中放任何你想要的东西,而不管方法是否真的抛出了那个异常?我认为有两个原因。首先,方法声明是一个接口,它告诉客户如何对其进行编码。在完成方法主体之前,您可以设置方法声明并将其提供给您的同事。所以在这种情况下,这不是一个错误,只是一个正在进行的工作。其次,您的类可以实现一个接口,该接口将该方法声明为抛出异常,但在您的特定实现中您不需要抛出它。同样,这不是错误。

【讨论】:

  • 您可以在完成方法主体之前设置方法声明并使其对您的同事可用。 与其说完成方法主体,不如说它是关于允许未来的修改。关键是签名是客户的合同,就像你解释的那样。 其次,你的类可以实现一个接口,该接口将方法声明为抛出异常,但在你的特定实现中你不需要抛出它。在这种情况下,方法不需要声明异常。
  • 很抱歉问题不清楚。核心问题是为什么 throws 和 catch 块之间的行为不一样。事实上,我没有考虑过被覆盖的行为,这当然是行为差异的一个很好的理由。
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
相关资源
最近更新 更多