语法处理上和Java类似,但是又不尽相同
java中异常的处理方式:
代码语言:javascript复制1.捕获异常: try{..}catch(..){..} finally{...} 2.抛出异常: 1.在方法体中通过throw关键字抛出 2.在方法名后面通过throws关键字声明异常
try{
// 业务代码
}case (异常类型1){
// 异常处理
}case (异常类型2){
// 异常处理
}
... //可以有多个 case
finally{
// 无论如何都需要执行的代码
}
scala中异常的处理方式:
代码语言:javascript复制1.捕获异常: 1.try{...}catch{case e:Exception=> ...} finally{..} 2.Try(代码块).getOrElse(默认值) [如果代码执行成功则返回执行结果,如果代码执行失败则返回默认值] 【工作常用】 2.抛出异常: 在方法体中通过throw关键字抛出 【工作不用】
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
除去为空的数据
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)
打印
代码语言:javascript复制println(sum) // 143
println(s"平均年龄:${sum/list.length}") // 平均年龄:23
除了使用 try{...}catch{case e:Exception=> ...} finally{..}
的方式,还有第二种方式Try
。
位于 scala.util 包下
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
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中异常部分,就这么点内容,比较简单;若有什么每补充到的