|
|
一、switch语句的使用& J; V) o2 H9 [8 p' p
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和: W1 |: s' r/ i W }% H y. w3 J
1 f/ O8 r+ Z# Y, w1 q8 y原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始
V9 M6 R% o0 V- ]1 \1 Z" s( c7 b, b. d2 @* L
类型:字符,字节,短,和整数(在数字和字符串的讨论)。
: q: z' o% x1 n) a3 P* a下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值; s6 u1 E# ?% x4 x
; e: M& j2 o( e' q7 w; m
,使用switch语句。6 V8 J/ j8 T; \2 {6 i( w& c3 D
public class SwitchDemo {$ S1 L( N: D$ R
public static void main(String[] args) {
, m$ W f1 r" }
! j3 }2 b6 c: U, E5 I4 h4 C* ^ int month = 8;2 q5 {* s, d( {
String monthString;) h$ L. L0 k7 c8 x1 X' H e
switch (month) {
# F7 A/ h$ c( j: M9 a4 N! k case 1: monthString = "January";
# A) ? D6 I' L- ~, ? break;
F* M. [, b( F" B* d5 l5 ~ case 2: monthString = "February";
4 B6 v# n2 N6 d2 d" e; J% T) C break;
/ }$ Z: g/ _, V! E4 Z0 H case 3: monthString = "March";
+ L. ^) E, N9 Z4 a& i3 X$ W break; C2 B: B* ]2 e/ {" L
case 4: monthString = "April";
1 K+ c& j1 R6 k. X% y break;& |) v o# \, b$ U5 a3 e/ J
case 5: monthString = "May";5 z( `% t" I4 E+ x! B. k
break;
7 v3 [% x$ x# r4 g2 J' f( F1 T9 s case 6: monthString = "June";* Z" _+ @/ U, P+ F0 u5 T) Y0 s
break;
- `) |9 F' B7 e3 z c ~) n3 M' l case 7: monthString = "July";& y! t5 {" o/ b" ^
break;
- I% A& f1 F' U: I case 8: monthString = "August";( m# a' j, p' w, L% H7 q7 j6 p
break;* p: v/ j! t# j! i
case 9: monthString = "September";
6 \; {7 i$ V9 r6 r5 g& m break;3 a; `/ v8 B- F5 `4 |7 J7 t
case 10: monthString = "October";
7 ?4 l7 t! z& ^: r4 n. ]. j break;
9 \- g8 X4 R" i" w7 t$ C" ] case 11: monthString = "November";
6 G4 R' `% U9 K. G) t) q8 ]. e break;
6 \4 l& A9 r7 g) `3 { case 12: monthString = "December";
1 z0 J u$ P1 o% E break;
# Y8 N# |/ R5 G, g5 X: P1 J default: monthString = "Invalid month";- ?+ C& B0 n- ? _2 [* T2 Y; h3 }( i
break;
3 C. ]% U& Z5 Z: h7 V. G0 Y }1 v u R& q3 \1 ^3 i+ S7 p
System.out.println(monthString);
2 w# B9 p( R3 a3 V }
0 w" r* u+ ?5 M2 a}
) o3 Q! ]: ~/ k在这种情况下,八月打印到标准输出。9 [! x8 r5 w! C! Q, L4 A
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其; W5 M2 K% k* z5 D; U% ^+ O1 P e
' U$ U. ?: m; R8 D. l. ?5 p表达,然后执行的所有语句,遵循匹配的case标号。
, Z+ D# G6 B( r" o% N6 S0 z你也可以显示每个月的名称与if-then-else语句:! Y$ y7 t/ C0 c
nt month = 8;/ S" Z* x4 w( y, Q! ]
if (month == 1) {
U! @. ^ o8 [, N+ N5 w System.out.println("January");
7 z; {7 O+ x0 @' M% |: r} else if (month == 2) {
* c$ | ~4 r9 x% W4 J/ \1 F System.out.println("February");# P6 \1 q, M. a8 t6 n$ L4 v
}
) j/ T1 ^8 ?. I9 J% w... // 等等
- r0 r; J* h/ P- ]$ `5 j! ?* y( k
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
* e8 k5 M/ ~% S; {' g0 Q0 a7 V* R+ W k% n
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。
' D; y- j y) ]6 ]另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语, N6 ?; c9 h: G( c2 j
, K$ X1 }- p- ^8 I6 K) ~ s; k句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论9 G0 `$ [& X' v
" T6 ~& ^% Z% d4 O
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
* `7 s( g/ l5 P) L1 q! o5 d% x
5 w( R# ]" a( x' N3 h! V( W z空。该程序显示对应的整数月和月,按照年月:$ Q; z4 O% d2 i- \# {- H
public class SwitchDemoFallThrough {4 d5 y P X) r) _- `6 c0 w
- z' l. n6 F4 k9 X! a public static void main(String[] args) {
7 A1 I- J9 m" A5 a: Y3 a V java.util.ArrayList<String> futureMonths =
( I4 @9 Y8 j. F1 O9 ~" F0 X2 ~ new java.util.ArrayList<String>();1 f) ?+ @4 c" c7 ]9 D& J) Y% m
7 Q6 C( J' f$ d: F int month = 8;
! t$ ]$ e5 y7 R5 X3 [
- g* R3 I' t/ }$ }3 m6 w8 y; [ switch (month) {7 j) d/ q" `+ C# S2 _
case 1: futureMonths.add("January");
9 y0 a; k) B' ^; s+ x0 s( b case 2: futureMonths.add("February");) ]% L4 F2 b/ o \; h
case 3: futureMonths.add("March");
0 j. ^7 F1 ~. i- @/ p8 H case 4: futureMonths.add("April");
: L% W* b: _- j8 {: ~3 [$ Y case 5: futureMonths.add("May");! Y/ {1 J8 X4 x* z' [* d
case 6: futureMonths.add("June");
+ p! F) t4 {# Z$ I! W3 U5 b9 @, {+ M case 7: futureMonths.add("July");
3 K7 c% m% e2 d- K2 o, d) k case 8: futureMonths.add("August");& O* I( d6 O) y
case 9: futureMonths.add("September");5 U+ Y$ @# M6 {: b: Q5 s) d' z9 G
case 10: futureMonths.add("October");: y+ \. ] W, X" I
case 11: futureMonths.add("November");
: s# q' T2 k. d+ e- n% P case 12: futureMonths.add("December");
& k8 L; c) ~- v) J% p+ `- [ break;$ ^+ ^6 B3 R5 e
default: break;
5 o0 q1 f9 I( J% i8 x }% X' |$ k: g" v; g9 F8 r
* V+ a' Z& d/ D: G6 q if (futureMonths.isEmpty()) {
+ |+ p3 X5 w) ?8 j: n System.out.println("Invalid month number");
) Y' f/ u/ o' ` } else {
$ E; O% Z% ~3 B9 L' W9 ?9 M for (String monthName : futureMonths) {
4 z) t' W. H3 B/ Y" ~; w& B$ A System.out.println(monthName);! O8 F) l$ s4 r! s; z
}
: Q+ d* K& g3 e8 R }4 f+ ~; Y; r, Y9 ?9 ]9 C% o& [8 p
}
- t2 U9 T- k. Y3 P}5 g. K1 g$ F D& T
这是从代码的输出:* a5 L! _+ C+ a% V s/ A
4 x, A$ b4 l, j9 C
August, H y) a [2 X9 C( n- u# u( {
September
/ @* |* j7 [/ P7 I% n* NOctober
( q- u. a- [& x+ k; A6 y4 VNovember
' N. v0 b! P; E s8 n6 dDecember$ P! C; V9 Z, m, a
6 @ s* K/ A/ c# Y- C
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不 I+ L5 _$ ~4 h4 ?3 |8 f. a
: M |& O( I% H. M容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。4 e" X) Z. O; h. J1 [
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数
# c" A- b5 c) `" p! U( W3 @. n% l0 l+ ?8 Z
:) G, j. ~0 q% }
class SwitchDemo2 {
4 v2 x5 Q1 [5 @2 A/ _ public static void main(String[] args) {" i! e# x! M" d1 C( m/ J+ i
4 B- E% @! j+ t& \5 k% @7 h
int month = 2;# {) A, N+ y8 R* _
int year = 2000;
) |2 H" v. K" c0 C- M$ }6 L int numDays = 0;
4 \+ ]7 z# [* {# }* a
7 K& o! k* Z0 q7 ]+ `. m+ I5 P7 A switch (month) {
; j. B( ?; ^; @( R: A% K case 1: case 3: case 5:) x2 N( ]& ]3 n
case 7: case 8: case 10:& D% }0 s2 `0 W
case 12:
- [! Z" p6 u* U$ B$ O$ D4 R numDays = 31;& U9 f$ f. _+ Y, ~# q/ @4 V
break;0 W( Q& w2 P2 A1 x( L8 o5 h: g- o
case 4: case 6:) o. t9 } [! j1 I
case 9: case 11:/ N* S/ j$ s7 U) D8 a) `
numDays = 30;
2 N8 @0 S$ B3 j. Z break;& X: k; w5 Y) U/ c- r3 G$ U& _5 V
case 2:# u. B% y, ]- G# x3 x! f
if (((year % 4 == 0) &&
& J8 l0 g% ?3 R1 V2 R) S( w !(year % 100 == 0))2 G* H- j* g9 X
|| (year % 400 == 0))
5 V \' d/ | \! `6 O ~# } numDays = 29;1 [( s$ e2 W& r" @- f
else
{. z, h0 K, f! W8 K9 F numDays = 28;
) Q4 Y; x$ @& \1 h break;5 y& s. B8 T1 L, ~4 J' _1 e5 l
default:" x' i# f7 z) Y2 J# R4 f) A
System.out.println("Invalid month.");
s0 i& F: r; ^& s, G break;$ p2 D. n2 h9 c0 H+ Q. Z
}
) W# x- B# Q5 ]$ s System.out.println("Number of Days = "
2 K' C; ]. Q/ V1 @9 o + numDays);& n2 t! j; x; W" N
}
. q( `$ Q7 O2 _5 T& Z, I; f b}
( g% c1 b9 i# j" _, y) p7 c3 {这是从代码的输出:! z( c A' Y+ |4 u" w/ U) |7 H
Number of Days = 29 E& F2 {( A( [
9 z2 P1 t# g, Y! a) o
二、在switch语句中使用字符串
4 A; ?) b/ }- c- Z2 Q1 _: L在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例," X# m; D; B2 p* n) V
0 [5 `) T' H& k! ?6 Lstringswitchdemo,展示了基于字符串的值为月的月数:
% p( \9 `' a" h+ Q1 a: E3 r) r8 s" ]7 J2 F- k' L. P
public class StringSwitchDemo {
" h9 }7 O L" O. V. m8 v f: ]) O) T' `
public static int getMonthNumber(String month) {3 s4 L) x4 E% J7 e6 c
- J, ~& m3 s/ p$ Y, i
int monthNumber = 0;
" V( b# J4 _ G, r# ]9 q; j
2 O( G/ f5 f2 d/ f if (month == null) {
% C- e- I0 L- H return monthNumber;
' `' n: p$ i, _: e8 d1 F- \ }
/ s( [: D5 T5 X+ w
4 G$ n. l$ U) u8 b switch (month.toLowerCase()) {
& s9 F4 H$ `# \, \ case "january":
- ^9 ~ w$ ?8 F/ ?7 o% B/ |) z monthNumber = 1;( \3 D$ C' M7 c- H! y! t- M
break;* a. W8 T# Z& ~" e# ^: C, X! Z
case "february":
5 N& g$ K( A% [: b monthNumber = 2;- _8 d& b) _' x! |
break;9 g5 s; @- A0 @4 B0 G
case "march":3 Q$ f/ o X4 Q
monthNumber = 3;
$ s/ h }' o P' f3 }" t1 n3 ] break;" u" _. F- |0 ^3 }& j+ _
case "april":
% }& F, g0 W0 R& [3 e monthNumber = 4;& l3 w: Y& {5 V8 |
break;
' E6 [2 {2 p0 Q case "may":4 ^5 b8 p# q6 ^5 B( ]
monthNumber = 5;
/ s/ u/ _+ \4 ~" w! B% O7 A break;9 c/ [5 t& r/ l, B( U% l( h. w
case "june":
7 z7 v9 ~- N( Z" D0 C# A monthNumber = 6;
' d; d9 C, o; |1 l2 R' l break;( W9 \6 \+ x, M& r& A
case "july":
0 G: D+ U$ d, M( ~9 H) [3 t, j monthNumber = 7;
3 V# M' n" Q7 b9 Q) l" Y; ~ break;
& B* X% q6 Y2 @& c case "august":, v/ ?& o) @1 i1 ^
monthNumber = 8; l+ T2 w7 v/ ^6 P# v. ~
break;# d/ O+ g2 ?6 `1 Y. G9 J
case "september":
9 c3 k6 J6 g8 P. D/ q* D+ }, c monthNumber = 9;
, s, ]3 r* B& x S' R$ ^+ K, ] A break;* h* J6 l H u+ v$ u, b7 `
case "october":
+ `" u& ~; \- J9 J7 `4 s% T monthNumber = 10;
. n6 R/ Y: ^9 I. \ break;
; L: R" c( m8 m, o6 D case "november": m0 q4 k( l+ g* ~3 n/ C }) Y
monthNumber = 11;5 T! N2 J! n* d1 a/ i
break;' q- ]- I% C' p
case "december":; E2 H0 R3 a [, c8 L6 ], \/ t# W3 y; K
monthNumber = 12;
- i% X8 j5 a/ [4 F$ r4 c7 G break;
6 |+ L9 d) k! ]. @( O0 \/ P8 Y default: |/ x2 a: J/ r. {- E2 B, D7 e8 ]
monthNumber = 0;# c. x- @! ]2 F! s" v
break;' ]8 R1 {$ O n7 g& p4 V6 Y
}
( n0 u" K/ Z2 C6 N8 m7 V. L* {9 V3 B2 A( } \3 [2 h1 D
return monthNumber;& F) q* p4 j9 \
}
+ _7 i/ `. }; _* v8 _2 u/ p& O6 I/ O
( G: l( f1 ^9 w% j+ z public static void main(String[] args) {' { s" n' J% p, _8 t, G
7 c. \3 M( r$ ~/ U% D! s) b6 c
String month = "August";
# H7 r& l' |! p- M
. z5 _4 i0 ?& h% }6 O- g% F int returnedMonthNumber =
. |& Q3 E7 t$ ~+ c StringSwitchDemo.getMonthNumber(month);) z' ?" P0 ?+ ]9 N
5 S; z; B3 `+ |, ^/ _ if (returnedMonthNumber == 0) {3 g; D T" J, V/ ^
System.out.println("Invalid month");2 ~$ V* U0 D1 @( g, J
} else {$ t" I+ y j( X$ |; R0 ]
System.out.println(returnedMonthNumber);1 {) `+ q. L5 S' [- q$ }, r3 o
}: I- J2 O4 P0 U' I z0 l+ k
}8 F5 \' G% g$ M4 u! S, k9 l
}7 _0 L6 w3 ?6 v9 h! N
从这个代码的输出是 8.+ d7 q" B2 E1 S
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了% Q7 M7 v/ e" h5 d$ m+ r
* X; t) M8 p- P5 O0 Jstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
% W0 y$ I" ~: w) y4 w9 D2 ~& ?$ x2 L! L0 t; b
串小写标签。
; f O3 c% }* G3 |; ?注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个$ ^$ M& L( P, ^) ~% `& f
! k1 W' T/ I) D, L" q
NullPointerException异常被抛出。
- {' i7 \3 Z8 P" Y# D- C本文转载于toceansoft.com |
|