当碰到异常情况时,方法抛出一个异常,终止方法本身的执行,异常传递到其调用者,调用者可以处理该异常,也可以升级到它的调用者。运行系统会一直这样升级异常,直到有调用者能处理它。 如果一直没有处理,则终止整个程序。
Scala的异常的工作机制和Java一样,但是Scala没有“checked”异常,你不需要声明说函数或者方法可能会抛出某种异常。受检异常在编译器被检查,java必须声明方法所会抛出的异常类型。
抛出异常:用throw关键字,抛出一个异常对象。所有异常都是Throwable的子类型。throw表达式是有类型的,就是Nothing,因为Nothing是所有类型的子类型,所以throw表达式可以用在需要类型的地方。
捕捉异常:在Scala里,借用了模式匹配的思想来做异常的匹配,因此,在catch的代码里,是一系列case字句。
异常捕捉的机制与其他语言中一样,如果有异常发生,catch字句是按次序捕捉的。因此,在catch字句中,越具体的异常越要靠前,越普遍的异常越靠后。 如果抛出的异常不在catch字句中,该异常则无法处理,会被升级到调用者处。
finally字句用于执行不管是正常处理还是有异常发生时都需要执行的步骤,一般用于对象的清理工作。
1、Java 异常写法
unchecked 异常和 checked异常
try{
}catch (NullPointerException e1){
}catch (Exception e2){
}finally {
}
2、Scala异常写法
Scala 只有unchecked异常,没有checked异常
//scala写法
try {
} catch {
case e1: NullPointerException =>
case e2: Exception =>
} finally {
}
3、案例演示
object Loop_Exception {
def main(args: Array[String]): Unit = {
def divider(x:Double,y:Double) = {
if(y == 0 ) throw new Exception("0 不能作为除数")
//if(y == 0 ) throw new NullPointerException("空指针 异常")
x / y
}
println(divider(10,0))
//Ctrl + Alt + T
try {
println(divider(10, 0))
} catch {
case e1:Exception => println("0 作为除数的异常被成功捕获" + " -> " + e1.getMessage + " -> " + e1.printStackTrace())
case e2:Throwable => println("0 作为除数的异常被成功捕获")
case e3:Any => println("0 作为除数的异常被成功捕获")
case e4:Object => println("0 作为除数的异常被成功捕获")
} finally {}
}
}
4、案例补充
object ExceptionSyllabus {
def main(args: Array[String]): Unit = {
def divider(x:Double,y:Double) = {
if (y == 0) throw new Exception (" || 0 不能作为除数")
x/y
}
//e1 下面的四种类型都可以,只要大于捕获的异常类型就可以
try {
println(divider(10, 0))
} catch {
//IndexOutOfBoundsException 不是 一个类型 也不是包含关系,空指针是空指针,下标越解是下标越界
//case e1:IndexOutOfBoundsException => println("0不能作为除数" + e1.getMessage)
//case e1:NullPointerException => println("0不能作为除数" + e1.getMessage)
//case e1:Exception => println("0不能作为除数" + e1.getMessage)
//case e1:Throwable => println("0不能作为除数" + e1.getMessage)
//case e1:AnyRef => println("0不能作为除数" + e1.getMessage)
case e1:Any => println("0不能作为除数" + e1.getMessage)
}
}
}
转载于:https://www.jianshu.com/p/3b4e4b3231c2