尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使用了相同的机制:标签。
“标签”是后面跟一个冒号的标识符,就象下面这样:
label1:
对Java来说,唯一用到标签的地方是在循环语句之前。进一步说,它实际需要紧靠在循环语句的前方——在标签和循环之间置入任何语句都是不明智的。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环或者一个开关。这是由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。如下所示:
label1:
外部循环{
内部循环{
//...
break; //1
//...
continue; //2
//...
continue label1; //3
//...
break label1; //4
}
}
在条件1中,break中断内部循环,并在外部循环结束。在条件2中,continue移回内部循环的起始处。但在条件3中,continue label1却同时中断内部循环以及外部循环,并移至label1处。随后,它实际是继续循环,但却从外部循环开始。在条件4中,break label1也会中断所有循环,并回到label1处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。
下面是for循环的一个例子:
//: LabeledFor.java
// Java’s "labeled for loop"
public class LabeledFor {
public static void main(String[] args) {
int i = 0;
outer: // Can't have statements here
for(; true ;) { // infinite loop
inner: // Can't have statements here
for(; i < 10; i++) {
prt("i = " + i);
if(i == 2) {
prt("continue");
continue;
}
if(i == 3) {
prt("break");
i++; // Otherwise i never
// gets incremented.
break;
}
if(i == 7) {
prt("continue outer");
i++; // Otherwise i never
// gets incremented.
continue outer;
}
if(i == 8) {
prt("break outer");
break outer;
}
for(int k = 0; k < 5; k++) {
if(k == 3) {
prt("continue inner");
continue inner;
}
}
}
}
// Can't break or continue
// to labels here
}
static void prt(String s) {
System.out.println(s);
}
} ///:~
这里用到了在其他例子中已经定义的prt()方法。
注意break会中断for循环,而且在抵达for循环的末尾之前,递增表达式不会执行。由于break跳过了递增表达式,所以递增会在i==3的情况下直接执行。在i==7的情况下,continue outer语句也会到达循环顶部,而且也会跳过递增,所以它也是直接递增的。
下面是输出结果:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
如果没有break outer语句,就没有办法在一个内部循环里找到出外部循环的路径。这是由于break本身只能中断最内层的循环(对于continue同样如此)。
当然,若想在中断循环的同时退出方法,简单地用一个return即可。
下面这个例子向大家展示了带标签的break以及continue语句在while循环中的用法:
//: LabeledWhile.java
// Java's "labeled while" loop
public class LabeledWhile {
public static void main(String[] args) {
int i = 0;
outer:
while(true) {
prt("Outer while loop");
while(true) {
i++;
prt("i = " + i);
if(i == 1) {
prt("continue");
continue;
}
if(i == 3) {
prt("continue outer");
continue outer;
}
if(i == 5) {
prt("break");
break;
}
if(i == 7) {
prt("break outer");
break outer;
}
}
}
}
static void prt(String s) {
System.out.println(s);
}
} ///:~
同样的规则亦适用于while:
(1) 简单的一个continue会退回最内层循环的开头(顶部),并继续执行。
(2) 带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环。
(3) break会中断当前循环,并移离当前标签的末尾。
(4) 带标签的break会中断当前循环,并移离由那个标签指示的循环的末尾。
这个方法的输出结果是一目了然的:
Outer while loop
i = 1
continue
i = 2
i = 3
continue outer
Outer while loop
i = 4
i = 5
break
Outer while loop
i = 6
i = 7
break outer
大家要记住的重点是:在Java里唯一需要用到标签的地方就是拥有嵌套循环,而且想中断或继续多个嵌套级别的时候。
在Dijkstra的“Goto有害”论中,他最反对的就是标签,而非goto。随着标签在一个程序里数量的增多,他发现产生错误的机会也越来越多。标签和goto使我们难于对程序作静态分析。这是由于它们在程序的执行流程中引入了许多“怪圈”。但幸运的是,Java标签不会造成这方面的问题,因为它们的活动场所已被限死,不可通过特别的方式到处传递程序的控制权。由此也引出了一个有趣的问题:通过限制语句的能力,反而能使一项语言特性更加有用。
分享到:
相关推荐
在JSP页面中,Java标签库扮演着至关重要的角色,它允许开发者使用预先定义好的标签执行各种操作,例如数据输出、流程控制、迭代处理以及异常处理等。 JSP自带的核心标签库中,包含了许多用于简化Web开发的标签。...
Java标签库(Java Tag Library,JSTL)是Java服务器端开发中的一个重要组成部分,它提供了一组预定义的标签,用于简化JSP页面的编写,提高代码的可读性和可维护性。Java标签架包通常包含多个核心标签库,如JSTL Core...
Java标签库,也被称为JSP标准标签库(JSTL),是Java服务器页面(JSP)技术的一个重要组成部分,主要用于简化JSP开发,提高代码的可读性和可维护性。对于初学者来说,掌握如何创建和使用自定义标签库是进阶到更高级...
总的来说,理解Java标签的制作涉及到对Java Swing组件的理解,包括如何创建、设置属性、布局管理,以及如何利用各种工具进行开发和调试。通过深入学习和实践,你可以创建出功能丰富的用户界面。
Java标签库(Java Tag Libraries,JTL)是JavaServer Pages(JSP)技术的一个重要组成部分,主要用于增强JSP页面的功能性和可维护性。在给定的压缩包文件"jakarta-taglibs-standard-1.1.2"中,我们找到了一个标准的...
Java标签在Web开发中起着至关重要的作用,它们简化了HTML和...同时,随着前端技术的发展,像React和Vue.js这样的现代框架也开始在Java后端驱动的Web应用中占据一席之地,但传统的Java标签依然在许多项目中被广泛使用。
在Web开发领域,JavaScript、CSS、HTML以及Java标签是构建网页和交互式应用程序的基础。这四部分技术的熟练掌握对于任何前端或全栈开发者都至关重要。以下是对这四部参考手册内容的详细概述: 1. **JavaScript中文...
根据给定文件的内容,以下是对Java标签库(Taglib)的知识点进行详细介绍: ### 标签库简介 Java标签库是一系列可以嵌入到JSP页面中使用的自定义标签集合。通过标签库,开发人员可以创建可重用的代码片段,提高...
Java标签库存是一个非常实用的工具,它为开发者提供了一种高效的方式来处理数据库资源,从而显著减少代码量。在Java开发中,特别是在Web应用领域,处理数据库连接、查询、操作等任务是必不可少的。传统的做法是手动...
java标签库
Java标签实现的分页功能是Web开发中常见的一种技术,主要应用于大数据量的展示场景,如搜索结果、用户评论等。在Java环境下,我们通常使用自定义标签库(Tag Library)来实现这样的功能,以便让页面更加简洁,提高...
Java标签版MiniuiDemo是一个基于Java的Web开发框架,它主要使用了MiniUI库来创建用户界面。MiniUI是一款轻量级的前端组件库,专为Java Web开发者设计,旨在提高开发效率,提供美观且响应式的用户界面。在这个Demo中...
本项目专注于利用Java语言来实现斑马打印机的标签打印功能,且支持中文字符的打印,这对于需要中文标签的企业来说至关重要。 首先,我们要了解Java与硬件交互的基本原理。Java本身并不直接支持硬件操作,但可以通过...
Java Web标签大全涵盖了许多用于构建动态Web应用程序的关键技术,这些技术包括Struts 2、Struts 1(Bean、HTML和Logic标签)、JSTL、JSP、Spring以及AJAX。下面将对这些标签和框架进行详细介绍。 1. **Struts 2标签...
使用的是TSC TX600打印机,使用别的打印机也一样只要装有驱动电脑能识别到打印机,设置好打印尺寸就可以打印,打印材料根据打印机选择,亚银纸,硬质类标签纸都可以。里面有源码、操作说明书,驱动等文件。JDK太大了...
本案例中的"Java客户端与支持TSPL2的标签打印机进行通信(通过TSC)"是一个Java库,专为与使用TSPL2指令集的TSC品牌标签打印机建立连接和交互而设计。TSPL2是一种高级的打印机语言,由TSC Auto ID Technology公司...
Java自定义标签是一种扩展JSP页面功能的方式,它允许开发者创建可重用的组件,使得在JSP页面中处理业务逻辑或展现复杂视图变得更加简便。在这个“java自定义标签分页”主题中,我们将深入探讨如何利用自定义标签来...
JavaServer Pages Standard Tag Library(JSTL)是Java EE中用于增强JSP页面功能的一组标准标签库。它提供了一种高效、与视图技术无关的方式来处理常见的JSP任务,如迭代、条件判断、XML处理、国际化和URL操作等。...
在Java Web开发中,自定义标签(Custom Tags)是一种强大的工具,它允许开发者创建可重用的组件,提高代码的可读性和维护性。自定义标签是JSP(JavaServer Pages)规范的一部分,通过扩展JSP语法,可以构建出符合...