|
一、switch语句的使用7 n. ~, o( B7 o3 O3 e2 j' S, Y$ {
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
, E" v' p5 [. r9 G1 f8 @: U* u) s0 ~& |
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始5 o& Z* k( {( j8 n3 u* X
6 `' l) A( v& \7 D
类型:字符,字节,短,和整数(在数字和字符串的讨论)。2 Q. n) E. C8 C. g
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
" P8 W7 k7 h& w1 K. _
* V" K* O. Z! `' [! f,使用switch语句。( N' @7 e. X* M( ^
public class SwitchDemo {: N. V3 P: ~1 r/ |
public static void main(String[] args) {
# J9 {4 W, l l0 H6 ` n$ d2 n+ M$ \8 g6 U9 F w) b
int month = 8;8 W7 t0 u* z7 i+ u- j$ X% S6 F
String monthString;
- S G3 M& m; `4 {% _9 g switch (month) {
1 |/ U4 J: d: y% T8 x+ g% u case 1: monthString = "January";3 i v; x8 r& i% l% ^1 j/ s8 Q
break;$ i1 u5 e% y- b0 @
case 2: monthString = "February";4 b9 f; r) G, C! g
break;; F6 @. ^4 }0 Z
case 3: monthString = "March";
O' T) d1 i# X3 b; D, v1 A; w break;( W+ S5 P4 j2 p# k" M
case 4: monthString = "April";, d# { Z/ {* _- \
break;
! v! L. g, |% O. b+ ]; U* x1 W; V- t case 5: monthString = "May"; u. K9 `4 h( ?0 n
break;
: ~; [ b- u$ l7 b6 {4 t case 6: monthString = "June";
+ r! e6 @3 ?6 v/ D5 ~% k" [ break;
" T+ e) s( }4 O& h$ H" G' O4 l case 7: monthString = "July";
9 N4 n/ n# M) H! z' v( c! \! u* i break; Q& ^" A- e1 `# @& ]. M
case 8: monthString = "August";
! k& N! `: m/ ~ k* C1 ? break;
1 H) m; F# q/ r8 j case 9: monthString = "September";
5 W/ d# u) C6 |. S! W) j5 y* I T break;) X1 k/ g$ Y# f$ n- L
case 10: monthString = "October";
5 S. v2 X7 v' w" U break;
k( o: B7 r4 X) b) M case 11: monthString = "November";/ t; {* K. S1 p; m8 Q& g
break;
8 Z M! H8 P) _3 X! s# v4 n case 12: monthString = "December"; ^' V e; `' s2 W9 o" x- D
break;
5 C9 l8 y5 {2 c! a5 e. @& @ default: monthString = "Invalid month";
, s; I- |0 b; b/ E break;6 v5 {* J C$ t/ ^4 B2 ?% Q7 q, s
}) U4 |2 v! W# @5 k* N- [. |
System.out.println(monthString);
0 Q- N1 ^* M* S# L9 G1 _6 } }
8 X8 i/ }+ i/ N" s* J+ [" B& o# x} K j7 X1 p8 R% `0 h
在这种情况下,八月打印到标准输出。' x# V3 y/ x3 S6 l0 F0 F! O
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
# j% w& I9 c4 ~ U: w
, I3 h$ z7 j& B表达,然后执行的所有语句,遵循匹配的case标号。% }5 n7 x0 D0 ?/ o& V
你也可以显示每个月的名称与if-then-else语句:
2 m7 r( Z. ~, \4 e$ tnt month = 8;
! ~4 t' t$ _( k2 J, [if (month == 1) {
. [' V' V+ K8 B' T System.out.println("January");/ {- p6 r# X7 }5 A: S6 V' d
} else if (month == 2) {
& ^* |# v- Y, ~6 C System.out.println("February");( v& L3 L$ |4 X1 j8 l
}
# l' W* G( l& V% j& i6 t7 W... // 等等$ t. X7 |; B. @
- n$ p/ b& K; i6 L4 Y z( G) H
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
9 l% ~, b6 o5 [- X" O+ [6 q8 H/ ]& z' @
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。$ O9 `/ E1 X! I- I2 ~' M6 m) \
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
* H$ M- g% E$ {$ x$ q
. q) |# D" N' P3 Z0 G句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论# q4 ?0 f+ W& i
2 e8 M9 w7 |5 t& w4 Q3 R
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
o; B; ~. |6 I& S6 F3 L
/ I. q$ w" w8 N5 c% ^空。该程序显示对应的整数月和月,按照年月:
! T' W2 j( Q$ T6 A4 ~public class SwitchDemoFallThrough {
' c: M) S j9 C9 m6 R- Q0 J8 z; _# f
public static void main(String[] args) {* \0 t" D! n. Q" a/ g2 G# S1 F. E* |
java.util.ArrayList<String> futureMonths =: \# ^' }- _& W' z" h+ Q5 q1 H
new java.util.ArrayList<String>();
. d" I6 e" y- U9 n/ ?0 l5 W$ N7 {5 c4 z! x% [) x
int month = 8;
( K; P& x( d" ~5 q9 _& b2 c+ k; H
8 ?9 n3 ?5 c: o( o1 P% @, N# k# i& R switch (month) {+ t! }% p% m: {0 Y4 t7 q5 @( c
case 1: futureMonths.add("January");
' |$ g. Y$ {8 _# ^( R case 2: futureMonths.add("February");
) x4 g ~$ R5 y, s9 O% x: a; h case 3: futureMonths.add("March");
0 w" h# k+ r" n+ A% i) f& b( i case 4: futureMonths.add("April");" q3 R) Z6 G G* T
case 5: futureMonths.add("May");# b$ {) j" p! B
case 6: futureMonths.add("June");
; Z1 U0 b5 E7 }$ I; ^+ e1 z/ v case 7: futureMonths.add("July");
. y& E1 ^4 B! E case 8: futureMonths.add("August");
/ t: G1 j* F3 e5 T; K, \ case 9: futureMonths.add("September");
. K3 W- s& q2 Z$ ^ \5 } case 10: futureMonths.add("October");
- {$ G3 a+ x. W1 `& R# R case 11: futureMonths.add("November");
) m4 k7 q& m$ b4 B; n: Z case 12: futureMonths.add("December");
s& X2 {& U3 t5 |7 H4 C2 f break;8 A- G; _4 v' q* {% R! E
default: break;" {- }: D8 T9 Z" Q# j% N
}1 c) T0 E3 |! B7 H; o
7 \5 P4 F5 N7 i7 K' j l
if (futureMonths.isEmpty()) {/ s3 f$ d$ z9 a' A$ n* q$ ?/ c. O
System.out.println("Invalid month number");+ L, A7 M; T& C) [. s
} else {5 [2 a& u3 W9 k" j) N( l
for (String monthName : futureMonths) {
6 y% I2 J3 R3 x7 D; w System.out.println(monthName);
6 J- J# h; {; W. b# |' |2 k }4 p- o9 F9 F. J$ p. |
}& ^0 b7 }5 Q' B. L; J( l8 J! l
}3 r$ w1 N* O. u; h5 Z2 C" m
}
8 Q' m. k$ O$ B' U9 ~% s# V& F/ f这是从代码的输出:+ E4 o8 l/ u! N3 F
2 n' g2 S$ k5 ?
August d1 H: f0 R2 w: O: O
September0 A! q) s) G3 v" Z; G
October1 I1 h( x; E7 j9 a7 B
November* M" e% k6 V/ ?
December. x8 M5 D+ w4 a0 K0 v/ ~# [/ T9 W8 J
9 R: D9 Y. g/ \+ g8 b从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
& E0 i4 ^( A! S. S1 W8 v: y+ v& O& v8 A5 }* q+ g: ]/ _
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
1 g8 v1 U: L7 e/ A" j0 u4 i f下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数9 \/ f1 |+ t1 C' w
- k' Q7 L" A) e9 _$ z- o9 g* ?* N$ t- M:
( u3 X6 u, u4 a, v o A7 S. hclass SwitchDemo2 {; B* I& H4 I; C. m# v) u3 R- D/ w2 |
public static void main(String[] args) {
- T0 a1 _8 H$ Z1 E0 {9 s: Y# h& J; d. ]4 R0 o
int month = 2;
6 n6 f% A4 g" k: O2 T7 g int year = 2000;
. k/ G$ ]2 _- h: J3 Z int numDays = 0;/ { o& B) c, \- o C0 R% x
& A7 s) ?# G$ [* F1 N
switch (month) { {1 |- e- [1 }- c' ?
case 1: case 3: case 5:
' H1 O: ~* ^9 J" p1 V1 M6 ~; P% n' Y case 7: case 8: case 10:" f. G" G. z/ ?4 V
case 12:/ Y' X; j: G- k( H5 \
numDays = 31;
# B2 F" F+ O; L' o8 b break;
2 ]9 O& s: F- R case 4: case 6:9 Q# g' [& r8 K
case 9: case 11:" G6 u9 T4 U& u4 Y+ @4 K8 v
numDays = 30;
) I/ S! T( Z+ | break;
& n9 X$ D( ^$ c6 D! f case 2:
G0 l2 I; S: |. ] if (((year % 4 == 0) && , D" C% K! P5 o
!(year % 100 == 0))
/ h9 B4 Q+ Y$ a || (year % 400 == 0))
4 @! z- I' v; Z! Y7 H numDays = 29;
6 o& y% D+ X( I# D' V3 Z: h else6 Q0 d% M( ^, ]5 ]& t
numDays = 28;
0 S8 x1 j# X$ u* F9 L6 }; { break;
3 v/ A' w$ r; _6 b! C$ q* s default:) ?( ^" u+ g1 o- w6 I
System.out.println("Invalid month.");; M. U* L1 r- j
break; _3 [4 Z7 W- j% |1 q5 F1 e7 S
}4 u) z. h9 D _6 l L% r
System.out.println("Number of Days = "
5 \! J& I6 f# ?2 Y + numDays);
0 U# Q/ W, v C0 { }
# m- k9 x* h# a( U; l}
0 [/ j# R, k3 k5 l8 ]; E这是从代码的输出:& W8 @3 I% w0 f8 H8 \1 l# \
Number of Days = 29* D4 K' k. K/ K3 d: M: V: z
- T$ r. G! Y& z
二、在switch语句中使用字符串4 i+ T$ r! d1 N/ j) p& G
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,& I" q* ]1 t3 Y$ n
4 f. N/ J' w0 X# s9 }+ w! U. U
stringswitchdemo,展示了基于字符串的值为月的月数:
) e- z( z& W, b) E2 S" S$ }" _0 K3 \% f q: ~+ l
public class StringSwitchDemo {
9 ~* C( j; _2 X
! ]) `! u# F5 o' }9 p. w% L public static int getMonthNumber(String month) {
- S5 G5 d3 U- a- Q
9 [( T: ?% w% [# O. b: f7 } int monthNumber = 0;& q5 L9 ]2 s0 m, t. _
% t. j% |1 x0 x& q. ~! f
if (month == null) {. y* b4 b+ {. `9 k: g
return monthNumber;
/ s% z: B/ a2 t1 a3 G8 H+ N5 d: u* W }
: h1 h' {; E" I3 w5 k8 J) j' B1 a5 q' D7 {% Y" O/ i
switch (month.toLowerCase()) {
# G0 u% ]5 U4 i4 d F# q case "january":5 }6 I7 a, l. d) a; Y. h) L. T- M
monthNumber = 1;+ ?9 a8 ^" `9 Y! n6 a" }
break;2 E3 s4 C1 \# y; S
case "february":
5 { F2 o: d" R" m" s monthNumber = 2; F4 b* ^$ s$ m9 Z) X) A& f
break;0 A& B+ S' p3 w, s1 ~8 O) _
case "march":
. Z8 o& j, `6 y: e monthNumber = 3;
! L, L: r! [$ R3 L: D3 {" X break;; I/ B) ~! Z1 ]+ O, `% K+ j/ L, R
case "april":
; R9 W, W3 a( Y( D; ` monthNumber = 4;* ^3 j9 y7 ? w5 e
break;' b6 t! R$ L$ t
case "may":
! w. n6 L6 @4 j* h ~ ~ monthNumber = 5;7 ?5 V- Y: J8 r0 ^, K8 z
break;) p. V/ [. n* ]3 }
case "june":
# s" n$ Y1 r, g5 y0 [ monthNumber = 6;' `: S+ M }+ q
break;
* C4 A! f w! ^7 V% i7 O# y: Q case "july":0 A( d/ \1 _, F
monthNumber = 7;# q- `: i7 q d4 c
break;4 k1 e" A% S, s, A7 M' A
case "august":9 Q( Q4 {+ Y5 u/ [
monthNumber = 8;1 \& u" h' N2 |" ]" P' c2 F
break;
" w9 s6 a/ ~. I# V case "september":- P9 \3 V: Z1 X: S# d& h8 H
monthNumber = 9;
' l& r% e5 v! Z b5 r# i break;2 n6 N5 N0 }# k4 U% F
case "october": A' x/ U6 Z# W5 N6 X, y6 C
monthNumber = 10;$ F( B+ K6 c8 J! j* |, `: n6 [1 K
break;
; f# |0 v% R1 D E6 K6 H case "november":! U( P/ o7 M3 X9 v7 R; J
monthNumber = 11;
$ f! U; i/ l( k3 S/ s break;
; k8 T6 |: ?2 f case "december":
3 m' f2 u0 W% ]! B- W9 v. B monthNumber = 12;4 Q1 b g( e/ U3 A5 k( g' _: u
break;) C8 r2 [' v) a6 `& [
default: 0 n; k2 @0 Q0 Y& \* L0 V: U7 ?6 \
monthNumber = 0;, }9 ] k$ G2 A- j
break;
6 w# e# r+ J3 e( D/ p. T }
8 t" Q: a$ k. ^3 p; A9 G
7 I& @4 m- L$ R) f, | return monthNumber;% u+ s/ @+ e$ Z6 x
}
# T" B& F+ m6 e5 f K& l
h$ D& x5 a; b/ b. D! z public static void main(String[] args) {4 D8 o6 ~2 c2 u: V; g' t# Q
( ?$ d4 |% |4 O5 f e. P3 x String month = "August";
0 J/ E: N7 z' }$ O' h6 r) N- b
. J+ w( Z. I* l int returnedMonthNumber =
2 C7 Y% A3 v9 c StringSwitchDemo.getMonthNumber(month);. C# w- k4 n9 K3 M2 S, I
7 c; }' S7 A) g6 a0 M. J i/ m4 E
if (returnedMonthNumber == 0) {
% b- {0 D# u0 _ M- c6 q System.out.println("Invalid month");
. M f1 }& L8 r2 [! }, r } else {
+ m' G% o4 t J System.out.println(returnedMonthNumber);
; F2 `* [# u- g; k }! M9 r; i" w/ K0 N
}
0 A0 `: r ]7 A}1 a5 M2 z0 ?& g. D
从这个代码的输出是 8.
! I% r- T- J$ q @+ W% Jswitch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
) z# }& i$ d6 G8 }, m+ f
" |. f9 X# p; Y' d. hstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符! `- @& u* J( [! n1 ~
1 c( q! i* G; @% i5 j+ Y9 L- O串小写标签。+ W3 O# J0 j' K) b8 J
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个 g3 c" h4 v3 X
) k5 } A5 @. ^, M0 J
NullPointerException异常被抛出。
2 N' x$ T1 ~: H, Y4 o/ u本文转载于toceansoft.com |
|