【问题标题】:My code compiles with errors but executes fine at runtime我的代码编译时出错,但在运行时执行良好
【发布时间】:2016-09-06 11:27:33
【问题描述】:

我有一个名为 X 的类,它实现了 java.sql 包中的 Connection 接口。我们使用的是 java 1.6,一切正常。Oracle 在 java 1.7 的 Connection 接口中引入了一些 4 个新方法。当我用JRE 设置为 1.7(在 Eclipse 的构建路径中)代码无法编译并出现以下错误

BrmPcmConnection 类型必须实现继承的抽象方法 Connection.abort(Executor)

我了解 Connection.abort 是 Java 7 中引入的新方法,我需要实现它。我有使用 1.6 编译的相同代码,它在 1.7 JRE 上运行良好!

请帮我理解一下,为什么代码编译时出错,但在运行时没有异常。是因为在运行时没有人调用新方法吗?

【问题讨论】:

  • 或者您正在运行旧版本。清理您的项目文件并重新编译。
  • 也许您可以向我们展示导致该错误的代码?向我们展示抽象基类和实现。

标签: java eclipse interface compiler-errors runtime


【解决方案1】:

当你编译一个应用程序时,你必须实现超类的所有抽象方法。但是,假设您有一个程序已经编译,并且您通过添加方法更改了超类或接口,会发生什么?

JVM 将尝试运行该程序,只要您没有实际调用该方法,这一切都很好。如果您调用该方法,如果您在没有它的版本中编译,这将很难做到,您将得到一个运行时错误。

但不要调用你没有的方法,一切都会奏效。

如果您没有这些方法的实现,我建议添加

// @Override 
public void setSchema(String pSchema) throws SQLException { 
    throw new UnsupportedOperationException();
}

在这种情况下,您也可以throw new SQLException("Not implemented")

注意:我已经注释掉了@Override,所以它仍然可以在旧版本中编译。

【讨论】:

  • 这是我从未想过的有趣行为,但它完全有道理。我想这意味着您可以从技术上更新已发布的接口,而不会破坏其用户的实现。虽然如果用户需要重新编译,那么他们就会遇到麻烦。很好的答案,感谢您启发我。
  • @BrandonIbbotson 在 Java 8 中,您可以添加具有 default 实现的方法,从而减少问题。
  • 谢谢。我的类是纯类而不是抽象类。所以要摆脱这些编译错误,我可以在接口中添加新方法的默认实现。我是说如果 setSchema 是新方法 oracle 已添加。我可以广告吗
  • @Override public void setSchema(String pSchema) throws SQLException { // TODO Auto-generated method stub } 基本上它什么都不做。它符合接口。我希望它不会破坏代码任何其他副作用。
  • @AshishThakur 我添加了一个示例。除非您知道可以忽略该方法,否则我会抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多