scala 中 何时使用scala try catch case

【scala】 scala 条件控制 和异常处理(二) - wolf_mountain - 博客园
花开不倦只为恋蝶香,人逢知己无奢望...
posts - 394, comments - 2, trackbacks - 0, articles - 0
1.scala 变量定义 ,var val 区别。
var 定义可变变量
val 定义不可变变量,scala 推荐使用。相当于Java的final 变量.
scala中包含的基本数据类型详情如下表所示:
序号基本类型增强类型大小取值范围
-128 ~ 127
-32768 ~ 32767
-2^31 ~ 2^31 -1
-2^63 ~ 2^63 -1
2.scala 条件控制 if else if &else&
3. for 增强和 yield类型推导
& to &,until 遍历集合的区别
4.scala 异常处理
try catch {case ex: Exception=& e}finally{}
5. 可变参数方法定义 &
参数类型* &*定义多个参数
6. def 方法定义的注意
def &方法名(参数):返回值={方法体}
返回值省略,默认 Any ,Any相当于java中的Object
object Control {
def main(args:Array[String]): Unit ={
// scala 尽量不用return,最后一个表达式的值 作为值返回
val b = if(a&7){val c=a+1;c+3} else if (a==5) 5 else 3
println(b)
//数组初始化
val c:Array[String]=Array("a","b","d")
//变量定义, 变量名:变量类型
val d:String = forAry(c)
println(d)
val result= sum(23,32,32,32,32)
println(" sum result :"+result)
// 将整个区间作为参数序列来处理 :_*
val newResult = sum(1 to 10:_*)
println("sum newResult: "+newResult)
//数组格式化输出 toBuffer
println(yieldAry().toBuffer)
println("--------------------")
exception()
* 遍历数组
* @param ary
def forAry(ary:Array[String]):String={
val newBuilder=new StringBuilder
// to 是 i到 区间,包含开始和结尾
for(i&-10 to ary.length-1){
newBuilder.append(ary.apply(i))
// unit 是 0 到 length-1 之间
for(i&-0 until ary.length){
newBuilder.append(ary.apply(i))
//普通遍历
for(a&-ary) println( a)
newBuilder.toString()
* yield 关键字 推导生成新的数组
Array[Int]
def yieldAry():Array[Int]={
val ary :Array[Int]= Array(1,32,3,31,43)
从 0 到 ary.length-1 之间的下标
for(i&-0 until ary.length){
val d:Int=ary.apply(i)
val e= d.*(122);
// println(e)
//yield 类型推导为Array
for(arg&-ary) yield arg *2
* 可变长参数定义 *
* @param args
def sum(args:Int*):Long={
var result : Long=0
//for 循环遍历
for(arg&-args){
result += arg
return result
* 数组过滤
def filter(): Unit ={
//定義一個數組
val ary =Array(12,2,12,43,2,12,1)
//去重 过滤
//保留符合条件的元素 _.%(2)==0 保留偶数,
// map(_*2) 是各个元素乘以 2
val a = ary.distinct.filter(_.%(2)==0).map(_*2)
println(a.toBuffer)
println(a.sum)//元素求和
* 异常处理
def exception():Unit={
//定义一个定长的数组
val ary = new Array[String](2)
ary(0)="1234e"
var it = -2
it = ary(0).toInt
case ex: FileNotFoundException =& it = 0
case ex: NumberFormatException =& it = 12
case ex:Exception =& it = -3
}finally {
println(it)用户名:luchunli1985
文章数:134
访问量:108720
注册日期:
阅读量:1297
阅读量:3317
阅读量:450213
阅读量:1134818
51CTO推荐博文
,好记性不如烂笔头Scala只内置了为数不多的几种程序控制语句:if , while, for, try, match等。1、判断(if)格式:if (A) B; else Cif (!A) Cpackage&com.lucl.scala
&*&@author&luchunli
object&IfControlStructure&{
&&//&返回类型是可选的,默认最后一行的值为返回值,Scala可以根据返回值推导出返回类型
&&def&getMax&(a&:&Int,&b&:&Int)&=&if&(a&&&b)&a&else&b;
&&//&未指定else实际上为:else&Unit,简写为()
&&def&getMin&(a&:&Int,&b&:&Int)&=&if&(a&&&b)&b;
&&def&main&(args&:&Array[String])&{
&&&&println(getMax(3,&5));&&&&//&5
&&&&println(getMin(5,&3));&&&&//&3
&&&&println(getMin(3,&5));&&&&//&()
}2、循环(while/do)package&com.lucl.scala
&*&@author&luchunli
object&WhileControlStructure&{
&&def&whileFunc&()&{
&&&&var&n&=&10;&&&&&&//&如果n&=&0,&不会有任何输出
&&&&while&(n&&&0)&{
&&&&&&print&(n&+&",&");
&&&&&&n&-=&1;
&&def&doWhileFunc&()&{
&&&&var&m&=&10;&&&&&&//&如果m&=&0,会输出一次0
&&&&&&print(m&+&",&");
&&&&&&m&-=&1;
&&&&}&while&(m&&&0);
&&def&main&(args&:&Array[String])&{
&&&&whileFunc();
&&&&doWhileF
&&&&var&line&=&"";
&&&&while&(line&==&"bye")&{
&&&&&&//&line&=&readLine&被标记为@deprecated,采用如下方式实现
&&&&&&line&=&StdIn.readL
&&&&&&//&......
}&&& 说明:&&&&&&& &&&&对于while循环如果是(line = readLine()) !=
"bye"的话是无法退出while循环的,因为赋值语句的返回结果(即line =
readLine()作为一个整体处理后的结果是Unit,然后再和bye进行比对)和字符串是不相等的。&&&&比如:var&y&=&2;
varl&x&=&y&=&1;&&&&&&&&//&此时y=1,&x=Unit(打印出来为())3、枚举(for)& & &Scala中没有Java中的for(;;)形式的循环,其格式为:&&&&for (i &- e) { E(i) }&&&&for (i &- e1; j &- e2; if ...) { E(i) }&&&&for (i &- e) yield E(i)&&&&&&&&// 生成集合&&&&其中 &C f的语法结构,在Scala中称为“生成器 (generator)”。&&&&For表达式能用任意条件进行各种形式枚举,而在枚举的过程中能实现绝大部分的循环功能而不必使用变量。&&&&遍历e中的元素,每次获取名为i的新值;对于每一次枚举,函数体E(i)都会被执行一次,而i在枚举时赋值。&&&&e可以是各种集合,包括数组、列、表达式等,或是有上下界的数值范围。package&com.lucl.scala
import&java.io.File
import&scala.io.StdIn
&*&@author&luchunli
object&ForControlStructure&{
&&def&main&(args&:&Array[String])&{
&&&&//&代码块
&&&&&&for&(i&&-&1&to&5)&print(i&+&",&");&&&&&&//&1,&2,&3,&4,&5,
&&&&&&//&指定步长
&&&&&&for&(i&&-&1&to&(5,&2))&print(i&+&",&");&//&1,&3,&5,&
&&&&&&for&(i&&-&1&until&5)&print(i&+&",&");&&&//&1,&2,&3,&4,&
&&&&&&for&(i&&-&1&to&3;&j&&-&1&to&3;&if&i&&&j)&print&(i&+&"-"&+&j&+&",&");
&&&&&&for&(i&&-&"hello")&&print(i&+&",&");&&//&h,&e,&l,&l,&o,&
&&&&//&代码块
&&&&&&var&array&=&Array("hello",&"world",&"!");
&&&&&&for&(arr&&-&array)&print(arr&+&"&");&&&&//&hello&world&!&
&&&&//&代码块
&&&&&&val&files&=&(new&File("D:\\LuclAppServ\\luchunli")).listF
&&&&&&for&(file&&-&&if&file.isFile()&&&&file.getName.endsWith(".gz"))&println(file)
&&&&//&代码块
&&&&&&//&生成新的集合
&&&&&&val&res&=&for&(i&&-&1&to&5)&yield&2&*&i;
&&&&&&println(res);&&&&//&Vector(2,&4,&6,&8,&10)
&&&&&&var&str&=&for&(i&&-&"hello".reverse)&yield&i;
&&&&&&println(str);&&&&//&olleh
}&4、break和continue&&& Scala的内置的控制结构时,没有提到使用break和continue,Scala提供了多种方法来替代break和continue的作用。一个简单的方法是使用一个if语句来代替一个continue,使用一个布尔控制量来去除一个break。&&&&下面的Java代码使用continue和break在循环结构中:int&i&=&0;
boolean&fonudIt&=&
while&(&i&&&args.length)&{
&&&&if&(args[i].startsWith("-"))&{
&&&&&&&&i&+=&1;
&&&&if(args[i].endsWith(".scala"))&{
&&&&&&&&foundIt&=&
&&&&i&+=&1;
}&&&&使用if和boolean变量,逐句将这段实现使用Scala来实现(不使用break和continue)如下:var&i&=&0;
var&foundIt&=&
while&(i&&&args.length&&&&
!foundId)&{
&&&&if&(!args(i).startsWith("-")&&&&
args(i).endsWith(".scala"))&{
&&&&&&&&foundIt&=&
}&&&&可以看到,使用if
(于前面continue条件相反)去掉了continue,而重用了foundIt布尔变量去掉了break。& &&5、匹配(match)&&& Scala的Match表达式支持从多个选择中选取其一,类似其它语言中的switch语句。&&&&通常来说,Scala的match表达式支持任意的匹配模式。a&match&{
&&&&case&e1&=&&E1&&&&&&&&//&匹配元素e1
&&&&case&e2&=&&E2&&&&&&&&//&匹配元素e2
&&&&case&_&&=&&Eo&&&&&&&&//&其他情况
#&给定类型
&&&&case&e1&:&String&:&E1
&&&&case&e2&:&Int&:&E2
&&&&case&_&:&E3
}&&& 和Java的switch相比有几点不同:&& &一、Java的case仅限于int或是枚举类型,Scala任何类型的常量都可以用在case语句中;&& &二、Java中每个case都必须有break,Scala每个case语句均无需使用break;&& &三、Java中缺省匹配为default,Scala的缺省匹配为”_”。package&com.lucl.scala
&*&@author&lucl
object&CaseControlStructure&{
&&def&caseMethod1&(name&:&String)&{
&&&&name&match&{
&&&&&&case&"human"&=&&println("human");
&&&&&&case&"animal"&=&&println("hahaha");
&&&&&&case&_&=&&println("unknown");
&&def&caseMethod2&(array&:&Array[Any])&{
&&&&for&(arg&&-&array)&{
&&&&&&arg&match&{
&&&&&&&&case&str&:&String&=&&println("The&string&with&value&"&+&str&+&".");
&&&&&&&&case&i&:&Int&=&&println("The&integer&with&value&"&+&i&+&".");
&&&&&&&&case&_&=&&println("Unknown&type.");
&&def&caseMethod3&(value&:&String)&:&String&=&{
&&&&value&match&{
&&&&&&case&"a"&=&&"All";
&&&&&&case&"o"&=&&"Oters";
&&&&&&case&_&=&&"unknown";
&&def&main(args:&Array[String]):&Unit&=&{
&&&&//&接收固定参数并判断
&&&&caseMethod1("human");
&&&&//&接收数组并判断参数类型
&&&&var&array&=&Array("hello",&1,&'c');
&&&&caseMethod2(array);
&&&&//&带有返回值
&&&&var&checkType&=&caseMethod3("a");
&&&&println(checkType);
}6、异常处理(throw/try)&&&&Scala的异常处理和其它语言比如Java类似。def&half&(n:Int)&:&Int&=&{
&&&if&(n&%&2&==&0)&{
&&&&&&&&n&/&2;
&&&&}&else&{
&&&&&&&&throw&new&RuntimeException("n&must&be&even");
}&&&&try-catch表达式的基本用法和Java一样,如果try块中代码在执行过程中出现异常,将逐个检测每个catch块。import&java.io.FileReader
import&java.io.FileNotFoundException
import&java.io.IOException
&&&&val&f&&=&new&FileReader("input.txt");
&&&&case&ex&:&FileNotFoundException&==&&//&handle&missing&file
&&&&case&ex&:&IOException&=&&//&handle&other&I/O&error
}&&&&Scala也支持finally语句,不管try块是否抛出异常,都会执行。&&&&try&{函数体}&catch&{case&...;&case&...}&finally&{A.close();}
//&通过异常赋值
def&f():Int&=&try{1}&finally&{2}
def&urlFor(path:String)&=
&&&&new&URL(path)
&&&&case&e:&MalformedURLException&=&&new&URL("http://www.scala-lang.org")
}本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)赞助商链接
Twiiter的中文版Scala教程:Scala课堂是Twitter启动的一系列讲座,用来帮助有经验的工程师成为高效的Scala 程序员。Scala是一种相对较新的语言,但借鉴了许多熟悉的概念。因此,课程中的讲座假设听众知道这些概念,并展示了如何在Scala中使用它们。我们发现这是一个让新工程师能够快速上手的有效方法。网站里的是伴随这些讲座的书面材料,这些文字材料本身也是很有用的。方法我们认为最有意义的教学方式是,不要把Scala看做是改进的Java,而是把它作为一门新的语言。所以这里不会介绍Java的使用经验,而将聚焦在解释器和“对象-函数式”的风格,以及我们的编程风格。特别强调了可维护性,清晰的表达,和利用类型系统的优势。大部分课程除了Scala的交互命令行之外不需要其他软件。我们鼓励读者按顺序学习,并且不仅限于此。让这些课程作为您探索Scala的起点吧!课程基础值,函数,类,方法,继承,try-catch-finally。面向表达式编程基础知识(续)样本类,对象,包,应用,更新,函数即对象(统一访问原则),模式匹配。集合列表,映射,功能组合(map, foreach, filter, zip, folds)模式匹配与函数组合更多函数!偏函数,更多模式匹配类型和多态基础基本类型和类型多态性,类型推断,变性,边界,量化高级类型高级类型,视界,更高级多态性类型,递归类型,结构类型简单构建工具关于SBT——标准的Scala构建工具更多的集合Scala Collections库指南使用specs测试Scala 并发编程Runnable, Callable, 线程, FuturesJava + ScalaJava跨平台交互:在Java中使用ScalaFinagle介绍Finagle原语:Future, Service, Filter, BuilderSearchbird利用Finagle构建一个分布式搜索引擎
这篇教程没有对Scala中经常使用的=&进行一个专门交代,这也是我开始研究Scala的迷惑之处。其实=&这体现了函数编程的主要风格。在这篇Scala课堂中找到第一涉及=&是匿名函数:scala& (x: Int) =& x + 1起初我以为(x: Int) =& x + 1 类似int x = x+1这个算式。其实不然,(x: Int) =& x + 1表示一个函数。如果把函数看成一个黑盒,那么黑盒有输入和输出,=&左边是输入参数,=&右边是输出,当然黑盒和输出混合在一起。教程中第二个出现=&是如下:{ i: Int =&
println("hello world")
i * 2}那么=&有没有官方名称,文档好像没有给出,这是属于整个函数编程的大范畴。有人解释=&为lambda的操作符,有人解释这是逻辑用语"意味"或“暗示”的意思。比如A与B进行逻辑相与意味着C ?A. ?B. ?C. ((A∧B)→C)→A→B→C何三个命题(A,B,C),那么A和B结合(逻辑与)暗示c蕴涵A蕴含B意味着C有些晕:关心的人挺多:讨论中有些人读“发射火箭”rocket意思,而逻辑上"implies意味/暗示"从中文也无法理解。再看: if i & 0 =& i - 1=&左边是一个判断,如果i&0,那么返回i-1。=&的 右边可以认为代表细节,代表函数体,代表ReturnValue is “右边”.如果熟悉javascript,比如定义一个函数:function abc(p1,p2){...}还有一种方式:var abc =(p1,p2){...}(p1,p2){..}写法就类似这里函数写法,中间加了=&,变成(p1,p2)=&{..},就不需要{}两对大括号,都代表同一个意思。以上是我个人理解。总之,这个Twitter推出的Scala教程好像应该是参考手册更合适,不是严格意义教程,无法帮助初学者带入Scala世界。推荐中文PPT:[该贴被banq于 17:20修改过]
我整理了一份Scala函数编程入门,搞定map和flatmap是关键,接下来的java8也会碰到:
赞助商链接
赞助商链接
最佳分辨率
OpenSource
Code & 2002-20您所在的位置: &
学习Scala:使用try-catch表达式处理异常
学习Scala:使用try-catch表达式处理异常
Martin Odersky等
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第七章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。
Scala的异常和许多其它语言的一样。代之用普通方式那样返回一个值,方法可以通过抛出一个异常中止。方法的调用者要么可以捕获并处理这个异常,或者也可以简单地中止掉,并把异常升级到调用者的调用者。异常可以就这么升级,一层层释放调用堆栈,直到某个方法处理了它或没有剩下其它的方法。
51CTO编辑推荐:
异常的抛出看上去与Java的一模一样。首先创建一个异常对象然后用throw关键字抛出:
throw&new&IllegalArgumentException&
尽管可能感觉有些出乎意料,Scala里, throw也是有结果类型的表达式。下面举一个有关结果类型的例子:
val&half&= &&&if&(n&%&2&==&0) &&&&&n&/&2&&&else&&&&&throw&new&RuntimeException("n&must&be&even") &
这里发生的事情是,如果n是偶数,half将被初始化为n的一半。如果n不是偶数,那么在half能被初始化为任何值之前异常将被抛出。因此,无论怎么说,把抛出的异常当作任何类型的值都是安全的。任何使用从throw返回值的尝试都不会起作用,因此这样做无害。
从技术角度上来说,抛出异常的类型是Nothing。尽管throw不实际得出任何值,你还是可以把它当作表达式。这种小技巧或许看上去很怪异,但像在上面这样的例子里却常常很有用。if的一个分支计算值,另一个抛出异常并得出Nothing。整个if表达式的类型就是那个实际计算值的分支的类型。Nothing类型将在以后的11.3节中讨论。
用来捕获异常的语法展示在代码7.11中。选择catch子句这样的语法的原因是为了与Scala很重要的部分:模式匹配:pattern matching保持一致。模式匹配是一种很强大的特征,将在本章概述并在第十五章详述。
import&java.io.FileReader &import&java.io.FileNotFoundException &import&java.io.IOException &try&{ &&val&f&=&new&FileReader("input.txt") &&&}&catch&{ &&case&ex:&FileNotFoundException&=&&&&case&ex:&IOException&=&&&} &
代码 7.11&Scala的try-catch子句
这个try-catch表达式的行为与其它语言中的异常处理一致。程序体被执行,如果抛出异常,每个catch子句依次被尝试。本例中,如果异常是FileNotFoundException,那么第一个子句将被执行。如果是IOException类型,第二个子句将被执行。如果都不是,那么try-catch将终结并把异常上升出去。
你将很快发现与Java的一个差别是Scala里不需要你捕获检查异常:checked exception,或把它们声明在throws子句中。如果你愿意,可以用ATthrows标注声明一个throws子句,但这不是必需的。
finally子句
如果想让某些代码无论方法如何中止都要执行的话,可以把表达式放在finally子句里。如,你或许想让打开的文件即使是方法抛出异常退出也要确保被关闭。代码7.12展示了这个例子。
import&java.io.FileReader &val&file&=&openFile() &try&{ &&&}&finally&{ &&file.close()&&} &
代码 7.12&Scala的try-finally子句
代码7.12展示了确保非内存资源,如文件,套接字,或数据库链接被关闭的惯例方式。首先你获得了资源。然后你开始一个try代码块使用资源。最后,你在finally代码块中关闭资源。这种Scala里的惯例与在Java里的一样,然而,Scala里你还使用另一种被称为贷出模式:loan pattern的技巧更简洁地达到同样的目的。
和其它大多数Scala控制结构一样,try-catch-finally也产生值。如,代码7.13展示了如何尝试拆分URL,但如果URL格式错误就使用缺省值。结果是,如果没有异常抛出,则对应于try子句;如果抛出异常并被捕获,则对应于相应的catch子句。如果异常被抛出但没被捕获,表达式就没有返回值。由finally子句计算得到的值,如果有的话,被抛弃。通常finally子句做一些清理类型的工作如关闭文件;他们不应该改变在主函数体或try的catch子句中计算的值。
import&java.net.URL &import&java.net.MalformedURLException &def&urlFor(path:&String)&= &&try&{ &&&new&URL(path) &&}&catch&{ &&&case&e:&MalformedURLException&=& &&&&new&URL("http://www.scalalang.org") &&} &
代码 7.13&能够产生值的catch子句
如果熟悉Java,不说你也知道,Scala的行为与Java的差别仅源于Java的try-finally不产生值。Java里,如果finally子句包含一个显式返回语句,或抛出一个异常,这个返回值或异常将“凌驾”于任何之前源于try代码块或某个它的catch子句产生的值或异常之上。如:
def&f():&Int&=&try&{&return&1&}&finally&{&return&2&} &
调用f()产生结果值2。相反:
def&g():&Int&=&try&{&1&}&finally&{&2&} &
调用g()产生1。这两个例子展示了有可能另大多数程序员感到惊奇的行为,因此通常最好还是避免从finally子句中返回值。最好是把finally子句当作确保某些副作用,如关闭打开的文件,发生的途径。
【相关阅读】
【责任编辑: TEL:(010)】
关于&&的更多文章
Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
讲师: 15人学习过讲师: 36人学习过讲师: 15人学习过
从2006年12月份Sun发布Java 6后,经过五年多的不懈努
借助Google的三大论文,Hadoop打开了低成本海量数据处
春运大军前天正式启动了。昨天的新闻有几条不怎么好的
本书是关于Acegi、CAS的权威教程,是Java/Java EE安全性开发者的必备参考书。无论是Java EE安全性编程模型的背景和基础知识,还
51CTO旗下网站}

我要回帖

更多关于 c try catch的使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信