|
|
一、switch语句的使用) n& |& j* {) Z, f: d
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
9 T; H' @% w5 c7 _, C6 X; l' m
' A' }( p- Q; C! U" {原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始9 q+ C* N/ ^4 [' f; F
6 G# }! w- F1 o! {4 x类型:字符,字节,短,和整数(在数字和字符串的讨论)。% N# I2 F3 \" F5 S& Q# n
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
. s6 X3 O2 a# l1 j6 J0 q
+ _9 X9 Y2 v. f,使用switch语句。) H$ E S* W/ M) r% k. W: X- I
public class SwitchDemo {
& H: J7 C: L& D: I public static void main(String[] args) {7 e. o7 @- c' D% T" U
8 ?2 R% k! O1 ~# L int month = 8;
: {) a) ]8 G% _9 ? String monthString;6 \# j, q) |6 r ?
switch (month) {
& D" \, m/ Y) |; O case 1: monthString = "January";9 A2 C4 o4 x# ^1 n4 N7 f3 r
break;
. x% q: r4 X' W* X# z! L& x7 O case 2: monthString = "February";
0 p: D4 P$ h; ?2 O break;* ]* S4 c# L# L3 h
case 3: monthString = "March";
$ A3 [8 }: t" H1 {$ | break;7 _4 z" b, x) [* c J
case 4: monthString = "April";8 a1 T# Z8 l! r2 i' t/ ?
break;4 Y1 e* g- Q f( C2 Q9 a; G
case 5: monthString = "May";- T0 u# d5 I6 x/ ^! R" L, R
break;
+ n1 G+ ?% z3 Y+ u0 Y case 6: monthString = "June";6 T% R! Q7 R! C5 j1 |$ D
break;* b" h- Z; @& T; `
case 7: monthString = "July";
" z+ O: J, e( Y' a% O break;
) Y& R$ V9 S1 W$ q2 P1 l; b case 8: monthString = "August";: S, {- `; |* j. R1 e7 ]- ]( E
break;
+ i% U5 G2 H& s9 Z) q- t# m case 9: monthString = "September";
, Q/ y- J$ r% g# O" i% o break;2 o3 t$ S5 W/ g
case 10: monthString = "October";- I4 p( W( o# {6 N. Y; I$ J) E/ [
break;
( B3 [; F2 Z; T. n! m% V case 11: monthString = "November";
: T) v8 A' C) \* L r break;& G* V1 @, a! M, n* R! _0 e
case 12: monthString = "December";9 L7 ?, ~+ T; u0 N: W8 e
break;
: }- ~1 P' S# |1 ]. e% l L5 f4 [ default: monthString = "Invalid month";
# H7 o1 B- M1 Z9 D( l break;
* l. k4 k3 I2 X/ N- w1 i+ _ }
$ R' k* A# ?/ @( |( [ System.out.println(monthString);% u/ X+ d& \( }+ n) @
}7 u$ c- Q/ G" [. d" d( M, m: t
}- Z# C- K7 _5 C1 x6 J6 ^- G6 v& Z2 A
在这种情况下,八月打印到标准输出。' W- v* V2 ]9 R, ~' i: D4 N
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其3 i8 R: t2 C1 m; V# p/ R* \
( @+ {- n3 P# O) x+ P0 V# D
表达,然后执行的所有语句,遵循匹配的case标号。& y) v: o/ {9 ~; l P, L S' C8 `
你也可以显示每个月的名称与if-then-else语句:* d! h$ {! D& y. g1 H0 p
nt month = 8;
4 @+ R: L# [0 F8 s/ yif (month == 1) {
$ k5 R1 F" ]* C! I System.out.println("January");
& ~0 G1 p( J3 {8 M} else if (month == 2) {
: |0 ^7 H* ?. U/ l' e4 L. I# e System.out.println("February");1 p) G, \% Z# p4 P2 l N
}
; ^ X% ?# b3 Q7 A... // 等等
! M: R. a1 ?# h+ v7 c9 ]/ L/ P& Y+ Q- ]& E& C2 P1 } W
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
* l8 \7 R+ Y) v; C) e. s& w! D: T. b+ C8 u
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。$ B! |! P- W0 }5 }0 E8 v
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
$ H9 I* i3 C- m! n; w; N+ x9 z. `- g9 o: n+ X3 z
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论$ D" W5 Q. g; h3 R/ ?
' V" W$ |+ L' v# u8 _8 j; o# g! n后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
. d+ ~) A* x ^) L- I2 D
% u5 `* R# [7 e1 _空。该程序显示对应的整数月和月,按照年月:
1 l( M1 a: o0 u0 i0 b; X7 ]! lpublic class SwitchDemoFallThrough {( {. Y* ]/ ~4 B" S
0 d; ?8 E, M* w- ]8 d! ], Y public static void main(String[] args) {. z, U& ?# e/ j8 U! q
java.util.ArrayList<String> futureMonths =
: `! G9 E. w7 b! E) J/ Z2 s2 x. \ new java.util.ArrayList<String>();% U h' T8 s! P9 G
' X0 ]4 \0 B) O$ D int month = 8;
5 v9 D: d2 f' |# E' L; c/ [- u( w, i( G6 g; H! }, `) i
switch (month) {
! M- f( M! ]: j1 y2 x- n2 J case 1: futureMonths.add("January");" _6 x n- i( b. O5 v# T# o
case 2: futureMonths.add("February");1 M j1 U+ l; d- I% v: J% i
case 3: futureMonths.add("March");0 k# ?- o, ` n4 s& W8 x
case 4: futureMonths.add("April");
7 U$ k6 N k$ U6 Q case 5: futureMonths.add("May");. w2 K+ [/ T6 U" v& h
case 6: futureMonths.add("June");; ?! T( I0 C" e% u9 i9 R
case 7: futureMonths.add("July");
& b# D! E+ c* v$ v case 8: futureMonths.add("August");
" d- W9 r6 p& S4 f% m case 9: futureMonths.add("September");
) Q" n- O( [3 _ case 10: futureMonths.add("October");
) \- | t) G2 r7 t- S" P0 e case 11: futureMonths.add("November");
% n: Y2 v$ q9 V, y case 12: futureMonths.add("December");
& `% t2 g& i, ? break;
2 k& P4 R! N, q0 A2 i! U/ | default: break;
* s4 n0 v/ m: c# W }& b% _- ]8 ~9 l* G% w
* @" l7 `& w) s5 y/ G8 g6 G" J if (futureMonths.isEmpty()) {" G2 O; ^8 i+ z. G7 Y
System.out.println("Invalid month number");5 A( \6 ^2 U% H
} else {( ^( F/ e* ^, |- m5 k+ S8 c9 m
for (String monthName : futureMonths) {
" M c# I6 M( Z System.out.println(monthName);: v2 F0 a7 a6 w V
}/ e% J8 K' H+ d) z4 f. I8 w7 U7 j
}
6 g) m! w; d5 D2 K* p, z4 o }, Z1 A; \( z' q+ M, `
}- a1 N/ }- F( d/ T
这是从代码的输出:
. D5 x* @) m: \8 j$ j6 b
* J! x0 `7 i m; ?August; @' b) L1 o- B. n! n
September4 L* G A- d! B( o5 }2 o# Z: L6 h
October, B; ^" s1 e9 w9 i1 ?, a# G
November
0 C: k6 p( ~7 U$ n0 W% ?December2 u( |( Z( p: x" u% b- F! Y- l
0 c" H: ]% d' {# X% ^- [
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
4 w$ m0 z* @4 t P7 ~9 L4 M8 K" e
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
, o* Q6 X, u b) n) A下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数
$ H0 k3 W. r: I! D: d9 l( I3 H/ y. A: R1 w: g: g2 E$ O }
:8 ^/ \7 b, S. T4 @# t. Y; G, r+ ~
class SwitchDemo2 {
1 M$ c! Q$ v8 @- ^* v* K; i T0 f public static void main(String[] args) {
0 U& g7 r8 y: _; L
2 V0 C8 m0 m2 Y int month = 2;- H, l2 l8 r. O. {
int year = 2000;/ d' y7 y, `. x+ b
int numDays = 0;
b( ^( G- @5 m$ {9 ]; f0 t6 Z' D2 I3 D8 {4 l9 I
switch (month) {8 z4 L' H) c/ }) Y- }+ c
case 1: case 3: case 5:6 \) B1 e: b: z) a. |* z
case 7: case 8: case 10:, h* Y' D$ Y: F% Z. f
case 12:
3 \( C) _# C: Z1 z) e7 I4 W$ ] numDays = 31;
: w9 q5 N$ ]9 A# ]5 p' w$ S break;
! Z8 O5 g) J3 q case 4: case 6:
8 {0 h8 D& }6 j. Z case 9: case 11:/ B9 j. s- Q) f+ M' u% X6 B
numDays = 30;! [! T" C4 B e! O
break;
( @8 Q. i9 J5 O& F1 q; {1 S case 2:
$ Q! T2 N' n! ]4 z5 L if (((year % 4 == 0) &&
0 m, i. v- \5 M/ a. a# m: ^ !(year % 100 == 0))# J: M' m. T+ M8 f6 D
|| (year % 400 == 0))
6 s" n% z5 ]) x% d numDays = 29;0 `& m7 P- v, [; S+ j! `/ r/ t
else ?# U2 B* M6 O
numDays = 28;8 [' b: v: y) m+ G
break;# U& e+ o9 d. {
default:
2 B$ x4 Q- Z+ @0 d- } System.out.println("Invalid month.");
+ _$ i* h8 H7 O0 R* B, G break;
1 o3 A+ C4 }* N }
- Y# T: D- L) y System.out.println("Number of Days = "
1 y8 U& }: k% s+ q7 W4 Y + numDays);
1 I$ k2 N& W. B2 j( ` }
1 m- r4 v7 c- p2 c6 z}* }2 w+ y7 U" R7 _
这是从代码的输出:
( ?8 `# |6 x" @7 e& sNumber of Days = 29
9 g7 H1 o, Z4 v+ C; T+ {
7 q5 U3 H% p& C3 l) b+ M& v& [/ U二、在switch语句中使用字符串
7 M+ ~$ F4 z4 O6 d+ T; R& {/ X在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,) T2 v5 Z* d/ h' ]7 y4 y
5 g$ I- E' r, ]+ |# ~
stringswitchdemo,展示了基于字符串的值为月的月数:, F- d( z/ {/ N' }0 K( l' a
: |5 H" ^$ t& I0 c- ~; Vpublic class StringSwitchDemo {
$ f5 v7 m$ B9 g# z
& i- r5 y! U5 A5 R! I7 p9 m public static int getMonthNumber(String month) {. {) m" {7 p9 M1 E: i | K
( h9 y7 X/ L, r: C& ]: F, H! ^" I
int monthNumber = 0;
- _/ S- f; }; \+ @( b& F+ U/ b3 f4 P# e6 z( ^
if (month == null) {; w7 o! P1 S" Y! M" W
return monthNumber;( w' Z9 {2 T% u6 K+ g
}
% ~ O5 c4 f6 _! @0 }4 l
! V7 H, ?# P: |0 T* ~+ ` H. D switch (month.toLowerCase()) {" B8 j- D" z m
case "january":
, ?$ Y/ \) c5 w. G) p+ O; e& a monthNumber = 1;
" e: S* h" X3 ]9 o break;
: o# @8 V4 f2 o case "february":
/ A: f4 h7 U2 j* p8 u monthNumber = 2;
" `% s( W* {& p6 i break;4 y& B, ? Z9 b# q" q6 W; ]8 T3 o
case "march":
7 W0 y. u6 o" @5 f monthNumber = 3;, b* c" H; ^9 h2 _' d
break;
4 V+ v5 ^3 h& K) u3 \# k case "april":6 I$ m) t; ?" C& g
monthNumber = 4;, O: a( B( g4 `/ a$ j/ ~6 J+ j
break;
! i0 y( E1 C+ p3 [: [% B case "may":1 ?2 m4 s( I `4 r
monthNumber = 5;) y. g' w% g% Z/ s- }; I
break;
' e8 W9 Z0 }9 h. C case "june":
6 B2 o" r1 W# B- E" ~# J monthNumber = 6;
' @+ C- @9 ^+ c; Y/ h break;
% U+ ?; O: u. E# k" ^4 i& q8 q7 x case "july":) l2 ^- {: ~5 e) h, j6 n: M
monthNumber = 7;
. F- P g$ |$ ^5 k- d; o break;3 x2 h7 K' d* p% J
case "august":: G- Z3 K$ r" I. {' R- L. |5 j
monthNumber = 8;
& B7 Y2 W5 N& J7 t5 a- ~$ ]$ n break;
# X/ t9 C0 W0 v. [0 _3 o8 e8 x case "september":9 F5 w. s0 R- z6 ]& N: ]/ d+ L
monthNumber = 9;: u3 S8 M1 v( | l0 z: v n
break;
' g) _9 u0 g# l case "october":" M8 c' u. ?7 F. s, q* ^
monthNumber = 10;% W/ B V2 M3 {9 h
break;
7 \) H7 G2 s8 \) ~8 [3 b case "november":
5 B9 h" g* L2 ]: u) C monthNumber = 11;
( b% q M8 a6 u; K( d5 ]; u: E6 p break;; s8 ]; F6 b- {" B- i4 t0 g9 y5 F& k
case "december":
% \! c& y) `& c- S3 C. ~0 d: o monthNumber = 12;8 ]! B% s; y/ ~; |) B( c
break;& q8 H% K% x- g- Q5 E' A' r
default:
( b' d7 I( h( L monthNumber = 0;
# U2 l* I3 |5 o break;
1 h7 ?8 T* u8 H; U S: r% {: ^ }
2 E1 A' Z% ~( N
$ l9 T# G# K9 F2 k return monthNumber;
6 H# x3 B: y( j& w }
- N7 h! l W* G ]# w
" x1 `; E2 h/ \3 y8 m public static void main(String[] args) {
4 P3 N' Z9 \8 w
3 n/ ~* [$ g7 ^! X5 H7 S String month = "August";/ i) b$ l( Y9 C w% ?- H
" @3 ^9 @% }8 X+ Z
int returnedMonthNumber =) k6 `& b8 G3 B8 j, K
StringSwitchDemo.getMonthNumber(month);
; _; g5 u* N) {% ~* ~4 t9 `% N) _8 i. [% @/ `
if (returnedMonthNumber == 0) {
& k+ ?" g1 W! A4 K4 k System.out.println("Invalid month");9 j; G) s$ {/ `4 ?# v
} else {
9 t' G7 |8 {( u5 ^ System.out.println(returnedMonthNumber);
$ P1 `7 p1 P9 k$ R5 i V" w }7 Z6 P0 }2 J! D( [5 y5 X6 x' l
}: `' x# m, p% y2 N d5 ?8 X9 [1 k
}0 ?( p$ ?& R, W9 d+ S7 h
从这个代码的输出是 8.
- A4 Z% x" Z% q' yswitch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了# _( h5 S% a' A3 q1 S2 p
6 I) Q4 P" s. t" m, y1 T4 I8 k4 ~& G
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符' D4 f0 e3 U. U, c; ^( ]* _
0 Q. e* X* G( Y q$ z& l: _6 k# X' w
串小写标签。
7 w, n8 }. k! H: C注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个3 U- \( I Q) q0 o" N
; {1 k& X' B$ z/ _; N3 E& ^4 F
NullPointerException异常被抛出。
7 I/ z- P @& P# B3 ~1 E本文转载于toceansoft.com |
|