Scala控制结构和异常

1 条件表达式

Scala中的 if else 语句和java中的一样,不过Scala中的if else有值,这个值就是跟在if else后面的值

object ScalaActivi extends App{
  val x = 10
  val s = if (x > 0) 1 else -1
  println(s)
}

上面语句的val s = if (x > 0) 1 else -1等同于 if (x > 0) s = 1 else s = -1
第一种写法是优于第二种写法的,因为第一种写法可以用来初始化一个val,而第二种写法必须是var

在Scala中,每个表达式都有一个类型,混合类型表达式比如:

val s1: Any = if (x > 0) "正" else -1

类型是Any类型,这是因为其中一个分支是java.lang.String,而另一个分支是Int类型,他们的公共超类型叫Any

2 块表达式

Scala中,{}包含一系列的表达式,其结果也是一个表达式,块中最后一个表达式的结果就是块的值

private val d: Double = {
    val dx = x - x0;
    val dy = y - y0;
    scala.math.sqrt(dx * dx + dy * dy)

  }

表达式的值scala.math.sqrt(dx * dx + dy * dy)就是块的值

赋值动作本身没有值,或者说它们的值是Unit类型,如果块中的最后一个表达式没有返回值,则块的返回值是 Unit 类型。

scala> val result ={ val a = 1 + 1; val b = 2 + 2 }
result: Unit = ()

3 循环表达式

3.1 while循环

Scala 语言中 while 循环的语法:

while(condition)
{
   statement(s);
}

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。

  // 局部变量
  var a = 10;

  // while 循环执行
  while( a < 20 ){
    println( "Value of a: " + a );
    a = a + 1;

}
Value of a: 10
Value of a: 11
Value of a: 12
Value of a: 13
Value of a: 14
Value of a: 15
Value of a: 16
Value of a: 17
Value of a: 18
Value of a: 19
3.2 do…while循环

不像 while 循环在循环头部测试循环条件, Scala 语言中,do…while 循环是在循环的尾部检查它的条件。

do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。

do {
   statement(s);
} while( condition );

条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。如果条件为 true,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为 false 为止。

 do{
      println( "Value of a: " + a );
      a = a + 1;
    }while( a < 20 )

输出结果为

Value of a: 10
Value of a: 11
Value of a: 12
Value of a: 13
Value of a: 14
Value of a: 15
Value of a: 16
Value of a: 17
Value of a: 18
Value of a: 19
3.3 for循环

for循环的基本使用

object ScalaApp extends App {

  // 1.基本使用  输出[1,9)
  for (n <- 1 until 10) {print(n)}

  // 2.使用多个表达式生成器  输出: 11 12 13 21 22 23 31 32 33
  for (i <- 1 to 3; j <- 1 to 3) print((10 * i + j)+" ")

  // 3.使用带条件的表达式生成器  输出: 12 13 21 23 31 32
  for (i <- 1 to 3; j <- 1 to 3 if i != j) print((10 * i + j)+" ")

}

除了基本使用外,还可以使用 yield 关键字从 for 循环中产生 Vector,这称为 for 推导式。

scala> for(i <- 1 until 10) yield i+3
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(4, 5, 6, 7, 8, 9, 10, 11, 12)

4 异常处理

Scala和 Java 中一样,支持 try...catch...finally 语句。并且抛出的对象时java.lang.Throwable的子类,不过和java不同的是,Scala中没有受检异常。
异常的工作方式和java基本一样,不同的是我们可以在catch语句中使用模式匹配,下列异常处理代码整合了模式匹配

object ExceptionApp extends App{
    val file =""
  try {
    //open file
    //usr file
    val i = 10/0
    println(i)
  }catch {
  //如果不需要使用捕获的异常对象,可以用_代替
    case _:ArithmeticException=>println("除数不能为0")
    case e:Exception=>println(e.getMessage)
  }finally {
    //释放资源 close file

  }


}
输出结果:除数不能为0

这里需要注意的是因为 finally 语句一定会被执行,所以不要在该语句中返回值,否则返回值会被作为整个 try 语句的返回值,如下:

scala> def g():Int = try return 1 finally  return  2
g: ()Int

// 方法 g() 总会返回 2
scala> g()
res3: Int = 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sisi.li8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值