当前位置: 首页 > 科技观察

Groovygrammar-controlstructure-if,switch,for,try等知识

时间:2023-03-18 01:31:14 科技观察

1.本文内容为Groovy学习第30篇。从本文中,您将学习到Groovy语法中的控制结构,例如:if/else、switch/case、try/cathc等。2.控制结构控制结构是指为解决某个问题而按一定顺序执行的一系列动作。最基本的控制结构分为:序列、选择、循环。2.1条件控制structuresGroovy中的条件控制语句与java中的相同,也是if-else和switch-case2.1.1if-else语句Groovy支持Java中常见的if-else语法。实现示例如下:defx=falsedefy=falseif(!x){x=true}printlnx//输出trueif(x){x=false}else{y=true}printlnx//输出falseprintlny//output:false也支持常见的ifelseif嵌套格式:if(...){...}elseif(...){...}else{...}2.1.2switch-case语句Groovy中的switch语句向后兼容Java代码;因此,您可以在多个匹配案例中共享相同的代码。不过,一个区别是Groovyswitch语句可以处理任何类型的switch值,并且可以执行不同类型的匹配。这是一个例子:defx=1.23defresult=""switch(x){case"foo":result="foundfoo"//让我们通过case"bar":result+="bar"case[4,5,6,'inList']:result="list"breakcase12..30:result="range"breakcaseInteger:result="integer"breakcaseNumber:result="number"breakcase~/fo*/://x的toString()表示与模式匹配?result="fooregex"breakcase{it<0}://or{x<0}result="negative"breakdefault:result="default"}printlnresult//output:numberSwitch支持以下比较:如果switch的值是一个类的实例,则类case值匹配。如果switch值的toString()表示与正则表达式匹配,则正则表达式大小写值匹配。如果switch值包含在集合中,则集合case值匹配。这也包括范围(因为它们是列表)。如果根据Groovytruth调用闭包返回的结果为真,则闭包case值匹配。如果以上均未使用,则case值与switch值相等时匹配。当使用闭包case值时,默认的it参数实际上是switch值(在我们的例子中是变量x)。Groovy还支持switch表达式,如下例所示:defpartner=switch(person){case'Romeo'->'Juliet'case'Adam'->'Eve'case'Antony'->'Cleopatra'case'Bonnie'->'Clyde'}2.2循环结构简单介绍几种必须掌握的常见循环结构,如for、while、dowhile结构的写法。2.2.1for循环语句Groovy支持标准Java或C语言的for循环:Stringmessage=''//Createavariable//Createavalue通过4次for循环。for(inti=0;i<4;i++){message+='zinyan'}prinlntmessage//Output:zinyanzinyanzinyanzinyan还支持使用逗号分隔表达式的Java经典for循环的更复杂形式。示例:deffacts=[]defcount=5for(intfact=1,i=1;i<=count;i++,fact*=i){facts<0){x++}printlnx//输出5.注意while循环方法的条件如果没有正确创建,很容易死循环,即一个无限循环。因为如果while的条件一直为真,while不会退出。2.2.3do..while循环语句与while相同,groovy中的do...while循环语句与java中的实现相同。defcount=5deffact=1do{fact*=count--}while(count>1)printlnface//Output:1203Exception——异常处理其实是一种控制结构。程序的执行顺序因异常而强制终止。Groovy没有专门的异常处理机制,它的Exception和Java是一样的。3.1try..catch和finally语句可以指定一组完整的try-catch-finally、try-catch或try-finally块。PS:如果对try块完全不了解,建议查询java中异常捕获机制try结构的使用。try语句简单的理解就是当某段代码出现异常时防止程序崩溃。我们主动防御。它是通过使用try语句实现的。catch只是我们需要程序在异常发生后执行的东西。如果没有异常,代码会自动按顺序执行(ps:cath中的代码不会执行)。一个简单的例子如下:try{'zinyan'.toLong()//将字符串转为long也会引发数据类型转换异常assertfalse//assert断言必须为真,为假则抛异常occur}catch(e){asserteinNumberFormatException}如果您希望无论是否发生异常都执行代码。并根据异常或非异常结果进行计算和执行。那么我们就可以使用finally子句了,因为不管try子句中的代码是否抛出异常,finally子句中的代码都会一直执行。这是一个例子:defztry{defi=7,j=0try{defk=i/jassertfalse//由于前一行的异常而从未达到}finally{z='reachedhere'//总是执行甚至ifExceptionthrown}}catch(e){asserteinArithmeticExceptionassertz=='reachedhere'}3.2多个catch子句使用多个catch块(自Groovy2.0起),我们可以定义多个被同一个catch块处理的exceptions:try{/*...*/}catch(IOException|NullPointerExceptione){/*一个block处理2个异常*/}3.3ARMTryresources对于自动资源管理(ARM),Groovy通常是Java7的try-with-resources语句提供了一个更好的选择。现在,迁移到Groovy并仍然希望使用旧样式的Java程序员支持这种语法:{super(input.toLowerCase().bytes)}}classToResourceextendsByteArrayOutputStream{@Overridevoidclose()throwsIOException{super.close()println"ToResourceclosing"}}defwrestle(s){try(FromResourcefrom=newFromResource(s)ToResourceto=newToResource()){to<a*b+1}assertcalc(x,y)==[x,z].sum()我们执行上面的代码后会输出:Caught:Assertionfailed:assertcalc(x,y)==[x,z].和()|||||||1527|257falseAssertion失败:assertcalc(x,y)==[x,z].sum()|||||||1527|257falseatzinyan.run(zinyan.groovy:5)如果您不想要像上面那样漂亮的打印错误消息,您可以通过更改断言的可选消息部分来回退到自定义错误消息,例如以下示例:defx=2defy=7defz=5defcalc={a,b->a*b+1}assertcalc(x,y)==z*z:'Incorrectcomputationresult'将输出以下错误:捕获:java.lang.AssertionError:计算结果不正确。表达式:(calc.call(x,y)==(z*z))。值:z=5,z=5java.lang.AssertionError:Incorrectcompu化结果。表达式:(calc.call(x,y)==(z*z))。值:z=5,z=5在zinyan.run(zinyan.groovy:5)5。Label声明任何语句都是Labels可以与不影响代码语义的标签相关联,并且可以用来使代码更易于阅读,如下例所示:given:defx=1defy=2when:defz=x+ythen:assertz==3zinyan:println"zinyan.com"上面的例子中,given,when,then,zinyan都是标签。这些标签不会影响代码的运行结果和逻辑。标签没有特殊关键字,标签名称可以自由定义。标签可以在中断指令中用作跳转的目标,尽管标签语句的语义没有改变。例子如下:for(inti=0;i<10;i++){for(intj=0;j