scala(二十二) 异常(Exception)

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

java中异常的处理方式:

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

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

scala中异常的处理方式:

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

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

案例

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

不处理异常

  def main(args: Array[String]): Unit = {
    val a=1
    val b=0

    a/b //将会抛出异常

    println("程序结束")
  }

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

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)

捕获异常

  def main(args: Array[String]): Unit = {

    val a=1
    val b=0

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

    println("程序结束")
  }

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

被除数不能为零
程序结束

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

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

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]

    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"
    )

统计员工平均年龄

    val sum=list.map(s=>{
      // 按照\t 切分
      val infoArray=s.split("\t")
      //获取年龄
      infoArray(2).toInt
    }).reduce((x,y)=>x+y)

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

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

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

     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 取反
打印

println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

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

    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)

打印

println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

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

import scala.util.Try
    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)

打印

println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23

对比一下

try{age.toInt}catch {case NumberFormatException => 0}

VS

Try(age.toInt).getOrElse(0)

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

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

    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

for((id,name,total) <- infoList){
      println(s"员工编号:$id,员工姓名:$name,员工工资:$total")
}

打印

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

最后

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Overview 本章主要介绍各语言中异常声明和处理方式。 Java 篇 分类 在 Java 中异常是种特殊对象,...
    bookislife阅读 789评论 0 0
  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个...
    武小寺阅读 1,515评论 0 0
  • Java异常 异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行...
    java部落阅读 3,113评论 1 13
  • 大数据开发中常用 Scala 进行功能开发,而且大数据处理和计算框架 Flink 和 Spark 都是基于 Sca...
    火影启源阅读 613评论 0 2
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,535评论 28 53