Scala中的@throws不允许调用Java来捕获正确的异常类型

时间:2012-04-26 13:05:16

标签: java eclipse scala exception scala-ide

我有一些像这样的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中编译为你的类型时显而易见,这表明该错误存在于Eclipse Java编译器或IDE的某些部分中。其他人可以这样重现吗?我正在使用Eclipse 3.7.2

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

为了将来参考,此问题已得到修复(https://github.com/scala-ide/scala-ide/commit/055a81cd3fe792e4327668791888c30cf04793f5)。该修复程序已同时适用于Scala IDE 2.0.x and Helium nightlies。 此外,它将包含在下一个Scala IDE 2.0.2维护版本中。

(抱歉有额外的噪音,但我意识到答案比简单评论更明显)