1.抛出异常的表达式的类型为Nothing,Int可以兼容Nothing。
def method1(n: Int): Unit ={ val half: Int = if (n % 2 == 0) n / 2 else throw new RuntimeException("n must be even") }
2.try-catch-finally的基本语法,异常处理需要配合模式匹配(pattern matching)使用
def main(args: Array[String]): Unit = { val fileReader: FileReader = new FileReader("input.txt") try { //处理文件内容 }catch { case ex: FileNotFoundException => //处理找不到文件的情况 case ex: IOException => //处理其他IO错误 }finally { fileReader.close } }
3.返回值
①正常情况下,如果没有异常抛出,整个表达式的结果就是try子句的结果;如果有异常抛出并且被捕获时,整个表达式的结果就是对应的catch子句的结果;而如果有异常抛出并且没有被捕获,整个表达式就没有结果。如果有finally子句,该子句计算出来的值会被丢弃(即finally子句不返回值)。
//返回1 def g(): Int = try 1 finally 2
②跟Java一样,当finally子句包含一个显式的返回语句(即return),或者抛出某个异常,那么这个返回值或异常将会“改写”(overrule)任何之前的try代码块或某个catch子句中产生的值。
//返回2 def f(): Int = try return 1 finally return 2