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