|
|
一、switch语句的使用
+ ]% t3 ]1 h8 Y" a" P* f* ~7 u% x9 `: Y而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
0 G5 E& b' z8 H
; u+ V: s* ~9 Z s原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始9 Q1 F1 T ?' K$ Q9 ~2 I/ d) b t
2 c S4 a2 f* H7 T) B6 ?4 j; f
类型:字符,字节,短,和整数(在数字和字符串的讨论)。2 D8 T% m- m& P' f) b* n. W% R" P+ t# j
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
b. P; |0 Z1 W, Q, a3 I% a( r6 U5 S
,使用switch语句。9 ?1 {6 n& N) F3 J
public class SwitchDemo {
* [' J- g& K- N public static void main(String[] args) {( O8 m3 C, A: ^$ ?# i% w: E- o
# p7 c) \% j$ d; J+ y$ `+ t
int month = 8;
" S2 P1 U6 F0 f" A String monthString;
4 Y$ u y `; z6 _" j" c- i z switch (month) {/ T; R1 K4 j. B1 B# S' J
case 1: monthString = "January";: o( p0 X* I) j
break;% w% \' i6 w8 n9 E, Z( x+ D; d
case 2: monthString = "February";* n" O- G! M3 K& z, G* \; [
break;2 D7 z9 C" F4 K( m5 A! y
case 3: monthString = "March";2 {7 D3 K( x" H8 }& r4 L# t& T% ?
break;% Q, f7 X6 J8 L6 z) Z
case 4: monthString = "April";
/ e0 G1 P, N5 N0 F) Z break;
$ k; H; s% I% \% s3 G5 e" C case 5: monthString = "May";# x9 g9 R4 t- V0 }% {
break;
9 \- ~# ?/ y& l7 x% o" d0 S case 6: monthString = "June";
h2 v8 U4 L/ M" [$ T7 V* E/ y/ {1 {/ ? break;
5 z, T2 }( L) y case 7: monthString = "July";( w! e% L5 k8 w( n8 }' {
break;
8 L) @( j0 ^( M case 8: monthString = "August";
# j# m. [- p4 I break;
9 `' R0 W4 T' @) j, i case 9: monthString = "September";
; V2 v8 K: M$ { W, g, k! s# B% K break;; u# D/ s5 F' J0 h3 K+ J4 q
case 10: monthString = "October";
, |. N* O! m( n$ A9 I( F8 n break;+ a9 D! b" z( g3 A# q$ D w
case 11: monthString = "November";. V! O2 p2 \8 t0 a: a4 e1 d: D+ Y
break;& h$ K% j' V8 H2 q' @
case 12: monthString = "December";. w v$ q- A3 ~7 b
break;' ~- O# g# X/ Q% W# @7 P6 F$ E+ I
default: monthString = "Invalid month";
% |" E# K7 I, _- r% s break;
! J, s- G, a. } }
! R4 p* D) Y3 n0 Y* `9 | System.out.println(monthString);5 V7 A W: ^& z5 k# z6 | v
}. T2 O# h0 }/ F; P* O, o
}
* ~& r1 [3 C/ x4 l" C1 W7 w7 c在这种情况下,八月打印到标准输出。$ }( T. ^( k$ _/ H7 w1 g- _8 A
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
% g- Y1 L& F, F: t$ s
" t/ Y. e2 W, g$ M& O2 Q表达,然后执行的所有语句,遵循匹配的case标号。
3 ^. v- s: Z9 o- u& s你也可以显示每个月的名称与if-then-else语句:- i: n( c0 M' F
nt month = 8;
# z/ P6 u( I* y: \% q' Dif (month == 1) {
2 w4 L- I, `3 S7 ?# H, d- B. B System.out.println("January");' Z% p7 D7 S7 d" b5 K/ M/ W
} else if (month == 2) {8 A) v7 _/ {* [) b4 m! z
System.out.println("February");2 x0 W6 \1 f4 G/ T
}, _5 e4 \" r* B/ p
... // 等等
8 s" z4 g" k* m% ~7 Y3 r4 O+ h$ W# e( E1 M
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可 E% G2 g4 H" e( g W$ O
& u! A7 R' G8 c' Y以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。
# j E' ?7 ]6 U3 J另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
. h0 t4 `) B2 A4 I8 h
2 C" J, n' p. l句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
) n1 ^2 E) T9 X0 m
$ u( o2 o1 v( X/ f后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落. O, Q i' i& D. G4 m+ V' ~
. O2 k' }; K# { j
空。该程序显示对应的整数月和月,按照年月:, o0 H5 c. j& m# _0 G) Z# x6 I
public class SwitchDemoFallThrough {
$ f; D) A/ ]4 w N. r. r2 I5 x4 V/ ?, \* v' C- c
public static void main(String[] args) {
5 q9 [7 H Y" E- b% c- a- f) t java.util.ArrayList<String> futureMonths =) B- {* A$ | e6 Z) D, \
new java.util.ArrayList<String>();
2 E2 z5 g6 D( A+ h/ q. V% z6 R' {& v) r/ e6 Z5 \% q x
int month = 8;- d( L% A( q4 `$ Y, O3 _
+ @0 J% Q: Q V; m
switch (month) {
. n; m2 D' B8 V2 R8 @5 ~& l0 r case 1: futureMonths.add("January");
& A$ Q, u3 Y' f6 \ case 2: futureMonths.add("February");
! M2 P# H! _. \/ n' X case 3: futureMonths.add("March");1 |, F! P7 N) D5 |1 Z* E
case 4: futureMonths.add("April");
. E! T% t1 I& q. S1 V case 5: futureMonths.add("May");
6 R0 P4 h* n) i case 6: futureMonths.add("June");
+ U1 ~. i! `8 O4 S case 7: futureMonths.add("July");" |. t6 `3 a8 V% _: M) {
case 8: futureMonths.add("August");1 R% h" G7 _- b7 }) U; f+ G
case 9: futureMonths.add("September");2 T! @9 F0 w/ G: S, I) k2 b8 k
case 10: futureMonths.add("October");
* i# B( u+ G' y& t case 11: futureMonths.add("November");
' h: X) \+ N* e. [) V( C- b case 12: futureMonths.add("December");
4 z( d' E5 W- Q2 x* {7 v3 M- {& s( X break;
, k( |# d& o0 I, B# _# K8 ^; u default: break;8 H5 c4 g$ E0 _0 Z5 b1 Z$ D
}
. v# x6 r# ?8 H5 f5 X/ u' n# q
if (futureMonths.isEmpty()) {5 M. R+ _" y! m7 d0 g
System.out.println("Invalid month number"); @; a$ n1 M5 ]* E5 D" i& z" G
} else {9 i. c* q& g$ C
for (String monthName : futureMonths) {9 l0 S- o0 c! @$ g9 {) S
System.out.println(monthName);
2 x/ a/ u' s! z6 [- X }
* j, {7 f9 I# b/ j% y+ W3 r. h2 L/ m }+ |. n" N' Z5 U) v1 W W$ {% g
}
4 ?- i0 i; H4 u' q}- O- X9 ]7 Q3 E. x( q
这是从代码的输出:6 c& d5 L: Y# E) d% F j
! b; U( `, B5 X5 P
August
6 q8 |4 k+ u) O; B- E! zSeptember
9 L) _" e @1 ~, hOctober
) a) q$ d( o/ Y& [3 jNovember# j! s& u# }' J. B
December
) s3 Q1 h( F$ @* C. S' |& L' [# a( S5 {& @( x" y7 [9 D
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
7 V) X4 K3 a" P1 N7 C0 c
5 A7 q+ Z7 l' R h* f容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
/ W' ~ q, v) Z, N. [下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数% D( U) \5 W5 W3 c# f
e) V7 K# V- o! ?* Z: O, ^" q! b:
% ^1 w* O5 j9 [) t+ rclass SwitchDemo2 {
- z& X, L9 |4 Q9 q' h3 w K public static void main(String[] args) {, l/ k: [: `3 F0 X8 e1 \! e
' ?, X1 O* o( M int month = 2;5 m1 ~% L, Y/ B$ q+ h8 E
int year = 2000;
$ w4 J- d4 f) n' @6 l3 X# R0 A int numDays = 0;& Z( v5 V5 H" ]6 \
8 C7 O6 H* k; v3 h* [2 e
switch (month) {
% P2 ~) K9 N. B6 I case 1: case 3: case 5:
/ G* w# A3 I9 ]0 I, T! a( x3 m% w: i case 7: case 8: case 10:3 G. ?. U# [! ?3 o
case 12:
2 c1 w" Q; p% r numDays = 31;2 Z L6 h. m0 w7 k8 L% N
break;
; V6 l8 o- |$ a% | case 4: case 6:
! x2 ~7 U2 [8 H case 9: case 11:
2 C# R' Y4 k" k: e* s# _0 L numDays = 30;! O! [7 M! u; n4 o9 |
break;. P1 I) |5 w+ d4 }3 c
case 2:
O* f+ B5 K1 e! U* b3 | if (((year % 4 == 0) && * [+ T: ]) S& g9 c5 g% T# n# ^3 K
!(year % 100 == 0))
! t2 p$ R1 Q7 _$ r5 Q || (year % 400 == 0))9 r4 w3 D( G( Q; i9 w5 ]& C6 S
numDays = 29;+ w8 L0 H! p4 ]1 E9 ]) Y) j
else
8 b& m0 ]6 Y& ?+ x numDays = 28;, h- i" J' @/ @! w5 M
break;* `2 H. |# o, w
default:
- F/ L) Q2 g! [2 [- U System.out.println("Invalid month.");' \; ~! P6 l* U7 f/ d
break;
( @7 w5 [8 e0 [( r }& L, m) x/ ]6 g
System.out.println("Number of Days = ", q( a6 `8 A0 W& O9 {
+ numDays);
* L' I5 ^, |) q# R) M8 K }, _: |+ t' L1 ?. x: u+ J; U
}
. _& k1 v( E& v这是从代码的输出:, Z3 D. T1 h3 D2 ?* Z( v4 N( e3 H& i
Number of Days = 29
3 m7 m& G" X. a/ s0 C: `# x
5 I6 Y* U- M" c6 h4 t0 A% s二、在switch语句中使用字符串7 _% q7 Y5 j H9 P& R! C; R+ m0 ?
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,- R. h! a5 p: l# F# K9 T' I
$ `) w+ f3 h5 A# g: c
stringswitchdemo,展示了基于字符串的值为月的月数:
$ b4 B& s* l/ f1 B( y# R3 J6 |% U' e$ b. k4 Z0 b# q! o
public class StringSwitchDemo {
+ C9 o( X8 L% L# j) M5 Y G
+ l9 H7 J W& Z public static int getMonthNumber(String month) {0 K t( D" ?, ?+ M6 w4 f$ o& V
; b$ t2 O. {% z+ x _ int monthNumber = 0;# k/ V: ^4 n: F2 G7 Z, x$ v+ H
& A; _2 V/ [# \. N# D. V( { if (month == null) {+ j% t! l$ X. K
return monthNumber;* m6 V, k' J- \* o: s
}2 ?) D* ^1 W0 }$ j ?/ r
' I" Q$ ~* @: u5 e, M9 k switch (month.toLowerCase()) {# V+ K' v) H$ s: ?8 A$ k! Q0 t, |
case "january":
2 i( ]; J9 J, X! X4 b6 N monthNumber = 1;+ [5 L2 V5 x/ {. R
break;8 J. E& S7 R7 m. A' |- \
case "february":- Y! P- J b m+ v1 L
monthNumber = 2;: ^% h+ E3 w/ z
break;
/ k; p7 G& o) p& j+ {0 J case "march":
6 S* `, ?9 }% y( d/ C2 X. G5 x monthNumber = 3;% B- K% E: u9 R
break;
" w2 p d; K! ?8 k- Z% ] case "april":
l v9 H0 P+ ~% l monthNumber = 4;$ D3 ~: G; W6 P
break;3 w% ?( |3 i( [5 V
case "may":
: K% a, [0 V5 D/ `7 ^. r monthNumber = 5;) Z1 ?+ V0 J- W4 D2 J
break;
% {6 J% o1 i, V9 S" m7 ` case "june":
* B, U' p$ j" ~$ W monthNumber = 6;3 n8 Y" w2 b0 S! F- C& }# B" g3 w0 F# r
break;' b6 k- s' n V
case "july":3 B6 Z* q V- j0 I
monthNumber = 7;' Z6 z+ Y5 Q9 W( U
break;
% E) X& O! r& ~4 n7 p3 J. D2 }3 s case "august":
) n1 L6 B0 q w& L8 l monthNumber = 8;+ T. K0 j; c, v
break;
9 S2 X- L1 |9 F6 z% t case "september":( c1 ]1 ^1 ^8 d c: u
monthNumber = 9;5 N% n4 Y' f/ {* _, ?3 `3 a- L
break;
$ ^8 b$ I0 \8 n c. [ case "october":
1 p9 G [* Y. s2 f! k5 j& k: ` monthNumber = 10;
' e9 }3 ~9 R6 S7 l! f- I9 m8 {, P( n7 X break;9 t# a9 }1 |4 n3 ~
case "november":4 r Z8 e. \9 ^7 e6 o
monthNumber = 11;
( f/ {+ d; i. D break;
- Q7 G6 K5 A5 ]+ ~% o7 ?3 q$ x case "december":
! F" L: x% ~, N5 h, z$ b" M monthNumber = 12;' J6 K9 a( K0 t9 V
break;: M: @* p: ]/ v$ E$ P9 b
default: % T) M6 v! @, H7 q8 x3 x
monthNumber = 0;4 r# m4 M1 v0 w- V, o) C' t& s) w
break;
1 B% Y: X. h5 g0 I$ I }4 p( K) M- I. e
$ r8 o. K) U+ s0 D; k
return monthNumber;- K) w- p. @9 m# W
}
! u! S2 \' D' u0 z+ ]+ L
$ ^% G( {# E. ~% ? public static void main(String[] args) {3 ^; r& X1 t# R* w2 a+ C- Y
$ y1 S6 o+ _3 m$ P String month = "August";) r3 C/ c) R5 M, M7 K- t
' i+ |: N* h1 f$ k5 G1 r/ K! T
int returnedMonthNumber =# t. D6 D1 ]. Z2 E: _) Q8 C
StringSwitchDemo.getMonthNumber(month);$ a2 ?6 Q) I' j0 w; Q# V
4 A! W* A+ @" g
if (returnedMonthNumber == 0) {
5 B/ g% I' i+ R+ U1 b: Z1 z% Y& a System.out.println("Invalid month");
0 o& u$ v& @ y } else {
- X( k8 m- b3 S3 g, E+ ^ System.out.println(returnedMonthNumber);0 O/ V1 |8 I4 d* s
}1 |6 R/ r: ?' a% D4 e# s+ x! a
}6 v0 z, Z* j$ q9 e: G
}% D; x' |5 B) S' ?$ y: p( Q
从这个代码的输出是 8./ i4 @1 W. ]& N$ I8 W
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
, }" I* t! f3 s+ [9 g; M) F6 z
+ A" K0 d8 S5 }9 j& pstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
% Z" x1 f1 t, c
3 @! W3 J3 z! ]) {% M8 Z4 ?$ C串小写标签。
4 \& L, x8 j4 K2 E/ H注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个* F, ~3 V$ G1 w3 H' `
. r2 S9 X. z) Q; E
NullPointerException异常被抛出。
: S4 M8 \5 `; @本文转载于toceansoft.com |
|