|
|
一、switch语句的使用
8 A+ m) Q6 a3 p) z. v$ C" Y: J" f而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
$ Q5 L7 j0 q, S: _; u3 r+ ~0 t- j9 W9 i$ b8 {) \# [5 z
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始4 V' }# `' `- o: c$ q
" I5 Z7 q8 S" @( j( h1 d1 [类型:字符,字节,短,和整数(在数字和字符串的讨论)。
8 [ c9 y4 T9 P+ R- L& Q% e7 n下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值3 x( m0 A* J+ u9 ^8 Q2 `# V- {3 _6 o
# G, r/ b& K* ^,使用switch语句。- o# B0 O+ {, _! {* ^3 `) s' U
public class SwitchDemo {
' \0 _4 X* F5 F' I/ ^4 d3 Q) t) b public static void main(String[] args) {& s2 T: Y0 g0 H+ {
8 F# H: r% x- M h* V int month = 8;: Q1 }" U. E0 o. T+ }1 c) H% L
String monthString;
% G1 ?8 g# ^ o( `- K) s6 v switch (month) {
0 i3 z! k1 j# C' @# i i case 1: monthString = "January";
8 ]/ D- s3 h' U break;
7 L. N& ]1 M- f# G6 t! t% U: V case 2: monthString = "February";+ k5 v/ `+ T0 a% R/ i
break; q# k5 u/ Q! o8 p6 d
case 3: monthString = "March";
6 D& Y, ~. m/ j" V* e break;8 U" ]7 m8 J4 f9 K( A
case 4: monthString = "April";
: P1 X; |; T" i( [) f. R- C break;
- R/ t5 k. s, H4 X: ^, P! b% ~; { case 5: monthString = "May";
) W' \2 P- b2 y8 Q- P break;- m' H7 Y) k3 ^- ?* D4 E5 H' u9 q
case 6: monthString = "June";
K4 S& q; ]) O0 V, o break;
( z B* H: V( a4 t" P2 S9 n$ T case 7: monthString = "July";8 T$ W& E8 p& M
break;# g2 ?8 _3 G( x, }. p0 O
case 8: monthString = "August";
# d2 j+ g( I& p9 ?3 s break;
$ X/ C0 k. S. x( o r Y9 p& c case 9: monthString = "September";
, @/ m4 P+ h b break;/ N! O5 W' r% r( h' y4 ?. x* G0 {
case 10: monthString = "October";
# c: D9 Q9 _( {) q- c) u7 j* ` break;3 f- G8 c- c* |* Y
case 11: monthString = "November";$ x8 `8 z% g5 o: U z6 [+ |% p
break;
: S# w8 G2 G; ]# v* ?. u case 12: monthString = "December";* q! ?# N$ y; l e' d6 C
break;% M8 u9 u# t- s: l i! c. a0 N
default: monthString = "Invalid month";
, Y" J& ~8 i: G2 M& \8 X4 I# L+ P W- W break;
* V' @2 X/ ]) h6 y# _; B }. c1 {3 g* `# r4 c6 d; O
System.out.println(monthString);
) Z; b0 k Q7 Q% h: ]0 r }
0 X. a6 Y# f- N7 }( Y}) a9 q0 Y- s! P0 n) {' G/ x
在这种情况下,八月打印到标准输出。
+ ?! h( v- c& f: Sswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
4 Z- z7 ]' p/ e" I" b" t7 E8 k$ R4 j( O( f! H! R# |
表达,然后执行的所有语句,遵循匹配的case标号。3 B, L! i9 ?) g7 y& F
你也可以显示每个月的名称与if-then-else语句:
! ]) l; _) U0 `* C0 Dnt month = 8;
2 w% R0 V, A5 A% z3 x* \, d4 Fif (month == 1) {; E) }7 z( l) W! f8 G2 l
System.out.println("January");/ P8 G3 ^8 {3 r( ^
} else if (month == 2) {
( ^1 M L- r$ I8 e7 \ O' v System.out.println("February");
! M' J) [4 u% V4 ^* h/ u0 |* Q" o}
8 r9 t. U, ?0 P: k. J" B... // 等等
) s ^+ Z a+ I0 m" x: R# w2 S2 f, d4 F7 A1 K9 G7 S* O
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可# d2 t0 W l1 U
3 n$ W0 Z" @ Y# B0 D6 e以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。9 M3 P& f- B. ]" e" y+ N, x
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
( g0 @! H. H( ^6 o# \, o4 `+ x; n) Q- d: A! F; a4 }9 P4 b' w
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论4 n o1 A9 J0 e2 F+ B6 h8 o! v
; `/ v6 R% M! [6 M! X9 [2 ]4 j' Z
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
% Y- Q2 {" c0 ]' x* q1 q7 h' u) c' W, E
空。该程序显示对应的整数月和月,按照年月:( i$ `, K. M2 A: z3 w" ~0 {# W
public class SwitchDemoFallThrough {
' O" \% v8 l2 B4 o" t" R+ j& x! q
# B- W S! a' Q4 f! V& {# Z9 A public static void main(String[] args) {
. o2 i! A! b8 G7 R$ I; q, ? \ java.util.ArrayList<String> futureMonths =
: a1 @6 V8 }2 C# N/ [) [! r3 g; z new java.util.ArrayList<String>();
% V$ I& [$ ^* x' l! }- s$ l! H0 M P2 l- Q
int month = 8;
7 W s( ^) d! z+ |2 w6 x
/ w2 Y" @+ Z0 f switch (month) {
" q6 P" l1 ?. k case 1: futureMonths.add("January");
4 i- `; z, g4 ?3 n case 2: futureMonths.add("February");
0 x& @3 i5 N2 k } case 3: futureMonths.add("March");. d5 K2 ? ^9 ~! p1 X+ P
case 4: futureMonths.add("April");1 V( F+ n) A% k- |5 L
case 5: futureMonths.add("May");0 K2 Y: ~8 y. v! w& Q3 t5 o7 o
case 6: futureMonths.add("June");4 R) F' L$ o# y! r8 e
case 7: futureMonths.add("July");
3 ?8 Q8 X, D" a) _5 m) J! W4 J; ? case 8: futureMonths.add("August");
! g `6 Q7 A$ n' }. n4 ~ case 9: futureMonths.add("September");
" u' c' M7 g7 R" ^7 a- p5 H case 10: futureMonths.add("October");4 ~: }- _, _+ Z4 q* d- u& m
case 11: futureMonths.add("November");
# k/ g2 A. Y/ ?3 Y) X2 w7 u/ B; n case 12: futureMonths.add("December");7 H+ T- o+ |4 ?' t* w' c
break;
+ S4 W: O# m) q3 d& t( }- o( H0 E default: break;, r$ G! e+ E O C, e
}
0 U5 I9 K( D0 h% K' E8 c9 C6 P4 o& j/ d( `
if (futureMonths.isEmpty()) {
3 j- h6 q3 z& G3 k8 @ System.out.println("Invalid month number");& x6 q7 q6 ]$ L' c* t
} else {
1 n3 {& T$ M; {4 W, k for (String monthName : futureMonths) {
+ l8 `3 T/ J. N- ~ M. Y# s& A System.out.println(monthName);2 v; g! \% K' i8 T$ }0 w9 Q. l
}9 B$ J& G0 A0 u
}
0 l! |$ R' d; ? }
L: B8 \! M3 W8 M. D}
4 A4 a1 x& c, v8 y' u) e这是从代码的输出:
5 s2 ~- U# J/ f5 @/ q) b
$ q! [0 P1 D6 g5 EAugust$ K, ?! O- L9 V8 a. G1 C" _2 \/ ~
September
/ [8 [- D2 X( aOctober
7 i: v) U# ~4 o% ^1 G. k! l! f. YNovember
- V, g/ w" `) bDecember# e! N8 r7 } j
- z/ d6 C4 k! ]+ L- }从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不 J; e4 c8 f, P0 l, f! L0 H
N) _. y$ }& c0 ^1 K" w4 \容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
0 U" I4 F$ l! V* o E下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数
1 r G5 r3 a F
/ v) Q ]) j- U1 j" Q6 X:
8 U, y. b; D5 s! m, ]. O6 q; g4 d: l. t% Dclass SwitchDemo2 {
$ N# |2 Z/ Y3 G+ ~. x$ |5 x public static void main(String[] args) {. d% K/ q6 f# L6 [
3 B8 M: A8 b- \8 |) o9 o( ~1 X
int month = 2;7 f6 f# L9 R6 h
int year = 2000;9 O" c; O# @8 ~
int numDays = 0;# B/ [9 `! Y% o4 C# U v! S* {9 \
- T) k# i" F F- J switch (month) {
/ i, [ J+ Q2 F+ ^ z; { case 1: case 3: case 5:/ ^0 n; T( [: G$ p; k) e& O% _3 R
case 7: case 8: case 10:. \! e+ N3 X h8 u0 c
case 12:- u! T3 n6 M0 B3 l K
numDays = 31;9 K# j% R' @/ G" z
break;
* _( y v7 E' B$ t7 [$ k& G case 4: case 6:
8 _" { N4 S5 r& \ case 9: case 11:
- @0 k3 [2 h- s8 p, o numDays = 30; v/ J t* M3 ?8 @
break;$ z M! ]- l+ E3 S! Z% V. e8 n
case 2:! f" {7 y( Z5 x
if (((year % 4 == 0) &&
K* J4 I! a0 m6 _# u* h !(year % 100 == 0))7 K) y: [) u* m$ J' j' X
|| (year % 400 == 0))
9 i7 x& ?. _' K+ s! G0 ? numDays = 29;
: v2 J1 g# a' y8 E+ c" K z else, c+ n) D# r; t" M! D8 R+ y& f
numDays = 28;
' e- ^6 E* S$ g) p5 P+ l9 ?2 B break;0 A) W6 E4 M8 n1 }2 i; U. W; Z8 |
default:6 b3 r) y% c* Q+ b
System.out.println("Invalid month.");
, J" E. d5 ?2 d break;; {! D1 S4 T6 B/ H# X
}) K4 I3 P; g8 z( y; N* L6 p
System.out.println("Number of Days = "
. p" \' p' s1 {0 J* @ + numDays);
% [! J6 E4 W. C0 E) q( F! `/ C }; I% ]2 ^* i4 m/ N) Z
}$ s# M5 ~! m, G6 k! `
这是从代码的输出:
0 q' P( B$ }0 l2 L% v: q: \Number of Days = 296 }' n5 b% w( G! i" l# y5 `+ K
" U) e+ e/ n" o1 f9 B3 z二、在switch语句中使用字符串
# x% h4 T; D6 c在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
4 @% k/ j; Y" O- |+ c- D& a" D0 N
4 P- k7 @/ U+ Y% q/ @- cstringswitchdemo,展示了基于字符串的值为月的月数:
! b j/ w/ p2 `0 S7 M$ a' V# r) y
; m& ?/ B' v, x, T) R) upublic class StringSwitchDemo {, W u9 n' m9 w
8 G" O5 |- J5 q. r public static int getMonthNumber(String month) {2 G% h& w' V. t
* j7 Y* z: C6 M1 \
int monthNumber = 0;
; d) Y3 d1 ^ }7 [4 q6 K1 j
% `7 H8 a6 P6 V+ _% [' S& F/ d if (month == null) {
7 D* V; R% I3 [/ x/ y return monthNumber;
6 X; f( r* a8 P- ^4 b$ E& ] }5 ?) }5 M7 P. r# d+ C2 _; X
, ]5 E0 A, E( t. O+ y( [
switch (month.toLowerCase()) { w9 Y, @: X4 B! u
case "january":
" v4 h2 h- {8 e; a) i: m# A monthNumber = 1;" Z9 ~7 O$ [7 R z- i& K5 O
break;1 ^8 `9 f" s( v( ?3 e! f
case "february":& N/ P" l" L6 m, {7 A6 I7 ?
monthNumber = 2;
8 Q- B- A0 ] Q# h break;1 R) Y$ n7 [* _: G* b9 n# C" v
case "march":% M$ l9 R0 h% M5 `1 f
monthNumber = 3;
$ ^/ x+ Z' o1 H9 g0 e break;% R3 a, e: n% R: S: ? G! x
case "april":
! [& V/ C6 c" d! v" F8 j& H8 O monthNumber = 4;
- O8 s5 O' K, P3 h1 w. K- n break;# h% e2 L4 o6 R) v% `+ ] G
case "may":, P+ E) [3 T1 p0 C' h
monthNumber = 5;
: z' F/ _9 L- X a9 N break;
: n, r$ A/ V- X, @& D3 Q case "june":
7 X( m/ k d2 x, G7 w monthNumber = 6;
; V% E! f7 A4 B4 z' t break;( u/ m6 [/ L/ W$ e# W; W
case "july":
3 z1 ^# V& a1 R) ~ monthNumber = 7;
4 W% i+ Y( G7 A. i2 n- x break;- F$ M: s$ n, A/ N6 q
case "august":, G. f, G& j) ]. [* a
monthNumber = 8;0 \! o+ o4 r) d! j7 k" A
break;% x, a: v& z$ Y, w3 x$ a+ N
case "september":6 l: B+ c9 }! t- Z) p' q
monthNumber = 9;
% N2 h' k) v3 R2 e break;6 ~7 L! F- O" R
case "october":
: z, S& j% q$ B& d' V monthNumber = 10;
. r; m$ \6 \. O1 c break;; W' }# m- ]4 z9 |6 x
case "november":2 M$ u1 \# P. W" ~. g( u2 A* }7 q7 F4 u& ^$ i
monthNumber = 11;
7 p& W+ M5 w- s. y6 E break;6 j0 q! E2 ^8 O0 c0 p1 G5 w
case "december":; u6 I8 z9 D4 }- i. a9 p
monthNumber = 12;$ c6 `8 q& D" [) q; V+ ]
break;' U* f+ z( q s' w+ |6 _. ]
default:
2 F. c- O" K$ Z. ^0 ]( [' A( N monthNumber = 0;6 P* V9 ]9 C' l8 b
break;, R- [% w+ F O
}* z" R! |0 \ ]+ b
8 h* y% ^* M. D+ ? m9 E: {5 o return monthNumber;
. X. w# U: Y1 z8 c }
7 J% b5 L% y9 _( I6 F1 n2 g& p1 K1 n4 o+ H7 c) A* n
public static void main(String[] args) {
6 ?- E. E- j2 r
+ h; F/ J6 a* I: [' E String month = "August";& a p' O, |% n' D C( O3 d
3 s; S1 o* |: O/ F/ L8 |5 k int returnedMonthNumber =4 S0 W$ r# x! V8 S
StringSwitchDemo.getMonthNumber(month);
/ b# g; `& c- Y
4 d: J( f2 C& _* G- h if (returnedMonthNumber == 0) {1 E F( M( S9 r/ Q8 C
System.out.println("Invalid month");
! r( V* W$ N" z4 o } else {
$ a+ k# J; Z( l System.out.println(returnedMonthNumber);7 q9 x0 h3 n3 t9 D
}( K4 X! P# ^0 A6 _) J
}
# J8 V2 L1 L) m# a9 _9 `}! {. q/ s4 Q6 x) ?: H8 J6 ~
从这个代码的输出是 8.
& @, f6 |: R6 `switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了: m4 u$ @0 n' y5 E9 g( _
( z! t* t4 F2 e8 |5 m) M8 W+ [ X. i/ R+ q
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
) A Q% Y2 @# U9 n3 l; Z4 `5 o: N7 f6 Z
串小写标签。
' ^8 |( c+ ^) A/ w" D8 k注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
; n+ J X |2 M0 v# r1 w. ~, `( i+ r7 O* x5 h! I; N+ o
NullPointerException异常被抛出。
: g1 X4 D+ {+ `3 x! X本文转载于toceansoft.com |
|