ad

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.8.5 多重选择: switch语句

admin 147 2023-10-25

【摘要】 本书摘自《Java核心技术》一书中第3章,第8节,作者是来自美国的凯·S.霍斯特曼(Cay S.Horstmann),由林琪、苏钰涵等译。

3.8.5 多重选择: switch语句

在处理多个选项时,使用if/else结构显得有些笨拙。 Java 有 一 个与C/C++ 完全一样的 switch语句。

例如,如果建立一个如图3- 13所示的包含4个选项的菜单系统,可以使用下列代码:

Scanner in = new Scanner(System.in);

System,out.print("Select an option (1, 2,3, 4)");

阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_3.8.5 多重选择: switch语句

switch(choice)

{

case 1:

break;

case 2:

break;

case 3:

break;

case 4:

break;

default:

// bad input

break;

}

switch语句将从与选项值相匹配的 case标签开始执行,直到遇到 break语句,或者执行 到 switch语句的结束处为止。如果没有相匹配的 case标签,而有 default子句,就执行这个 子句。

警告: 有可能触发多个 case 分支。如果在case 分支语句的末尾没有break 语句,那么 就会接着执行下一个case分支语句。这种情况相当危险,常常会引发错误。为此,我 们在程序中从不使用 switch语句。

如果你比我们更喜欢switch语句,编译代码时可以考虑加上-Xuint:fallthrough 选

项,如下所示:

javac -XLint:fallthrough Test.java

这样一来,如果某个分支最后缺少一个break语句,编译器就会给出一个警告消息。

如果你确实正是想使用这种“直通式”(fallthrough)行为,可以为其外围方法加一 个注解 QSuppressWarnings("fallthrough")。 这样就不会对这个方法生成警告了。(注解是为编译器或处理Java 源文件或类文件的工具提供信息的一种机制。我们将在卷Ⅱ的第8 章中详细讨论注解。)

case 标签可以是:

● 类型为 char、byte、short 或 int 的常量表达式。

● 枚举常量。

● 从 Java7 开始, case 标签还可以是字符串字面量。

例如:

String input =...;

switch (input.toLowercase())

{

case "yes":// 0K since Java 7

break;

当在 switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由 switch的表 达式值推导得出。例如:

Size

sz=..;

switch (sz)

{

case SMALL:// no need to use Size.SMALL

break;

3.8.6 中断控制流程的语句

尽管Java 的设计者将goto作为保留字,但实际上并没有打算在语言中使用它。通常,使 用goto语句被认为是一种拙劣的程序设计风格。当然,也有一些程序员认为反对 goto的呼 声似乎有些过分(例如, Donald Knuth 就曾写过一篇名为《Structured Programming with goto statements》 的著名文章)。这篇文章说,无限制地使用 goto语句确实很容易导致错误,但在 有些情况下,偶尔使用goto跳出循环还是有益处的。 Java设计者同意这种看法,甚至在Java 语言中增加了一条新的语句:带标签的break, 以此来支持这种程序设计风格。

下面首先看一下不带标签的 break语句。与用于退出 switch 语句的 break 语句一样,它也 可以用于退出循环语句。例如,

while (years <= 100)

balance += payment;

double interest = balance * interestRate / 100;

balance += interest;

if (balance >= goal) break;

years++;

}

在循环开始时,如果 years>100, 或者在循环体中 balance2goal, 则退出循环语句。当然, 也可以在不使用 break 的情况下计算 years的值,如下所示:

while (years <= 100 & balance < goal)

{

balance += payment;

double interest = balance * interestRate / 100;

balance += interest;

if (balance < goal)

years++;

}

但是需要注意,在这个版本中,检测了两次 balance

与C++ 不同, Java还提供了一种带标签的break语句,用于跳出多重嵌套的循环语句。 有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时可能更加希望完全跳出 所有嵌套循环之外。如果只是为各层循环检测添加一些额外的条件,这会很不方便。

这里有一个示例说明了break语句的工作状态。请注意,标签必须放在希望跳出的最外 层循环之前,并且必须紧跟一个冒号。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.1.2 对象
下一篇:阅读《Java核心技术》卷1 基础知识_更了解Java的奥妙_4.5 方法参数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×