7

我有一些这样的Scala代码:

class Callee {
  @throws(classOf[MyCheckedException])
  def doStuff() {
  }
}

像这样从 Java 调用它:

public class Caller {

  public static void main(String[] args) {
    // this won't compile; the Java compiler complains that the catch block is unreachable
    // however without the catch block, it complains "unhandled exception MyCheckedException"
    try {
      new Callee().doStuff();
    }
    catch (MyCheckedException e) {

    }
  }
}

删除 catch 块会导致 Java 编译器出错,提示“未处理的异常类型 MyCheckedException”。为 MyCheckedException 添加 catch 块会导致编译器抱怨 catch 块无法访问,因为从不抛出异常。

如果我捕获 Exception 并执行 instanceOf,我可以捕获来自 doStuff 的正确异常,但我认为 @throws 注释应该生成正确的字节码以使正确的 catch 块工作。我错了,还是这里有错误?

作为记录,这是使用 Scala 2.9.2 和 Java 1.6。

编辑:它使用 sbt 从命令行编译调用 javac/scalac。该错误仅在 Eclipse 中的 compile-as-you-type 期间很明显,这表明该错误存在于 Eclipse Java 编译器或 IDE 的某些部分中。其他人可以这样复制吗?我正在使用 Eclipse 3.7.2

4

2 回答 2

6

我可以用 2.9.1 在 Helios 上重现这个。这是演示编译器中的错误,您应该在http://www.assembla.com/spaces/scala-ide/tickets上将其作为错误提出。

于 2012-04-26T14:59:39.377 回答
2

为了将来参考,这个问题已经修复(https://github.com/scala-ide/scala-ide/commit/055a81cd3fe792e4327668791888c30cf04793f5)。Scala IDE 2.0.x 和 Helium nightlies都提供了该修复程序。此外,它将包含在下一个 Scala IDE 2.0.2 维护版本中。

(对不起,额外的噪音,但我意识到有一个答案比一个简单的评论更明显)

于 2012-05-17T12:58:57.923 回答