|
一、switch语句的使用
~4 _; k, z2 j- |) P A1 r而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
8 c N1 A" o: D, H, i: h: d$ Q2 g$ r; t) p( P; `
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始& F$ Y: c9 \0 W9 w _
5 `9 ^4 G4 l4 j; T4 j9 `" y, J类型:字符,字节,短,和整数(在数字和字符串的讨论)。4 m) J2 C" p2 L7 r% N4 T4 p
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值. ]( n# g+ V# B9 y/ ?; e2 m4 o, ?
9 b9 r/ j! P4 U; L0 ]5 A
,使用switch语句。 P, j7 i: Q% {1 G- X$ q
public class SwitchDemo {8 @# |" Q- r9 ^( z( U; ^' d" O6 X! x: A9 z
public static void main(String[] args) {) t9 p2 r1 t" a6 g/ v
; a& L; J* f5 R7 @ int month = 8;+ Y) R0 e* e9 T. o& y k
String monthString;& W* I( o7 C* f+ Q
switch (month) {
) @( L5 Z5 _2 O: h case 1: monthString = "January";
- m. X* @3 X8 J$ h, ^! y break;6 Q( a; p, V+ z4 D" e( K
case 2: monthString = "February";
) D8 O' Z: O. U) A, C break;
+ b: h8 A+ z) {' D- }) j case 3: monthString = "March";* \8 { A: N8 T3 h
break;! y! o7 M c* P) g' k4 H! z4 i. N6 x
case 4: monthString = "April";
- E: [) K$ _; |/ D break;) T& z7 D/ l' B
case 5: monthString = "May";3 c f2 E3 r z4 o9 X
break;4 H5 Y" L1 V( [1 U* R; ~1 A
case 6: monthString = "June";
) [+ N- v4 j8 Q4 g6 H break;
9 P0 y: e3 O s6 Y3 ~5 a. Z; G0 r case 7: monthString = "July";, U7 J, {) k( s0 {: Y- |5 y
break; s9 d9 |! X) o" G& q D
case 8: monthString = "August";
H9 T* I G q C break;
& S9 o+ F- e2 w3 E+ D/ N0 [5 J+ d case 9: monthString = "September";4 i. D$ u4 f& F, e, y: @
break;' T' S+ q; S4 K, \9 U2 g
case 10: monthString = "October";
- L: N& U o- L! J5 q6 u break;, C; M" o. p7 ?; R( F) @% ?+ V- E3 p* X
case 11: monthString = "November";6 ]7 h8 {5 u+ D1 R: ]
break;
6 J# b. c* T5 Q+ Q+ W5 A1 F case 12: monthString = "December";; E; U* Q4 R, B* |
break;
# |7 ~6 j0 C1 \; q8 z4 _ default: monthString = "Invalid month";; M+ j( j4 @0 r( }* ]* ]
break;
. p9 Q3 @+ ~! K) `* R; t }. j* z& r! g+ O9 l2 |
System.out.println(monthString);! `2 n" l2 j# f- X$ u
}
; ~8 j I& g3 K0 g& ]8 i8 k}
' Z9 |5 Z' z: U: j% i在这种情况下,八月打印到标准输出。
m2 M4 ?3 ^0 {! s9 b0 k2 n" Q% Mswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其! |& j# _8 U$ N" d4 b4 f; @9 Y
6 w, E1 K6 ~ `# Q |! g
表达,然后执行的所有语句,遵循匹配的case标号。
$ Z. t# l4 U1 l& t9 x5 f- J你也可以显示每个月的名称与if-then-else语句:2 B0 m. _2 |- z* E& ~! U$ ?
nt month = 8;9 ~- E# u: e2 f# @
if (month == 1) {
3 }! G4 q) ~% o- _, y3 X System.out.println("January");
- D) E; B9 @1 G' ?- B' y5 n( J} else if (month == 2) {, `2 h" g5 \8 P0 C
System.out.println("February");
: Q4 i, Z5 \5 k' k. y0 N$ F1 h}
6 U# w, {3 L% _: D* N1 g& t" g... // 等等
9 m. s; T, w0 P
( }& |, d- y I- y. m. R5 x q- ^决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可! O+ T) z) O- I: l
% Y$ E: ]5 q. e以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。7 w4 B4 a \/ T' G- L/ a2 X
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语9 \& E+ c! W( ?* P* z9 g' ^( j
$ {! v8 H2 b7 D7 a+ j" c句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
7 T7 {! t8 E0 X* _: A
( O8 J9 D3 V# V1 Q; w后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
J4 w$ `" N$ f1 P; o, M4 _ t3 o& q+ P6 @+ V6 H
空。该程序显示对应的整数月和月,按照年月:
% ?" d% R0 u @9 ` Jpublic class SwitchDemoFallThrough {
$ u) y; t3 t: ^0 c. b( d9 u! i( y4 u+ _0 O1 J2 x
public static void main(String[] args) {
. X( v) \# W7 J* f a$ Q7 P' B java.util.ArrayList<String> futureMonths =4 e: _# @1 G. @# x. [8 B" j: a! p3 a
new java.util.ArrayList<String>();
% }( s& {4 s5 k+ z
; ~. t, _' N$ V c int month = 8;1 _; a' x& }) f$ z P2 F: s4 y
; B+ A3 p4 i9 H switch (month) {; l* f; r! o2 d& Q4 k
case 1: futureMonths.add("January");
# e5 d9 b, o! N) u+ u5 D: ?7 E1 W, d case 2: futureMonths.add("February");
- Q8 s8 L! y$ ~. M+ b case 3: futureMonths.add("March");4 q Y9 O8 x- ?6 b" H* X
case 4: futureMonths.add("April");
* t, s5 ?2 S6 [% r case 5: futureMonths.add("May");4 W5 M* [8 L' N$ o+ y2 K
case 6: futureMonths.add("June");( r2 X/ n! r# ]5 X7 y4 t
case 7: futureMonths.add("July");0 @9 H& A9 P$ H3 K
case 8: futureMonths.add("August");! W4 s. G7 J: p% ~0 W
case 9: futureMonths.add("September");
2 I* ?! S( ^- `6 ^; `9 P% c case 10: futureMonths.add("October");3 l* z% F- J+ [& H& C; r
case 11: futureMonths.add("November");8 B; @2 r, h. T
case 12: futureMonths.add("December");
2 r6 Y3 x S- ?& i/ H4 [( d break;
; l2 b" N0 @# H3 z y, i; n default: break;7 u1 ~+ T3 q2 y7 m$ _
}3 ]3 z8 b0 O* [
7 p. B. [! G8 a7 }$ s8 H if (futureMonths.isEmpty()) {
7 Z; H( x! R8 q, G! l+ J) u8 k) } System.out.println("Invalid month number");5 c" e" k, Z' s* e: Z9 ` m) h( Q
} else {' c" Y( h! l3 {8 c1 m `
for (String monthName : futureMonths) {
, {! D9 ]0 Y O& K5 j System.out.println(monthName);
8 y7 z, r5 z0 a4 }+ `3 d4 D }; J A, N7 h- ^
}2 k* W p" S; l; F6 H5 e& M
}
! L7 ] F. y3 U7 [0 a}) E( ~( o! K: B0 [( R4 l* w* j! _
这是从代码的输出:
" `0 L+ R( e( O; j3 P( c" O5 q% e. C5 Q) T$ Z9 w
August
2 N1 B0 K+ y: |September% u! }" t2 P8 A# X" q8 s ?
October
, m* T2 P$ g! i9 ]+ bNovember5 S7 n" q) U0 ^4 w
December5 u! |% E f2 h- J% ^, O. |
/ A0 c* S9 j, K/ ?从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
- V' Z w) q. b h J$ H: S" a; P
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。( Q* i% z* \# T, @
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数' h m7 D! N& B' S" X
6 G9 l& {/ c4 P( J- i
:
" X3 B: P' I& P, C" ^% E+ [- Vclass SwitchDemo2 {/ y) n R# z% j4 Y% D
public static void main(String[] args) {
! y" z. L0 k. H" F
/ Q" V* f0 S( Y int month = 2;
8 P" d- o6 j* H' L7 I" P2 h ^: r int year = 2000;
) r7 D( |+ w9 X! x' L+ Z int numDays = 0;
1 }) J$ _* S9 o9 u) s- f4 f
7 X) n* ~' m9 z) p switch (month) {
& N5 G+ }! u3 }& Q case 1: case 3: case 5:
/ \2 |" [7 c2 n& c case 7: case 8: case 10:8 ?; V: y8 |( p3 c
case 12:, ^+ \. a$ w* B8 N: d
numDays = 31;
2 G; [- Q8 p0 F2 r$ U% ] break;) R- @/ n8 V; Q# S' s2 O9 A% a+ M
case 4: case 6:* }3 r$ }' b7 {& }$ o) T
case 9: case 11:; A% e' z5 X- |( v0 O
numDays = 30;
+ @# n* Z9 ?- \ ^3 R' Z break;
- q/ q" s1 k# P: c case 2:
$ b& p' u0 r) e; m# \$ V! N if (((year % 4 == 0) && 4 v8 {7 w# N# I/ U& \6 J; Y
!(year % 100 == 0))
0 x- ?, y. {& J. _. U; v5 r || (year % 400 == 0))2 `& e! P+ u, V5 f5 H# y; D1 @0 o" V
numDays = 29;+ l, T1 a K0 u3 d
else
! T w0 d. t& Q4 ] numDays = 28;, A+ C9 X0 Q. H4 q
break;" P2 T0 z; z8 i2 R; s# J0 z3 J% w
default:; z; d' Y3 F/ F- k- R1 X' D
System.out.println("Invalid month.");% B8 u4 @# O3 v. `) X+ b& [
break;
$ v1 u3 E, n) N% H) G% g }
7 `) i/ a) D+ ]8 X System.out.println("Number of Days = "
1 k4 \; i: ~5 \; d: k1 W& ~2 Z' E! p + numDays);3 h$ X+ H8 ]- a2 I' O, X
}
3 ]0 z' U+ s. K1 }$ Q}
$ i8 Y7 p: r' _# k8 E这是从代码的输出:3 x; C. `0 g; b2 r) P. q0 \- s2 I
Number of Days = 29
4 \9 Z" u5 W% |3 j
4 J3 o6 |/ P2 ^1 O5 W, @( a二、在switch语句中使用字符串* j+ U& W3 r* |/ k7 F6 d: F1 W
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,, Y+ d( C# N3 _
& g( D ^0 ^6 c U
stringswitchdemo,展示了基于字符串的值为月的月数:
6 Q/ A( ~. h( t# n2 J* X/ I% w5 r7 F7 N7 D3 W* t: e0 t
public class StringSwitchDemo {
: D5 q7 i3 j. o5 j- E. R0 s' Z0 C- C. P, f# c N7 s# Q( ^6 J
public static int getMonthNumber(String month) {. B5 D$ u& m. y( W) r
; z7 [" E$ ?$ \: [) p int monthNumber = 0;
) M- j7 ]' W$ |( ~6 z+ m" l8 P( O8 L8 C4 j) F
if (month == null) {6 n: ]$ I5 A& e2 m; ]
return monthNumber;9 u6 j, v- R) B+ I# X% P2 x1 A9 f# E
}
: e/ ~$ B1 P' w& P3 \
, G/ z* @& t* j3 L# Q$ G8 a8 d) Y switch (month.toLowerCase()) {6 E8 n( |5 m4 W; u+ c; W L+ X
case "january":, b& S* r0 w, \* \8 T5 S& O
monthNumber = 1; y2 S- l: I1 T: w( j# E- K, @
break;. O+ a( r5 M% H+ \% j2 t
case "february":
' {- V1 }; @1 U% m, m monthNumber = 2;
: q2 e7 g) P6 o X1 @% J break;. F/ n* ^2 ?* P
case "march":
& a( z/ C9 m2 U monthNumber = 3;
, a$ Y" g5 n7 ]" b$ j ~1 y- f/ J" [ break;8 h5 C [. \9 e" A1 H
case "april":2 c0 \' ]# B. }6 U& p
monthNumber = 4;
) _" Z* Y$ q$ n/ E: B) H& d% ?. b3 K break;$ o5 g* d5 B& X3 o
case "may":9 t8 Y+ r9 ^" F9 s
monthNumber = 5;& e+ Q: ^# b8 ?' j% K9 B3 P
break;
5 r7 b. I n7 M6 l \ case "june":
* y8 E- k' o" ]2 A9 Q/ r$ h) O: M monthNumber = 6;
2 e7 A! L1 H8 h+ ?7 h. A" @ break;
" o0 \ Z2 X) E M+ Y1 L4 s7 B case "july":/ ^1 s. M+ g2 }! @$ x( Y
monthNumber = 7;. q2 v& |# [& z
break;
9 z B2 y6 R7 o& r case "august":
. Q# o( d% [/ s) m) a( V/ e monthNumber = 8;
, H1 c( v" I! l3 t! R- s* V break;0 ~7 u p* \" X+ [
case "september":: w; w1 \2 I" _1 p2 e, O3 I' |, h
monthNumber = 9;
' _( {+ c( c6 P0 X4 J break;
" z( u2 f2 f/ u8 R; I8 K' \ case "october":
, x( n# H8 A& z+ i, I Z- Y+ m monthNumber = 10;
+ b8 x6 B& t0 i, q$ Z5 @ break;
- Q1 ?7 D' H* f case "november":
% ]: S4 K" N7 M( y5 n- R& {; c monthNumber = 11;
# o0 [( S( `/ p9 i break;
6 z: O- J. v, {; v case "december":
, f) h! O' O3 s: n monthNumber = 12;8 q* p- x% d! a/ [2 [/ h) X
break;
; |1 n1 O& G+ ?# j% i3 C( _ default:
4 z: o4 ]2 Q f4 O monthNumber = 0;
2 @$ `) a% h+ H break;8 P0 W" S9 [& F! D5 e) S& \9 {$ ~
}% [" G8 h( C/ `" g; S2 \2 b- D
0 h9 R t" z) e0 B q7 |; e
return monthNumber;
; @% _. L3 f6 n, b }
0 J' W2 E. n' ^! _2 ]$ I6 x: E# k7 l4 T8 D
public static void main(String[] args) {
' c w c: r s5 ]1 R
5 R5 J. ]- ~$ k; h" l& K0 e& Q% o6 k% v8 C String month = "August";6 y+ a8 D3 M3 B% E
( ?* m! t6 x% R1 L+ ?8 [3 H# \& B int returnedMonthNumber =2 n, [- z4 @0 i. C T* s0 e
StringSwitchDemo.getMonthNumber(month);
) w8 x8 C& Z' `
. Q# t$ s4 B! o8 d if (returnedMonthNumber == 0) {# a# Z8 {- ~8 d2 ]- C
System.out.println("Invalid month");
& Q' m! n6 F) o' F7 u7 u: J } else {
# ~* _1 h7 g8 m: ]5 s/ a$ b System.out.println(returnedMonthNumber);, R+ D7 i) ~ l! g* P
}) l8 G0 [6 E% ]" @+ H8 b" d' g
}
% C9 F) |/ L2 L5 l& i) X" `}
: \/ T! M# Y6 _ a1 { o4 g从这个代码的输出是 8.
* c, \; x# p. w+ aswitch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了: c e. M; O7 F
* h4 l2 e( O) j) R
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
; Y6 U; C7 @( u( r/ s8 N4 n( E/ G& j1 A: D h, R5 @
串小写标签。# X' y/ G: B2 N; l4 W" ^; V
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个: Q& L% a2 W5 h' P2 Y5 B0 `. k" @
, b/ N) U/ M3 ^7 K6 d. T* ZNullPointerException异常被抛出。3 E) ?: i; H9 b6 v9 Z
本文转载于toceansoft.com |
|