Java 进阶 & return,break,continue用法总结

Java中return的作用

Java编程思想:第四版》介绍:return语句作为一个无条件的分支,无需判断条件即可发生。

return语句主要有两个用途:一是用来表示一个方法返回的值(假定没有void返回值)。二是指它导致该方法退出,并返回那个值。根据方法的定义,每一个方法都有返回类型,返回类型可以是基本类型或引用类型。同时每个方法都必须有个结束标志,因此,就出现了return。当方法的返回类型为void时,有个隐含的return语句,可以省略不写。

return语句和其他控制结束语句的区别

Java中结束语句主要有四类:return,break,continue。

(1)return语句:是指结束该方法,继续执行方法后的语句。

(2)break语句:是指在循环中直接退出循环语句(for,while,do-while,foreach),break之后的循环体里面的语句也执行。

(3)continue语句:是指在循环中中断该次循环语句(for,while,do-while,foreach),本次循环体中的continue之后语句不执行,直接跳到下次循环。

java中break和continue可以跳出指定循环,break和continue之后不加任何循环名则默认跳出其所在的循环,在其后加指定循环名,则可以跳出该指定循环(指定循环一般为循环嵌套的外循环)。

break在for循环语句中的使用

使用break的场景有两种:一、switch语句中。二、循环语句。

这里主要说一下break在循环中的应用。

first:for(int j=0; j<5; j++){
    second:for(int i=0; i<5; i++){
        if(i == 0){
            System.out.println(i);
            break first;
        }
    }
    System.out.println("跳出1层for循环到这啦");
    if(j == 0){
        System.out.println("终结者");
        break;
    }
}
image.gif

输出结果:0

首先 外层循环 j=0,进入内层循环 i=0,此时输出i的值为0。跳出外层循环,所以外层循环中后面的输出语句及判断j=0的语句都不会执行。

 loop1:for(int x = 0; x < 4; x++)
        {
            loop2:for (int y = 0; y < 5 ; y++ )
            {
                System.out.println("x="+x+",y="+y);
                if (y==2)
                {
                    break loop1;
                }
            }
        }
image.gif
x=0,y=0
x=0,y=1
x=0,y=2

image.gif

continue在for循环语句中的使用

****continue跳出指定循环示例代码:****

loop1:for(int x = 0; x < 4; x++)
        {
            loop2:for (int y = 0; y < 5 ; y++ )
            {    if (x==2)
                {
                    continue loop1;
                }
                System.out.println("x="+x+",y="+y);
            }
        }
image.gif

输出结果

x=0,y=0
x=0,y=1
x=0,y=2
x=0,y=3
x=0,y=4
x=1,y=0
x=1,y=1
x=1,y=2
x=1,y=3
x=1,y=4
x=3,y=0
x=3,y=1
x=3,y=2
x=3,y=3
x=3,y=4

image.gif

return在try-catch-finally语句中的使用

若在 try或catch语句里面有return语句,finally语句和return语句的执行顺序问题:

若有finally语句,则无论如何,都会执行该语句,在try或catch中的return语句会将它的返回值压入栈内,然后执行finally语句。

当finally执行完成后,若finally语句里有return语句,则执行return语句并结束。

若finally没有return语句,则返回被保存的栈里的return语句,再执行。

在压栈时候,要注意压入栈内的值的类型,若是引用类型则引用的值会改变(如下面的案例3),若是变量值,则不会改变(如下面的案例1)。

案例1

public class TestFinally1 {
    public static void main(String[] args) {
        System.out.println("test1:" + testFinally1());
    }

    static int testFinally1() {
        int i = 1;
        try {
            return i;
        } finally {
            System.out.println("in testFinally1():finally 肯定执行");
            i = 48;
        }
    }
}
image.gif

在testFinally1()中,return i;会将结果i的值,也就是1压入栈。

即使在finally中将i修改了(i=48),也不回对已经压入栈里的1造成任何影响。

输出结果

in testFinally1():finally 肯定执行
test1:1
image.gif

案例2

public class TestFinally2 {
    public static void main(String[] args) {
        System.out.println("test2:" + testFinally2());
    }

    static String testFinally2() {
        String str = "try";
        try {
            return str;
        } finally {
            System.out.println("in testFinally2():finally 肯定执行");
            str = "finally";
        }
    }
}
image.gif

在testFinally2()中,return str;将str的内容压入栈,假设str的内容为0x108(只是一个地址值),通过这个地址值可以找到"try",那栈里的内容就是0x108。执行str = "finally",此时str变量的内容可能变为0x237了,这是串"finally"的地址。

方法调用结束后,return时压入栈里的0x108。所以在打印结果时,打印的是通过0x108找到的字符串"try"。

输出结果

in testFinally2():finally 肯定执行
test2:try
image.gif

案例3

public class TestFinally3 {
    public static void main(String[] args) {
        System.out.println("test3:" + testFinally3());

    }

    static StringBuilder testFinally3() {
        StringBuilder build = new StringBuilder("try ");
        try {
            return build;
        } finally {
            System.out.println("in testFinally3():finally 肯定执行");
            build.append("finally");
            build = new StringBuilder("你猜我是谁!");
        }
    }
}
image.gif

在testFinally3 ()中,return 压栈的是build变量的值,比如是0x3579,通过这个值可以找到StringBuilder对象。

finally语句块中对这个对象的内容进行了修改。build = new StringBuilder("你猜我是谁!");让build变量指向了一个新的对象,这时候build的值可能是0x4579了。但是,原来的StringBuilder对象仍然在0x3579处,而压栈的正是0x3579啊!方法返回后,得到的返回值0x3579,通过这个引用值找到相应的StringBuilder对象,所以打印的结果是test3:try finally。

输出结果

in testFinally3():finally 肯定执行
test3:try finally
image.gif

案例4

public class TestFinally4 {
    public static void main(String[] args) {
        System.out.println("test4:" + testFinally4());
    }

   static String testFinally4() {
        try {
            return "return in try";
        } finally {
            System.out.println("in testFinally4():finally 肯定执行");
            return "return in finally";
        }
    }
}
image.gif

在testFinally4()中,finally有return语句,直接返回,方法结束。

输出结果

in testFinally4():finally 肯定执行
test4:return in finally
image.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容