|
|
一、switch语句的使用 M% N& \# M& ~6 X' s
而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
9 f0 A0 |! Z X( f2 w( T* G8 B' @8 M5 u
. q' u+ X; |% j; d1 W( _& m原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始
% ?2 U5 Q5 s8 L" n9 g- E( F b2 r) R# J) S5 v. F/ i# {/ U% t% d
类型:字符,字节,短,和整数(在数字和字符串的讨论)。& {2 C- {( \$ ^* ~% k
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
1 |' ~1 t6 r5 O: F1 Q* @4 m9 Y2 T5 I4 U8 B' r+ @
,使用switch语句。. j; T( T4 P8 h" v+ X2 d. [
public class SwitchDemo {: ^1 e+ w6 v: D: U1 d
public static void main(String[] args) {' g' Z* O- B& [/ U
2 M* g9 V( p1 J! W! @4 b% N+ K& B int month = 8;) B% C( y) ]; W2 Z. A p; z" \8 D+ V9 W
String monthString; N/ J" _$ Y4 }
switch (month) {. C. m9 m& n' B5 T$ v+ x, K& K
case 1: monthString = "January";
2 v1 p) ]/ C* B& x7 n3 h3 M* ^ break;
9 X" ]" V+ \2 h2 e' ^ case 2: monthString = "February";
~; D. B$ Z, u3 @3 | break;
: d; f( g1 {" a case 3: monthString = "March";' w; z, Z. @5 x; u
break;; H# ?* K. A5 _9 N; } k
case 4: monthString = "April";
; F$ M9 `7 P# ~$ J9 Z% } break;$ z9 O& c- R5 I3 @1 e
case 5: monthString = "May";# U8 [; ?' y, \. i, e
break;8 }6 @# p% [( r/ J4 q9 u
case 6: monthString = "June";* j8 M1 ]1 a( `, K/ w8 O
break;4 y. B5 P# ]. S
case 7: monthString = "July";) h! r! R$ [" X# i8 x% G. R l: D
break;- L" S9 @5 q5 K2 q1 n3 Q+ `7 J) S
case 8: monthString = "August";
8 x# ?, K) W! F3 ]2 k7 c5 R% H break;1 c9 c& ^0 I% V. n; k1 _
case 9: monthString = "September";
( p6 k7 j% s$ ^8 P' J5 \; c2 } break;8 U, `5 f2 C* \8 q0 C
case 10: monthString = "October";
% Z* E @6 r h8 V, r* A' u break;
. b2 w* G+ R; @1 y/ v2 J- K case 11: monthString = "November";4 j5 j0 Z$ d+ n$ G. n
break;! Q2 W! Y3 y. s3 ]
case 12: monthString = "December";) p3 t) L( s, z( v4 U% H: `
break;
# K2 @; I3 F. Z5 F5 f8 |* |' D( B default: monthString = "Invalid month";
- C6 y6 Z7 d& N' \) U break;0 s% Y( E" z0 ]
}
- K" _, p6 T- H) G System.out.println(monthString);
0 }8 j+ y# {# c# c }: m6 ~4 r$ r- x) N1 k* f' a4 f
}
" R( z) C# H1 H# w# j# V在这种情况下,八月打印到标准输出。
# @! K0 m% v3 r5 R9 M5 k- Jswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
# u8 \5 s7 ^. q; b5 J! R. v1 X# P; l$ H% f6 \2 s; ^$ P6 B% @
表达,然后执行的所有语句,遵循匹配的case标号。
, r( C1 @: k: E8 U3 x9 c你也可以显示每个月的名称与if-then-else语句:0 C& J- | v7 Y& K: I7 ~( W
nt month = 8;& M# Y& t. e% g1 [0 ~# s& @
if (month == 1) {
: o! h) d1 e, l1 d1 j' k System.out.println("January");6 G1 E1 _% z: c D
} else if (month == 2) {
* c$ q: {5 K! M! C System.out.println("February");
" p. T5 E6 Y$ P}
& d3 j& k% ?, j) a... // 等等
j9 X( p* Y8 q$ v
# v# a$ r1 O' l4 v9 ]8 v9 h4 |决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可
& \4 W5 Y$ U" }; _
5 k. K/ L! J* U. }; F' v以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。
$ I7 F0 x3 B2 f. V) V" H1 ~7 o4 X另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语/ @% P5 D3 \. a/ X2 e/ X
+ v3 ]9 L$ X- r4 E. N( \句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论5 v$ q; u" r" S7 l/ t+ w' A( [
4 M# k! q! g% R% ?* i5 ?
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
% K" ]& b/ k+ D. }1 B$ S2 {. f
* [+ x# Q& K/ ` t空。该程序显示对应的整数月和月,按照年月:( z& [+ n! v2 [9 f0 {
public class SwitchDemoFallThrough {- O1 q* {# g. C$ h- X' y1 ^9 z
/ L+ r+ W* X7 G* Q( {
public static void main(String[] args) {
; t9 ^2 F+ U1 O! m5 g# K java.util.ArrayList<String> futureMonths =
; p# y% Y6 a. q) K new java.util.ArrayList<String>();
8 k0 C3 b; l' B$ G7 t7 \$ p# a6 e3 s
int month = 8;
, r+ c) \6 a1 W- w- r6 {$ ?/ s0 Z4 T/ T0 _0 Z9 I
switch (month) {
1 N! u' s7 t/ c! Q. m7 z+ j" H9 Q case 1: futureMonths.add("January");9 `. [* A5 `2 F6 S
case 2: futureMonths.add("February");
+ h2 U# H. b4 K case 3: futureMonths.add("March");* ^- q+ [7 z2 H
case 4: futureMonths.add("April");
' {; A! ]1 ^- H, Z0 | case 5: futureMonths.add("May");
# ?2 T% q" p1 R! V m case 6: futureMonths.add("June");
* @( M* Q5 r( }& ~5 Z) g case 7: futureMonths.add("July");7 s1 M, b: b. C
case 8: futureMonths.add("August");
/ D, g; L4 y0 v, T( k5 o( L3 ] case 9: futureMonths.add("September");
! }4 \# E7 S/ V8 } P case 10: futureMonths.add("October");
9 P1 l8 z" S8 `% I case 11: futureMonths.add("November");
9 g, K$ w2 W* j" g6 S) @ case 12: futureMonths.add("December");
2 O, u1 y5 d J/ x* K break;& d7 Z: O9 d O3 A3 ?* Z
default: break;" o4 l' Y* v3 ~5 [
}
e! p3 f6 k) P
& p& [! {9 v# S9 q1 w; ]/ _$ J if (futureMonths.isEmpty()) {
2 ^/ f; X) S9 [' N/ ]9 C System.out.println("Invalid month number");
- P$ g5 J/ y0 D5 M1 K% p } else {* K7 w0 g3 w' }- I( Q
for (String monthName : futureMonths) {
2 x: B; y4 i- l9 P4 Q4 @# \ System.out.println(monthName);
. `1 j, Q$ F6 L1 W: L2 r) _4 N }
" y1 B: t) `, k, t' G9 y } g% w7 B( B Y$ r0 x3 k
}6 g* N0 ` ]/ b; u7 P7 |6 s5 K
}: T Z; t3 {5 ~5 |' M! {8 n2 Y2 ?
这是从代码的输出:
" G" Y7 C3 _ r
! k7 } n* i1 h' IAugust
) y) R" C' E, d; \September
. T8 \/ a* q' f5 @/ q# vOctober
7 R$ Y. v- p' a O; q' NNovember- e0 h; \ i$ o7 y3 Z
December
, m2 s) X3 y# X. g- f: r- F, b( V& D' r4 k6 H% T' W* P3 h- W' n8 q
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不) x/ u! z& p. } B8 S+ F
8 o$ k) D) J: X7 O" T7 @
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
( B6 S2 u. i( `- _8 ?, n下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数
! u, l# S8 x# f+ T0 @# T
+ Y# G+ N/ K2 B% f:0 s8 V M& Z* t2 y. e0 B# i0 j9 j
class SwitchDemo2 {4 w6 `. |) x) j$ \6 `" ?
public static void main(String[] args) {- i" o; K( f% z6 q# ~% p e. p; Q
# ~; F. {, @9 N5 v
int month = 2;7 V, S3 [4 G* y% J- v8 j
int year = 2000;
' z# s" }3 B$ B. ? A int numDays = 0;
6 g% X, f. J6 Q" s+ s" F1 J* K$ Y. T: q) n. K) G4 G/ V$ @
switch (month) {
8 |. _9 A: E$ Y5 M# `6 z; B2 X case 1: case 3: case 5:( g6 H* y( N0 e+ Y0 t% W% p
case 7: case 8: case 10:' ^' ~- g K+ y
case 12:
, @) R/ C- S) n w- `# m' ] numDays = 31;
* U7 {2 {3 P# D- `& ~5 F break;
6 p- I3 u6 R, [. i' v4 v/ V case 4: case 6:0 h1 R# R- f. q6 z) I. k
case 9: case 11:; w# W& ]. F. X0 b# Y3 M
numDays = 30;
v7 Y% v! |/ D7 T( ^ break;8 k1 ]2 z- b5 O/ O b
case 2:
9 T6 h5 c2 {) W1 B( o if (((year % 4 == 0) && 1 e; @( B* o8 @5 p
!(year % 100 == 0))
* d' }. z' c8 R$ h/ Z || (year % 400 == 0)); y" n+ V8 R& {+ r, o. ~2 n; b
numDays = 29;" a, E2 J E8 n2 t5 J; d5 O' z
else
$ S8 X7 E0 s+ d% M5 L3 i7 L, v" Z numDays = 28;, x4 @/ x7 _& d. |1 a2 ?
break;
6 f8 X7 E5 A% l& Q default:
6 V3 e! H: l; k5 F+ u0 V System.out.println("Invalid month.");- p5 v4 e6 P/ A- K4 m
break;
; q1 Y* n" s0 g: w }
0 o+ T* R6 g7 e1 [: e System.out.println("Number of Days = "
; V8 U+ b$ V* n! i( B8 R* n/ M + numDays);
$ V& V! m s4 t: v# @9 U9 n ~ }, b5 a+ Q' @( n8 ~! O# `
}) ^2 ]( b7 R, u8 n& P
这是从代码的输出:7 q: O( q6 P7 L( d1 ]% v
Number of Days = 29, g9 y' n. l/ ?. I6 Z
3 \% e% d8 j$ X) m9 ^, W1 v+ K
二、在switch语句中使用字符串
, h9 v1 ?( }5 |8 ?$ x/ M在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
; g5 x+ i& }# f
r/ B4 H: Z0 z& O- Q; Dstringswitchdemo,展示了基于字符串的值为月的月数:1 J1 }& Q2 z+ m, F
5 j4 h5 h! s8 x# ^: `7 ipublic class StringSwitchDemo {: U* a/ X, e# t. d' U% K) {& _! v
1 P1 L$ C- b# |" Q& V) i$ @' |: @
public static int getMonthNumber(String month) {: O, F8 R! H1 G! x1 j( O
; \! G" ?6 \. P int monthNumber = 0;0 H! r9 F& c* B# a+ L6 n: ~
- e& E) E2 `/ X! I+ P if (month == null) {
: F1 t: Z) U% [% t7 ~$ N& X return monthNumber;% p8 Y0 m" G- E2 x' k
}
7 |% Y4 v$ s( q3 z9 E, I T- E6 O% |/ W3 N9 ]0 n E2 q9 D, b5 o
switch (month.toLowerCase()) {
$ Z& R- z" o \( O case "january":1 E+ z2 [( J. M1 q
monthNumber = 1;1 c7 ~3 v5 \6 w" f' a' @0 c9 u
break;
3 |3 V4 `2 _; P5 l case "february":' L% @# _4 f) E. q1 P& U
monthNumber = 2;6 m9 B1 A: _* c! a& i
break;
: I* t5 m" C5 S3 M case "march":- t& w: N, R) [4 v/ N: n
monthNumber = 3;% }0 z! D! x; ^3 {! }- L
break;
9 b, _9 V/ @9 F( o1 w! X! [ case "april":- c- \1 ^3 M2 ^7 i' e3 A. |0 Y
monthNumber = 4; [# n" x @% s8 B
break;1 n" M" W8 D2 Q
case "may":
[3 A& |' S0 `- j, N monthNumber = 5;
% K) G& ]- O8 \" ]' R9 V+ h9 l break;
# X+ |) F* y' ~! z4 T5 T8 G( O, p case "june":
! c2 O+ @/ \8 Y. J monthNumber = 6;
2 C) B1 n; ~0 `" c1 v% h3 R, A0 M break;
7 u# q8 e I% H2 }' L case "july":
5 d! ~1 j0 T$ W2 r# |# E monthNumber = 7;9 g0 u+ m; V2 T9 T+ I; U
break;# G5 d3 A2 D- z3 U
case "august":
5 x, D% f+ N) h _) [ monthNumber = 8;$ h- |6 F% g& V- ^% t7 V# i% S
break;' p, N3 O; `5 H! i% [" D) O
case "september":' M, h) b& f- O. v
monthNumber = 9;
3 C! k6 Y& a/ v( u break;" F2 N# s5 u7 \' L3 U( Q
case "october":
+ W) s, @2 }* c2 W% F. C/ e! g* h monthNumber = 10;
4 I) V, {) z, x2 A; Y" g break;% V, }! F$ x4 U' a! L' d: f5 J
case "november":
7 y( V& B! j. w, O monthNumber = 11;
6 h* v& H6 P% l% j: [/ C5 h break;3 L% Z$ w: `' u! S. A/ w% O
case "december":5 M& P0 o1 S/ p: v e
monthNumber = 12;1 `% f! q/ H0 D/ R) K9 P: |3 ?& f
break;
& r" |# r `; a" K* O default:
, A6 @0 T, F% V& x; M( c! N monthNumber = 0;
2 A8 Y9 |' \* z' `6 H5 ^ break;* u& p% }0 _, _' s
}
. Z" g5 |& d+ ^3 z* b
0 P# A" v5 b' B1 D: _2 }' }, r return monthNumber;9 h Z1 Z$ U3 h' P0 F
}
3 j$ p, c4 C" Q2 I) c3 N8 D* f A2 [
public static void main(String[] args) {
% }* x' d) d: n4 T* L' ^9 U C( A6 I0 m1 n9 D
String month = "August";
/ H3 {9 e' ~& j) I+ O7 z0 O* Q7 y! A+ b" |9 z2 E4 i
int returnedMonthNumber =
/ T% [! m/ d& \( `& q StringSwitchDemo.getMonthNumber(month);
$ L$ d6 B% l1 x$ Y4 q
1 c! q. s# `6 s) G/ I if (returnedMonthNumber == 0) {
# E) Z+ C2 J% W4 A/ T: i System.out.println("Invalid month");7 V5 w2 c& q( T7 [. c6 g1 h) g5 X
} else {6 _9 _/ ?! H4 U
System.out.println(returnedMonthNumber);
u9 M" u5 E1 [; G' t- ^ }
# S0 K# B [7 s' S1 S' h9 D }% q( q8 J) o" N* w6 M& D
}
4 S3 j, r1 G2 _: a, f% m" Y7 k从这个代码的输出是 8.' o Z" t- z2 Y, t, e! Y
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
: T7 ]. ?/ {2 k( _ x, T' A
0 Y( ]$ u9 v2 V3 m7 @ r( V( Ystringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
0 Q5 z* O/ _. n* N+ L8 y
$ ^/ P: `: R4 Q; N2 u串小写标签。1 X4 |7 C! o- }$ N; Y
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
6 D0 @0 Q8 E6 p* m W9 q5 L. Y+ o* D7 V! L8 L
NullPointerException异常被抛出。, ]! S Y$ c( I0 {
本文转载于toceansoft.com |
|