|
一、switch语句的使用
9 K% V- E, V6 K' d! e- m/ G而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
B" e4 m6 _% z/ b3 r3 r0 e4 U' E( c# G# m: q2 o$ b
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始; H i! x, {2 N- j0 G+ |
7 B/ g1 f: L* E' _6 @, O类型:字符,字节,短,和整数(在数字和字符串的讨论)。. ^ m _6 ^+ K R3 m
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
# o% L, r4 @5 H: S1 ?
; |' U: b) } w' W N/ R,使用switch语句。
! p% P- f( V' W' @. Zpublic class SwitchDemo {% I- a) e- [/ G
public static void main(String[] args) {% s% c* C* E( L
- t- G* h( i5 r5 y! L6 J6 T
int month = 8;
3 e. M" o5 q2 ` String monthString;
' h; L& Q3 M7 r- ^ switch (month) {
% _. V# t @5 s* A" q( Y case 1: monthString = "January";
) _( p' {% i3 P, m0 C" B/ G" l$ Y7 R break;
2 K( G2 m- Y* `+ e# c, t" ] case 2: monthString = "February";; R5 I* C; E! m( e* X6 E9 Y- e
break;: P0 q8 }0 a/ G* U5 K3 K
case 3: monthString = "March";
6 R: E/ S# ~% {' c+ Z8 G7 E break;( U' A$ X$ l% Q
case 4: monthString = "April";
$ ?. Y- e) v1 R# }0 _6 b% g: ` break;) a. i: J7 i$ g1 Z4 }2 O7 U
case 5: monthString = "May";
: s. h1 J/ \( J0 P9 n. l break;" F; g4 K% X$ W
case 6: monthString = "June";$ \. I$ s+ v4 U4 p8 Z! E
break;
/ O5 _" Z" ^) \% F3 ? case 7: monthString = "July";
, S# l% P1 V1 Y" v2 J break;
9 g Z- M; h, J: @. v$ q/ W case 8: monthString = "August";& d% A8 {3 U; U: l: T6 X7 u3 W- L
break;
7 O) [, u7 G- p case 9: monthString = "September";
& H' Q6 l4 ] b1 O' b/ e2 d6 }. Z break;" J9 _9 A; i7 F, B8 a8 A$ z
case 10: monthString = "October";
7 h) \7 p. W3 p( C0 H8 u1 H break;
; D# ~; Q! X5 v" R case 11: monthString = "November";7 G: p& Y7 W% n3 W! j7 @) M8 V
break;1 p9 d7 _6 ^4 d, r4 C- g
case 12: monthString = "December";/ r7 X6 i) x3 Z7 i: F
break;. n4 F" I9 {7 W3 ^% O1 z
default: monthString = "Invalid month";% p& m9 L( C/ p# N9 x W
break;. q' n+ L3 |' y4 z$ w) w& y
}4 A9 _ ^1 e+ S" Y! I+ F1 c& e; n
System.out.println(monthString);
! i% v$ \! [3 k" k6 f) _4 D }7 m! H+ |& k% z6 M) T, O
}8 Y: }$ M( S1 A! P$ Z, T/ [3 P. A' w! A
在这种情况下,八月打印到标准输出。# Z0 J+ G7 d" g0 D8 x& Z' K& r
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
3 v% X. V! F, R2 f
; @) k3 f! T. J; i5 D表达,然后执行的所有语句,遵循匹配的case标号。
% U& V9 e9 S% s+ r' V你也可以显示每个月的名称与if-then-else语句:) x6 I5 w1 @ Z9 i: }
nt month = 8;3 E) N6 H6 A& i# w
if (month == 1) {5 t: A, G8 x6 {. @6 |3 |
System.out.println("January");
$ o- ?4 e5 a! w, ^) L& T} else if (month == 2) {
9 k9 ?) j o% B! d3 h System.out.println("February");# h( s8 \" Y; J/ J" c- B6 {
}
" a+ I" A" j& b+ m" f4 B... // 等等$ }5 a9 n& w) L; ]) o. m/ d5 F
1 V/ `$ Z1 u2 V- y0 t4 C7 ]' C$ C决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可2 T# r" D# I3 m! w# x
3 O1 L+ x% f1 i* G
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。8 ^/ b& | D& d7 W% z; r1 Z+ @
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语7 y+ I! E* s/ ?
2 X9 l7 w2 w3 R8 P8 \+ l6 J
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论3 }$ o" H+ b+ z2 T6 I
# [. C2 Z0 ^$ W. R' I: s1 G后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落; q" H" m' o7 W6 d
+ x( F7 S: J8 X# W
空。该程序显示对应的整数月和月,按照年月:
c9 {, g4 T; f/ m7 G9 apublic class SwitchDemoFallThrough {
( s! Z* H, [3 i8 D6 T8 T) D' x% ~. z( C0 t: g( ]) s& r( S6 l
public static void main(String[] args) {' D; H5 C! N5 Y
java.util.ArrayList<String> futureMonths =
0 Y2 T5 z" h+ R+ m$ s/ t3 F new java.util.ArrayList<String>();
! I2 X8 \0 @* }9 N
, S4 u. j @( j int month = 8;' `8 |- [* G, {: V& q
/ m$ g6 H+ C# W1 m+ i9 I: Z; }! X
switch (month) {3 a- Z$ I/ U( F! W6 h+ z _
case 1: futureMonths.add("January");
e3 i$ Y6 b7 J, r case 2: futureMonths.add("February");3 a) W2 _. h' H1 w& s9 |/ S$ z
case 3: futureMonths.add("March");
0 V9 T6 H2 X3 o5 E% L5 I( W case 4: futureMonths.add("April");
* J( K3 p7 G: ^4 ] case 5: futureMonths.add("May");
+ W: T W* T5 Q case 6: futureMonths.add("June");
/ g1 u- m* {& m case 7: futureMonths.add("July");3 b% M4 \3 O* Y/ E8 M, T0 A- S0 P- |
case 8: futureMonths.add("August");. e$ l! y6 X# c* ?5 Q9 Z3 I
case 9: futureMonths.add("September");
5 y( n7 X. n0 h; L0 d case 10: futureMonths.add("October");
; Y2 f3 \+ d1 V& h' V* h case 11: futureMonths.add("November");
! A0 R/ `# o" W4 S& V U( ]6 Q2 i case 12: futureMonths.add("December");
& ^1 p7 b p7 X1 O/ u5 S+ M break;; k9 y+ j1 I. a7 F" T* x
default: break;$ j! W. Q* F4 ^+ R" d! O
}
q+ g: u6 _3 H: V' k2 Z- r
; w+ M" _' w, h& R if (futureMonths.isEmpty()) {/ B; Z8 l6 Y2 h) n: i6 U2 u! |
System.out.println("Invalid month number");) S" H' J: L: j: X& q
} else {3 [) s' \5 H; S2 l9 d( `
for (String monthName : futureMonths) {
; ?3 `& t/ t2 e: j; ^. L: P System.out.println(monthName);( c! C. j) T# B* q/ ?+ v
}, d/ p; L7 Q1 z* U3 H
}
9 p0 W' H# J$ ~- W7 m }) n: o% Q5 Z+ x, o
}( v+ }, U9 o Q
这是从代码的输出:
4 {7 ]+ ^$ o4 r: u3 l! e- l3 }' j, J" o& ?) e; }9 K ]) J& J
August. F8 ^6 I: c' n2 G- Z9 X, ?& j
September
3 R t$ X% r* N7 H* a! TOctober7 F1 W! o, U+ x& N- `6 g
November
* w- f! Q3 Z4 S: x' tDecember
5 @2 O+ f. r7 M: E A Q$ h7 g' ~/ D, K( M! | X
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
' O+ m" ]4 u* e7 T9 A3 R# c- p4 R2 O( z0 z1 [
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。2 G0 g# y. U9 f; y: r/ G
下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数& C [. [2 Z& [2 B
3 G& ~+ X7 u+ x2 [" B. c:
" |* ]# a T6 ^class SwitchDemo2 {
! z' F Y4 a! f& o8 q* c public static void main(String[] args) {3 r4 u. g6 O" s6 v4 `( Y3 a# U
# c. e% j# U- V int month = 2;5 Y: S8 J; t3 i5 U2 E) U% w; T5 g
int year = 2000;
* V8 n, J3 k5 z int numDays = 0;
3 l+ @5 v; v X$ Y
, K. m% l4 s5 |5 x, p7 J) n! P switch (month) {
& ?. ]+ G L5 Y% h: A case 1: case 3: case 5:5 Z) Y% r% G4 `2 n% r1 A# J
case 7: case 8: case 10:8 h: ?9 ~/ a; u: e1 `
case 12:
* c( P& E) @4 \$ Q numDays = 31;
1 ]* T& l3 B2 y- k$ F break;
% D* f( a( d$ u7 L" Z case 4: case 6:: X7 z' c! B4 @: J6 V! m
case 9: case 11:! n$ A6 a- ?6 }; a. y; f: s
numDays = 30;8 Y- P6 F8 P; Z% H1 ?& w
break;6 C3 E4 F' M8 @2 G* B5 @
case 2:1 O, }% V/ J/ K( ] m+ {
if (((year % 4 == 0) &&
* Q, a, p* p, u' U !(year % 100 == 0))
; S! t( x5 {3 B6 L5 x# @( A || (year % 400 == 0))0 Y1 f9 L9 j; _8 x0 m" m4 Z5 i& _ @* L! I
numDays = 29;) n& H+ L- V( B% @6 T
else0 k! T7 a: F" N; ~, L3 f4 |4 W
numDays = 28;
9 C, ]* l k0 N0 t break;8 l& q8 X+ g" w3 E' H9 P1 t
default:
b0 U3 z6 l2 h System.out.println("Invalid month.");
! i* c3 `2 L4 [' @: t; P# U break;3 I0 J; Q5 c& g' \7 m9 H( f
}6 _. g1 W1 }5 W" Y6 h: ?' f
System.out.println("Number of Days = "
4 o9 I0 W2 a' F+ e" N- N + numDays);
; F- S l7 _8 B6 \5 |7 { }8 z( Z6 Q7 Y) h/ L+ K# y
}4 g: N& Z/ |" [) O9 |
这是从代码的输出:
( [- S, l" a$ r8 q% MNumber of Days = 29& h7 G m' l) @0 C4 Q
z3 f% Y V/ I7 C$ C二、在switch语句中使用字符串
9 T2 q4 b; o: N7 \% |. Z在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
/ k5 o. v/ S! [& | ~; w1 ]* a) T! ^( H6 U: r
stringswitchdemo,展示了基于字符串的值为月的月数:
' {4 _4 q9 l" B8 D6 j5 F4 q) ^; |. ~7 Z$ \3 v
public class StringSwitchDemo {
" N: _! B2 b. {8 V9 Y
/ h. w' u2 Q. } public static int getMonthNumber(String month) {# u! _6 S; b( P: q9 t" T
( D6 U) s8 W* u, e
int monthNumber = 0;: D( v: u' e5 P5 H( C5 ?
& G% y7 Q8 ?% v% Q. s if (month == null) {, [- c! ^* f' r. c
return monthNumber;% ?9 J6 G' `0 `7 z8 i3 t1 T$ f6 g
}
- u2 v }: F1 G, U; K
2 i, a- r$ [- A/ o/ q7 ^ switch (month.toLowerCase()) {8 x+ L- T4 n- _( d# T9 H: O# H
case "january":
2 U6 p3 Q; y" ~6 C4 v% q monthNumber = 1;
7 Y; b2 E, }5 b( j, N' K/ L; g break;
8 f5 a2 ^' ?) O, J" Q; v0 y case "february":) M. _( \ W' o1 V- m5 B6 i
monthNumber = 2;" {: \' C; J9 M) G
break;
3 K$ J3 S/ f4 L ^# I; F5 p3 t$ o case "march":* }9 v a% h7 \3 }
monthNumber = 3;
) Q6 L2 Y, R5 X7 l/ U) F$ J) o break;2 A# |; y$ H' t+ s* U# C
case "april":& t) g3 b* `+ B. h
monthNumber = 4;
/ ^: O* n$ @+ I break;
- j& ^. Z( T& U. R case "may":
, ]1 q6 E) t/ [9 z8 X monthNumber = 5;
9 w2 s) G2 F5 o break; e1 G) I3 O) g& I7 P8 p/ \4 q
case "june":; S! A. S6 ?/ v/ V! G8 t
monthNumber = 6;
- K4 I# |& Z$ ]+ y; `4 | break;4 i, y- R4 H" X; ]# I; C/ f
case "july":
( T, W: X# {( m monthNumber = 7;
: J/ K' w, ]; P break;# O$ @3 o1 _* T6 O1 g& r& C& I4 R
case "august":5 ~5 V+ ^) Y% u- A2 h
monthNumber = 8;
. X- ^$ M: {" b" Z5 I6 U) b; P break;' c% o. c ~/ x- N% k
case "september":: c% o( a9 |/ V. m+ s$ G2 J) B1 {
monthNumber = 9;5 h! ]8 y9 N6 L0 B* S
break;
" t" w3 m) W+ a- w/ G3 e9 [4 ~ case "october":
* m3 k9 S$ Y) V monthNumber = 10;
: b! Z6 J8 e) Y5 |( Z" u# K break;7 R( ~) ~' n6 g' E; I; X0 V9 T/ s, Q
case "november":
- ?/ s# `: {5 a0 U x: l+ S monthNumber = 11;4 q) f2 k$ Y' m5 z
break;
9 S8 n* T( E* r1 } case "december":
0 N3 x) i* h' E; \9 d4 T% Y, U monthNumber = 12;
! [( I% o8 `6 `) \8 m break;( D: q! x* D N1 [- m3 F: y- v7 e
default: 4 c, ^! ~7 B \
monthNumber = 0;
1 A! M+ M/ u) ^ break;/ K- r% ?0 m, X" O! Q: w
}6 H3 n5 R; [$ V9 S: Y
& {" a) n' |, `) i* F% D
return monthNumber;
& j4 L5 l- K0 M/ N0 ^) R$ F0 E }
, l* \2 o' r! z; B# j" U
# v g9 B4 _/ `0 d public static void main(String[] args) {' E2 Z+ w0 W! P5 y: V }5 Y5 J) |' L
5 u. L y7 M9 ^' b$ q5 [0 x5 u String month = "August";9 x, E& x% Z& ~4 q. I" x& Z
) U% Z! {. \* b0 Y int returnedMonthNumber =
& C* A% z9 @6 X" w( [ StringSwitchDemo.getMonthNumber(month);# P5 F: f. x- _' g- X3 G, i
2 q/ J0 m. A: G1 d, W8 }
if (returnedMonthNumber == 0) {
2 V4 k& j% ?& i# r, {1 O. S System.out.println("Invalid month");
& d0 K) R) }0 L# j, c( E } else {/ X. v/ ~" @5 c, z8 a$ O- ?
System.out.println(returnedMonthNumber);
9 t R$ m+ M, ? }
' I7 j" x4 j! h+ c; s' r* H2 ~ }* \( }! x! e( _! U; c
}
3 C3 A X' I3 `0 g从这个代码的输出是 8.( B- Q0 R# I' Q8 B5 k
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了& w' L% D% P$ Q5 T2 k8 G" [
# _8 K& C8 d0 G/ l5 {3 p! n' `* z
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符0 R) `' W, o' I! E) S
7 ~# _. ^8 W& R/ E! j( S1 H
串小写标签。
4 m; A% G3 x, g/ g! P+ {& D/ {$ L注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
6 T; B$ f- w% m; }% i) ?4 C
- V: z% r9 Q5 @9 N* v" lNullPointerException异常被抛出。
2 m; e- G& ~# k9 d- s/ ] l) D本文转载于toceansoft.com |
|