在使用Kotlin的方法中抛出异常

ces*_*rds 32 java kotlin kotlin-extension

我正在尝试将此Java代码转换为Kotlin:

public class HeaderInterceptor implements Interceptor {
  @Override public Response intercept(Chain chain) throws IOException {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我实现这些方法时,我会得到类似的东西

class JsonHeadersInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain?): Response? {
        throw UnsupportedOperationException()
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现有关在Kotlin中抛出异常的唯一信息就是这个.

删除问号的一部分,因为没有必要,为什么它不会IOException以同样的方式处理?处理这种情况的最佳方法是什么?

hot*_*key 72

在Kotlin中,没有经过检查的异常,不必声明任何异常,并且您不会被迫捕获任何异常,当然,您可以.即使从Java类派生,您也不必声明方法的异常throws.

@Throws(SomeException::class)它只是Java互操作性的一种手段,它允许用throwsJava签名编写一个函数,这样在Java中就可以(并且必要)处理异常.

相反,公共API异常应记录在带有@throws标记的KDoc中.


Rad*_*esh 17

Java中,您的函数是这样的

void foo() throws IOException{
    throw new IOException();
}
Run Code Online (Sandbox Code Playgroud)

但是在Kotlin中,您可以添加如下所示的注释,以强制其他Java类捕获它。但是,正如其他答案所指出的那样,它在Kotlin类中没有任何意义。

@Throws(IOException::class)
fun foo() {
    throw IOException()
}
Run Code Online (Sandbox Code Playgroud)

资料来源kotlinlang.org

  • 我是在 okHttp 拦截器中完成的。但它并没有强制 java 调用者捕获 IOException。你能告诉我如何在拦截器中抛出异常吗? (2认同)