黑猴子的家:Scala 异常

当碰到异常情况时,方法抛出一个异常,终止方法本身的执行,异常传递到其调用者,调用者可以处理该异常,也可以升级到它的调用者。运行系统会一直这样升级异常,直到有调用者能处理它。 如果一直没有处理,则终止整个程序。

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

猜你喜欢

转载自blog.csdn.net/weixin_33733810/article/details/91182432