您的位置:首页 > 其它

【Kotlin】官方文档翻译-异常(Exceptions)

2017-06-29 14:05 603 查看

修改记录

时间描述
2017-06-29编写

前言

  本文翻译自官网教程:http://kotlinlang.org/docs/reference/exceptions.html,并向其中添加了在开发过程中发现的不完美地方。

正文

异常类

  在Kotlin中,所有的异常类都派生自Throwable。每个异常类都有一个信息、堆栈跟踪和一个可选的原因。

  想要手动抛出一个异常对象,可以使用throw表达式:

throw MyException("Hi There!")


  想要捕获异常,可以使用try表达式:

try {
// some code
}
catch (e: SomeException) {
// handler
}
finally {
// optional finally block
}


  catch块的数量可以为0或多个,finally块也可以省略。但try表达式中必须至少有一个catch或finally块。

try的返回值

  在Kotlin中,try作为表达式可以拥有返回值。

val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null }


  如上述代码所示,try表达式的返回值可能是try块中的最后一个表达式(parseInt方法)返回的值,也可能是catch块中的最后一个表达式(null)返回的值。finally块的内容不会影响到try表达式的结果。

检查异常

  和Java不一样,Kotlin不会检查调用是否存在异常。下面是JDK中StringBuilder类实现的一个接口:

Appendable append(CharSequence csq) throws IOException;


  在Java中,上面的接口抛出了一个异常,那么在调用这个接口的实现方法时,就必须用try-catch块包裹起来,以捕获随时可能抛出的异常。

try {
log.append(message)
}
catch (IOException e) {
// Must be safe
}


  但是Kotlin不用,直接调用也能通过。

Nothing类型

  当使用throw手动抛出异常的时候会用到它:

val s = person.name ?: throw IllegalArgumentException("Name required")


  throw表达式的类型就是Nothing。该类型没有值,常被用来标记那些无法执行到的代码位置。比如,在方法中用Nothing标记该方法永远不会有返回值:

fun fail(message: String): Nothing {
throw IllegalArgumentException(message<
4000
/span>)
}


  当调用该方法时,编译器就会知道本次执行到了这个调用就不会继续了:

val s = person.name ?: fail("Name required")
println(s)     // 's' is known to be initialized at this point


  上面的代码,如果person.name为空,println语句就会报错,提示该语句永远不会执行。

查漏补缺

  官网有个很重要的知识点没有提及:Kotlin不提供异常检查,说明Kotlin是支持在方法上抛出异常的,就像Java的throws语句。但这篇教程里面没有任何提示,导致我一度以为Kotlin是不支持在方法上抛出异常的。

  这里要感谢行云间博主(http://blog.csdn.net/io_field/article/details/53492541#comments)的解答,要想在Kotlin中的方法上抛出异常,可以使用@Throws注解:

package chngzhen.rmi.common.service

import java.rmi.Remote
import java.rmi.RemoteException
/**
* 远程对象的接口必须扩展自Remote接口
* 本接口提供给客户端作为存根(Stub)
*/
public interface RmiService: Remote {

@Throws(RemoteException::class)
fun sayHello(name: String): String
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: