前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >scala(二十二) 异常(Exception)

scala(二十二) 异常(Exception)

作者头像
用户1483438
发布2022-04-22 16:31:03
6150
发布2022-04-22 16:31:03
举报
文章被收录于专栏:大数据共享

语法处理上和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(
      "1001\t张三\t24\t男\t5200\t0.1",
      "1002\t阿娇\t26\t女\t10000\t0.2",
      "1003\t李四\t32\t男\t\t",
      "1004\t王妃\t34\t女\t12000\t0.1",
      "1005\t刘秀\t27\t男\t4000\t ",
      "1006\t哇哈哈哈\t\t女\t4500\t0.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中异常部分,就这么点内容,比较简单;若有什么每补充到的

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • java中异常的处理方式:
  • scala中异常的处理方式:
  • 案例
  • 最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档