在Java中捕获Scala抛出的异常 - 无法访问的catch块

gon*_*opp 8 java scala exception-handling compiler-errors scala-java-interop

Scala 没有检查异常.但是,从java调用scala代码时,最好捕获scala抛出的异常.

斯卡拉:

def f()=
    {
    //do something that throws SomeException
    }
Run Code Online (Sandbox Code Playgroud)

Java的:

try
    { f() }
catch (SomeException e)
    {}
Run Code Online (Sandbox Code Playgroud)

javac不喜欢这个,并抱怨"这个异常永远不会从try语句体中抛出"

有没有办法让scala声明它抛出一个已检查的异常?

gon*_*opp 13

使用throws注释:

@throws(classOf[SomeException])
def f()= {
    //do something that throws SomeException
    }
Run Code Online (Sandbox Code Playgroud)

您还可以注释类构造函数:

class MyClass @throws(classOf[SomeException]) (arg1: Int) {
}
Run Code Online (Sandbox Code Playgroud)

在Scala之旅中有所涉及


Rex*_*err 10

您仍然可以捕获太多异常,然后重新抛出您无法处理的异常:

try { f(); }
catch (Exception e) {
  if (e instanceof SomeException)  // Logic
  else throw e;
}
Run Code Online (Sandbox Code Playgroud)