|
一、switch语句的使用
& L; b2 l) }0 q而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
7 K: Q/ o2 q4 W( ~+ |5 E7 O' ~! I! [& ]1 P# O/ _1 ]8 F
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始% v# D0 D( m$ B5 f) T" P
" `& q7 f9 ]' P
类型:字符,字节,短,和整数(在数字和字符串的讨论)。( S _' c& V& L4 b
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值4 P& c$ n/ u2 ]( r2 k
6 r$ Q* [# W9 w
,使用switch语句。5 U+ d ?+ ^4 F" w
public class SwitchDemo {, |5 |& z8 R7 ~3 _; V" q
public static void main(String[] args) {5 h6 x$ e8 P" x' S' {# Q% Q5 M6 w
/ V4 D( d l# K3 Z int month = 8;1 \0 q$ A: b p! F0 E
String monthString;+ o& G( {: t% J; Q# U$ v7 }4 X
switch (month) {0 c$ b% `; b( v% p6 \, l
case 1: monthString = "January";% t& D9 W5 i: F4 K t
break;/ A' y9 }& F: h" H7 p2 |
case 2: monthString = "February";. B3 w! I6 V e6 c, I/ @+ r! b4 k+ D
break;
1 Q& [- l9 Q1 o; [ case 3: monthString = "March";) G W5 {1 i. S7 M
break;
% E* s1 _9 B7 k2 U. n1 {6 e3 F case 4: monthString = "April";
8 n6 n. S/ N+ W ]& k- G4 P/ v& y7 [ break;
' a8 \$ O& D! G: ]% N% Q: J' g% |1 o case 5: monthString = "May";
4 ^- q& S& }" y y2 N. V. ~ break;
# i& J- M2 \0 P/ b4 f0 A6 A case 6: monthString = "June";+ Q5 r2 n1 T0 X1 r6 s/ d/ T
break;
7 w, E7 E7 u* [9 g: t* G' [ case 7: monthString = "July";
0 V& R" `- U: ]/ j! s0 H break;& Q) v. d9 Y5 y% v3 L4 L
case 8: monthString = "August";
* y5 e5 ]% X0 [$ O, [ break;: W* w. T) }( T' {/ X" [$ O
case 9: monthString = "September";
$ I4 h. o6 N( N% S- y break;
) R7 d2 A P4 R8 Q) R- Y8 X case 10: monthString = "October";
]7 m3 N. t; x6 m break;
- d, }. j/ ]+ B7 H" k: D case 11: monthString = "November";
' ^, _' G0 u: g1 E break;! z! o! l& z W
case 12: monthString = "December";
9 H" A, _5 p0 f1 G# C5 J7 c break;5 i' |' u6 `, f. }4 K- x3 E/ n
default: monthString = "Invalid month";8 a: K4 _! m) S7 a" T' y. J
break;
, S$ p9 H6 T% a! Y9 h b0 Z }* U2 R! r% `+ C$ F1 ^& }" f+ E
System.out.println(monthString);7 h2 }1 w* t" o" o. r7 w7 ?
}
6 x3 a3 k2 ^( K( p& x" \6 F6 k}
. y8 J$ I2 I4 @" q0 C在这种情况下,八月打印到标准输出。
3 U2 x' b$ b* kswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
; g( y7 B0 y- [4 Z' _/ Z' a
2 D" s7 J; `* t K" t' B表达,然后执行的所有语句,遵循匹配的case标号。* f# z/ c7 K4 h- A
你也可以显示每个月的名称与if-then-else语句:
% g3 I7 ?$ Y2 V. Q6 ~, j; }7 ]; Xnt month = 8;
4 k$ X7 A# ^3 Y: x$ ?$ l7 i6 dif (month == 1) {
/ l) k9 Y8 q; t4 Q N System.out.println("January");
+ e/ D) B6 N3 Z9 L4 u} else if (month == 2) {, Y& |. O3 d' O. t+ n: @7 i
System.out.println("February");7 n5 {. t( K% y' E2 q" X
}
1 q% _0 _7 S" m J. K# O$ B2 u... // 等等
6 l! B; A! s. u: v" X; r7 P& Y. A9 W! p# f+ ]& q: C
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
( a/ c+ [3 v) s k: Z- T( b! u& {+ |# X J6 s! W' V
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。 D1 W( G L4 Q6 C5 n/ ]
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
9 k4 W; _( a3 v# v( e1 V
9 c9 C/ x `/ F7 i& s7 W- f# T句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论" B! W w5 e, }- |4 }' t; T* A+ K8 H
& E, c& u$ F% d. X后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落) q# E% K2 S* R8 y5 p' M
( Y+ p8 c" L5 k6 l
空。该程序显示对应的整数月和月,按照年月:
8 F* v. J; J9 i' s9 K; T8 e7 j: opublic class SwitchDemoFallThrough {
. O* m; }3 m7 W" O8 k4 W9 u4 {; X/ Y, T
public static void main(String[] args) {
8 G- G9 K1 _, t/ ?3 y; c. Q" D java.util.ArrayList<String> futureMonths =
H( C$ M' [ j0 S new java.util.ArrayList<String>();
1 h* x+ p$ X( {7 Q& V1 Z G; M& o
/ p- ~6 ~* S+ Z& \ int month = 8;& ?; ?/ [: k( w" u `4 v- R( |
6 I1 B1 f5 X- T5 ^# V% H switch (month) {" X4 e/ S$ ~/ G5 Z/ n# f- G. }
case 1: futureMonths.add("January");/ @4 ~; Z; G6 ?4 C) I4 S
case 2: futureMonths.add("February");1 k7 q+ x# m. l; S; T8 B* V
case 3: futureMonths.add("March");0 f- U% R8 c' z! E4 r
case 4: futureMonths.add("April");2 _* `0 V1 d" [' \- I: H# U
case 5: futureMonths.add("May");
! E. {) ^ W8 ]) U Z4 r. G, n, D case 6: futureMonths.add("June");: }- ?" s/ X- i6 u* _
case 7: futureMonths.add("July");; O# U$ P) P% J9 `; l
case 8: futureMonths.add("August");
& O& B, ?6 P* w/ r9 H4 F V case 9: futureMonths.add("September");" F- S0 M+ P1 U! U* a4 m Q
case 10: futureMonths.add("October");/ A1 i3 s, Q8 N3 T3 `
case 11: futureMonths.add("November");
0 }+ a( {5 z+ B: ^ case 12: futureMonths.add("December");8 a4 w$ S* o$ N9 e5 r6 I& x
break;* H0 C) Z) ^' n% k; X
default: break;
7 T1 A- o& \! N7 ` }' q" H& Z$ k* H5 j- g' P
9 x, U* j1 m! O1 H- L if (futureMonths.isEmpty()) {
7 [ N" s& }/ v% m' G System.out.println("Invalid month number");+ L/ R& F; k* q, \4 `
} else {
! W! l+ l3 Z4 Z. G8 |& d for (String monthName : futureMonths) {% A7 W, U4 ^8 e$ I3 g
System.out.println(monthName);
% E) k. ?- l! f6 P, S }& N* C+ Y7 H) ]$ A4 g% f
}
. g( X$ G" D$ J4 ?5 t1 V }8 y+ H! S' r* R+ n
}
4 x+ M7 N5 i4 @& [' \( j0 \这是从代码的输出:
2 _$ n2 i( `! a# a+ `, s9 w) p1 e3 e5 J+ h
August5 m& {! x: G2 ?- e% v( a: [
September
; s" S. Y1 F& g3 lOctober; X* o- c# L* v* i' @
November- a2 {2 \0 b5 w0 h
December
9 @- T% q8 o0 u; O5 D- v! z! O! g& S5 X" w% z* G
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
6 Q M& J( I/ D& s* P
7 ~$ o! f5 k* h# V9 Y容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
$ s# b f" m9 ^ Z8 S( C2 `下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数& I. c( i R" o9 I k6 d* F
6 R- w% ~+ [" I% p8 E* k$ g) [
:, X6 g, Y% Z$ z, i
class SwitchDemo2 {: U8 E4 ~5 m8 V* @6 s- i/ n
public static void main(String[] args) {
. J3 O. c5 R* T% W& u7 O: m2 @- ^7 r: I! y" }
int month = 2;
% V+ E! Z" f4 g& q/ L int year = 2000;
3 l, J" K1 ^5 A int numDays = 0;5 `7 J D' Q, }! \; \7 _
' p( e+ x5 S# z9 x$ V* P
switch (month) {
, s2 A4 `3 d0 J! r1 S- ?. o case 1: case 3: case 5:( w4 d6 c3 w$ R! b
case 7: case 8: case 10:
0 o$ e+ \6 Y& s- m1 h$ z" p case 12:! D+ v5 q7 y6 y1 r# K# E( p
numDays = 31;/ m g" p' p% ]" t
break;' C' ~7 @7 `4 j4 R6 r
case 4: case 6:5 ?+ B: B' h1 B0 s0 o0 e/ N; \
case 9: case 11:4 U! K: W3 @9 I& ^; Z& q
numDays = 30;; ^# c9 Z3 r) E' s
break;
$ ~9 O( |( S5 f4 v- ?& N9 j case 2:
4 Q1 z, b1 c5 G. g. m if (((year % 4 == 0) &&
, j6 _8 }) a% K7 s* m. Z; C !(year % 100 == 0))$ O3 R5 R0 F, q, ?8 E# O
|| (year % 400 == 0))
1 l, |( e1 o3 S, { numDays = 29;
& r* r2 C: d. y( G- o else! V. @- B- `7 m! G
numDays = 28;
( ^1 X* s$ C% S4 p; L# Q: [ break;4 x- \1 N) x- U& F( r2 P
default:+ H5 `3 J: J. Y- i* Z
System.out.println("Invalid month.");" R& }3 y- L2 u7 K
break;
8 [9 G% {# S, ~1 W4 O9 _" I% F9 R }
9 i7 p* x7 s" b! I, j- Z7 C/ } ` System.out.println("Number of Days = "# E, K1 T; b* W. ^. q* J
+ numDays);
" {, Y( q% A6 l/ D; Z: w# [/ x }
7 [+ g& h, ^7 P1 D}2 k# ~" j; e4 v6 e
这是从代码的输出:' x% o3 q. W% U- g; C; ?9 T3 t9 |: v
Number of Days = 29
0 r3 C6 f; i# K/ c1 g4 S4 `$ d6 |8 I3 `, U1 Y [+ S
二、在switch语句中使用字符串9 R# W, e# g' X) H& r' n( |6 i
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
2 f% m) l0 l* N$ t2 D$ i
1 k$ M8 c) ~( ~2 o+ o5 n5 n" istringswitchdemo,展示了基于字符串的值为月的月数:9 X, ` {; P0 D$ P$ g
# `# m( c! x% S" M% d7 Hpublic class StringSwitchDemo {
5 {8 _7 \0 u% Z5 F) X: M8 L& \
; ^. ^: \1 c) L. N2 ^. O2 a; D* q! K public static int getMonthNumber(String month) {/ ?4 T: F$ C6 x$ D9 e8 e
# E' ]( @3 ?0 f int monthNumber = 0;
; l6 ~5 _/ A2 b# ?# j; w9 r
$ Q" y( J% \* ?6 m4 {4 G if (month == null) {
/ x4 x9 w4 K( p( C return monthNumber;9 K. a$ d. @ H6 X
} ]' @8 l; o7 N. F
1 b* d& V* y; {( i: A0 M% J
switch (month.toLowerCase()) {
) R) M, G; y4 X* } case "january":
9 q$ g( f& y: C& v monthNumber = 1;
% s+ y, Y0 X0 x p, G0 N break;. Y, M i% j9 `2 A& L2 P
case "february":% g: f( V+ V4 w' @
monthNumber = 2;
4 z3 U2 N0 I+ Z% d3 a v7 g' t! L0 c break;
$ C# o$ e! }8 L# t6 D case "march":
% L+ [8 ?1 X/ s monthNumber = 3;
( g2 b( T# A( g+ z break;* z% b! g3 y. G
case "april":* n' L8 k; `# N2 m7 h ?6 H$ o( b, E
monthNumber = 4;* y8 k# O0 D7 v% v! w4 Z! `6 W
break;% d3 e6 }5 p1 ?. x7 R: t
case "may":2 G3 w7 m. F9 d. h
monthNumber = 5;
$ F e$ e- d7 p, P6 f0 A" ~ break;
8 B; V/ |/ I; b4 w \- U" [! B case "june":2 S( F5 f$ G" c
monthNumber = 6;
: E1 [1 d8 a) m. B, \ break;" V" w) t: l) \+ J( q' V
case "july":
+ A3 W8 x& S% Y& g5 @ monthNumber = 7;; Q) c1 p" K' y+ N6 x7 t
break;9 v1 b% n5 n" `( Q& A- } I2 M& b* f1 [
case "august":
8 b' @3 b7 X% o) h. f2 x0 x monthNumber = 8;( `( |) M9 ]) p4 ?: n; Z
break;
! `" w3 R% q1 m! r case "september":' ?2 k9 n$ R2 M; q' e/ K
monthNumber = 9;
4 | N6 W2 x* ?2 T9 j break;7 H1 B+ ]/ u7 H5 L( |$ Q; S
case "october":" ]2 L3 O& w1 Z1 w% l
monthNumber = 10;
' M6 Z" }$ U6 c2 C6 G break;0 q# E8 H, `# T* z
case "november":
5 z# n* Z; h' Q/ Z4 w7 q' j: U/ J monthNumber = 11;: w0 c1 W3 w! z5 j. a0 r& F
break;
% V+ X+ T n F2 o# I- _ case "december": B5 e) D2 @4 @
monthNumber = 12;2 W$ Y" E, K8 i: H
break;( `7 i7 g. M0 C
default:
) a% B4 i# Y; ] monthNumber = 0;
) ^* Q+ T% y ]# {; c) \: Y break;8 ], H. P0 C$ E4 \
}
; t# \8 L; c/ N
% Y. {/ G. [ w; i9 J0 q# v return monthNumber;$ |* l) u; ?0 D
}
6 k: P+ l" T( X; } ]- \" r# x/ M! O2 C* `% ~8 ~/ [
public static void main(String[] args) {1 D# |$ T) C! I2 b, C4 K
1 G* s; ?) U* ]* r3 g% v2 Q
String month = "August";
* q3 ?! `8 f8 X/ e5 U: R) v* c8 N0 l) t9 U+ N4 E! Z0 {% _- i; o
int returnedMonthNumber =
* ?8 }6 X9 X# X/ i4 P6 ? StringSwitchDemo.getMonthNumber(month);+ O) ~% o8 \8 B5 P8 d
' x+ y; j4 K" e. q, C4 H if (returnedMonthNumber == 0) {
4 n+ }. Y1 t) P6 n System.out.println("Invalid month");0 a& a. w) y6 F0 y
} else {) }# [5 H0 D2 c( B1 r
System.out.println(returnedMonthNumber);4 A- c( w. R4 B$ I( F3 W
}
7 a( C/ k' Q, ? }/ s# }& w0 d2 n# f' H
}) f' G0 i4 D9 H, j# S
从这个代码的输出是 8.
9 W; Q: N8 P3 ]switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
5 [1 E" d0 A1 k/ V5 w3 `2 Q, i: M* c! \ S) b6 R! O3 E
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
$ @9 Z- U0 ~. x! b* i" h/ [6 A" r
串小写标签。1 G. y4 N" o5 Y: l
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个' o9 b% D7 P# Z, w p+ S. ~
# a/ S# L- P8 ~- b3 ~# ~/ W% y+ E
NullPointerException异常被抛出。7 Y7 ^$ {& r y, P
本文转载于toceansoft.com |
|