scala(二十二) 异常(Exception)

2022-04-22 16:31:03 浏览数 (1)

语法处理上和Java类似,但是又不尽相同

java中异常的处理方式:

1.捕获异常: try{..}catch(..){..} finally{...} 2.抛出异常: 1.在方法体中通过throw关键字抛出 2.在方法名后面通过throws关键字声明异常

代码语言:javascript复制
try{
  // 业务代码
}case (异常类型1){
 // 异常处理
}case (异常类型2){
 // 异常处理
}
... //可以有多个 case
finally{
 // 无论如何都需要执行的代码
}

scala中异常的处理方式:

1.捕获异常: 1.try{...}catch{case e:Exception=> ...} finally{..} 2.Try(代码块).getOrElse(默认值) [如果代码执行成功则返回执行结果,如果代码执行失败则返回默认值] 【工作常用】 2.抛出异常: 在方法体中通过throw关键字抛出 【工作不用】

代码语言:javascript复制
try {
 //业务代码
}catch{
 case 异常类型1 => // 处理异常
 case 异常类型2 => // 处理异常
... //可以定义多个
}finally{
 // 无论如何都需要执行的代码
}

案例

案例一:被除数不能为0 异常处理

不处理异常

代码语言:javascript复制
  def main(args: Array[String]): Unit = {
    val a=1
    val b=0

    a/b //将会抛出异常

    println("程序结束")
  }

程序抛出异常,程序结束;后面的代码不再执行

代码语言:javascript复制
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.admin.xxx.collection.TestException$.main(TestException.scala:10)
    at com.admin.xxx.collection.TestException.main(TestException.scala)

捕获异常

代码语言:javascript复制
  def main(args: Array[String]): Unit = {

    val a=1
    val b=0

    try {
      a/b
    }catch {
      case e:ArithmeticException=> println("被除数不能为零")
    }

    println("程序结束")
  }

捕获程序抛出的异常,进行处理;后面的程序进行执行。

代码语言:javascript复制
被除数不能为零
程序结束

有效的处理程序异常,将很好的保证程序运行的稳定性。

案例二:信息汇总 有这么一批不完整的数据;需要进行汇总

代码语言:javascript复制
id     姓名  年纪 性别  工资    提成(原工资的百分比)
1001    张三  24  男   5200    0.1
1002    阿娇  26  女   10000   0.2
1003    李四  32  男       
1004    王妃  34  女   12000   0.1
1005    刘秀  27  男   4000     
1006    哇哈哈哈        女   4500    0.1

转换成List[String]

代码语言:javascript复制
    val list =List(
      "1001t张三t24t男t5200t0.1",
      "1002t阿娇t26t女t10000t0.2",
      "1003t李四t32t男tt",
      "1004t王妃t34t女t12000t0.1",
      "1005t刘秀t27t男t4000t ",
      "1006t哇哈哈哈tt女t4500t0.1"
    )

统计员工平均年龄

代码语言:javascript复制
    val sum=list.map(s=>{
      // 按照t 切分
      val infoArray=s.split("t")
      //获取年龄
      infoArray(2).toInt
    }).reduce((x,y)=>x y)

此时程序报错了;数字转换异常。

代码语言:javascript复制
Exception in thread "main" java.lang.NumberFormatException: For input string: ""

当然我们可以使用if 除去为空的数据

代码语言:javascript复制
     val sum=list.map(s=>{
      // 按照t 切分
      val infoArray=s.split("t")
      //获取年龄
      val age=infoArray(2)
      if(age != "") age.toInt else 0 // 每填写年龄的暂时按照0处理。
    }).reduce((x,y)=>x y)

注意在 scala中 == 类似于 java 中的 equals;所以 != 就相当于对 equals 取反 打印

代码语言:javascript复制
println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

除了使用if 的方式处理外,还可以使用try...catch的方式

代码语言:javascript复制
    val sum=list.map(s=>{
      // 按照t 切分
      val infoArray=s.split("t")
      //获取年龄
      val age=infoArray(2)
      // 为了简洁,写成一行
      try{age.toInt}catch {case NumberFormatException => 0}
    }).reduce((x,y)=>x y)

打印

代码语言:javascript复制
println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

除了使用 try{...}catch{case e:Exception=> ...} finally{..} 的方式,还有第二种方式Try。 位于 scala.util 包下

代码语言:javascript复制
import scala.util.Try
代码语言:javascript复制
    val sum=list.map(s=>{
      // 按照t 切分
      val infoArray=s.split("t")
      //获取年龄
      val age=infoArray(2)
      // 为了简洁,写成一行
      Try(age.toInt).getOrElse(0)
    }).reduce((x,y)=>x y)

打印

代码语言:javascript复制
println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

对比一下

代码语言:javascript复制
try{age.toInt}catch {case NumberFormatException => 0}

VS

代码语言:javascript复制
Try(age.toInt).getOrElse(0)

第二种方式是不是简洁很多?

最后在演示一个案例吧;还是上面那批数据 统计员工编号、姓名、工资(月薪 提成)

代码语言:javascript复制
    val infoList: List[(String, String, Double)] = list.map(s => {
      val info = s.split("t")
      //员工编号
      val id = info(0)
      //员工姓名
      val name = info(1)
      //月薪(有的员工可能没填)
      val salary:Double = Try(info(4).toDouble).getOrElse(0)
      //提成(有的员工可能没填)
      val commission:Double = Try(info(5).toDouble).getOrElse(0)

      // 计算总工资
      val total = salary   (salary*commission)

      //为了方便,包装成元组
      (id, name, total)
    })

遍历infoList

代码语言:javascript复制
for((id,name,total) <- infoList){
      println(s"员工编号:$id,员工姓名:$name,员工工资:$total")
}

打印

代码语言:javascript复制
员工编号:1001,员工姓名:张三,员工工资:5720.0
员工编号:1002,员工姓名:阿娇,员工工资:12000.0
员工编号:1003,员工姓名:李四,员工工资:0.0
员工编号:1004,员工姓名:王妃,员工工资:13200.0
员工编号:1005,员工姓名:刘秀,员工工资:4000.0
员工编号:1006,员工姓名:哇哈哈哈,员工工资:4950.0

最后

关于scala中异常部分,就这么点内容,比较简单;若有什么每补充到的

0 人点赞