美文网首页
scala(二十二) 异常(Exception)

scala(二十二) 异常(Exception)

作者: 万事万物 | 来源:发表于2021-07-06 08:22 被阅读0次

语法处理上和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中异常部分,就这么点内容,比较简单;若有什么每补充到的,留言交流

相关文章

  • scala(二十二) 异常(Exception)

    语法处理上和Java类似,但是又不尽相同。 java中异常的处理方式: 1.捕获异常: try{..}catch(...

  • Azalea\Exception

    Exception 异常虚类 Azalea\Exception 继承于 PHP 异常类 \Exception Ex...

  • C++异常

    异常处理 头文件中定义了异常类exception和bad_exception,异常类exce...

  • 异常

    异常类 异常分为受检异常(checked exception)和非受检异常(unchecked exception...

  • Java 异常类 checked exception/unch

    Exception 异常 异常分类 1. 受检异常/不需要受检异常 checked exception/unc...

  • 异常捕获

    异常的类型:Exception(内建异常类)python中的异常都是继承自这个Exception而来的

  • java 异常

    java异常Throwable:1.Error 错误2.Exception 异常 Exception 1.运行时...

  • 2017-6-1

    ◉ exception 和 import*○ exception1.exception 作为所有异常的父类,多了 ...

  • 异常Exception

    异常处理: 用于提高系统的健壮性 Throwable的子类: Error类, 当程序出现错误, 系统会自动产生一个...

  • 异常Exception

    2019年11月27日 /usr/local/bin/python3.8 /Users/mac/Documents...

网友评论

      本文标题:scala(二十二) 异常(Exception)

      本文链接:https://www.haomeiwen.com/subject/hlwtultx.html