|
|
一、switch语句的使用
" A2 v$ J5 i" ^% I0 N6 {) e7 L3 U而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
. d9 b. c3 {7 g# _
h2 U: H( v3 x0 M3 R. t原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始 c' F' z7 q% `/ k
: P" T' k' F, X5 q" {
类型:字符,字节,短,和整数(在数字和字符串的讨论)。
' W5 V8 N m7 D( e6 D下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值3 F- L8 b x2 f# q9 N1 V
& [" z6 B( C; g) w( Q,使用switch语句。
& l k7 M. {* t/ d; Bpublic class SwitchDemo {, s! B$ K( C# I0 A9 x! Y% C5 h
public static void main(String[] args) {
3 a" k" `, y8 C# f3 ~) Y- ~7 U5 R# l8 b
int month = 8;) d" u3 V0 E9 b7 {' B
String monthString;
3 {7 N9 P2 F1 `; c# K/ V$ f switch (month) {
( N& p- J E7 F, U* A0 v case 1: monthString = "January";# C* E; g1 |, d' Y
break;
. _6 N, D7 L8 b* E case 2: monthString = "February"; O9 |* f3 g3 y" l K0 K' V
break;
8 M _3 f4 _( P1 d0 f case 3: monthString = "March";) h1 O# S- w% \
break;
1 V1 M' A/ i! v& T case 4: monthString = "April";, H% G" @! h' k6 L: P
break;
5 l* I- L3 ^# t% i$ B3 \ case 5: monthString = "May";" I7 }- Q0 h2 W
break;
0 }8 \( |% V6 }, I case 6: monthString = "June";: B* W7 c0 y! L
break;
4 |) ?% b* v4 V8 d case 7: monthString = "July";
; o/ l( c( C+ Z+ Z" x& K) P+ J break;
' O6 M q5 U% }- C% o6 e case 8: monthString = "August";
: X) J; a/ a" A8 l9 A7 A3 [6 o break;. |! K0 ^$ b! {, d7 t' ~
case 9: monthString = "September";
. `& @" M6 F, n4 [0 H6 n break;# i& H+ ^. X1 {/ R3 E$ r5 i
case 10: monthString = "October";0 Q6 L6 S0 S5 R! t/ @) H1 H
break;) h$ d( d D4 n2 f* Q: A
case 11: monthString = "November";
$ B; q, U8 L7 u# Y% o4 H break;
$ y% k) l! l* u. _7 y case 12: monthString = "December";
% Q ?! R+ H1 g& v: G3 I6 {- R break;
! Y7 l v- }: Z" @ default: monthString = "Invalid month";
4 k; I V% ]8 k% n' g2 w break;
+ Y% F2 i( p: Q$ d( @3 S# L2 { }0 Y, G+ @, C/ \0 J8 @+ |
System.out.println(monthString);
! a; I/ |# L- f2 D9 B( s; L3 G% _ }
0 e. o2 h) A" U. q, K: h F% B}
0 t3 h5 O6 [! P$ x. f. A; s在这种情况下,八月打印到标准输出。
6 t5 }4 n, Q% T9 k2 F4 rswitch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
+ y" x7 P4 @0 Z5 F3 a: r7 ]
1 E1 b& F8 k4 G6 B表达,然后执行的所有语句,遵循匹配的case标号。- V, Y0 }" i3 }1 a' W( S
你也可以显示每个月的名称与if-then-else语句:; i$ A2 c7 g) \( u0 d+ _, _# ^
nt month = 8;' ~7 C. L) x7 h9 Z7 e: i& E. h7 z
if (month == 1) {
2 l! p; ]1 g5 S- [5 ]/ L1 ?- n3 j System.out.println("January");9 |/ }, G5 J) o* J# F" q
} else if (month == 2) {
+ v* E) M' q+ p System.out.println("February"); i2 N0 Z- S& K) j9 j* y: R
}4 T' n$ N: M& _$ t S% b
... // 等等
7 ~# @% ~( q/ S& X* K8 e* h( E
/ j) l3 G7 d) @4 F! A: e决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可% S2 Q+ I/ [) i2 I- @
L% A" w, w9 X# A- y; F: |) s4 n以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。: j1 i1 O2 r3 C! j2 d- g+ B4 t
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
- y. z4 E9 B1 z% Q$ m: ]9 x5 k m/ ^7 m9 w
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论
! r4 M2 w6 ]8 D, L1 R
7 s. O1 v2 ~& N5 U/ ~% W0 \后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落
9 G% L# X) e: _& h" W+ \
1 Z& V: G7 a9 Y空。该程序显示对应的整数月和月,按照年月:* N, {7 z# ^4 @8 D" _$ G T
public class SwitchDemoFallThrough {7 u9 x& E& v5 b6 ?9 j
6 E, Y6 R# a) I, X public static void main(String[] args) {
, x# f% G ^7 g3 F- u/ q java.util.ArrayList<String> futureMonths =
8 g0 N) D% ?; c+ K3 O new java.util.ArrayList<String>();/ \8 E" M9 X0 [' ~
' m* [. @) |+ y9 |; F! f; | int month = 8;
! l1 k$ G4 y! E" X. c* {1 T
' K1 u' y+ g" R- z% x- M$ Z- j switch (month) {
$ x& ], @! k7 S' ^) v* K$ L case 1: futureMonths.add("January");
" l7 M8 m p1 z2 |& E- c8 `9 |$ R case 2: futureMonths.add("February");# l* n1 ~, m* P- L8 {! |" g# U, k
case 3: futureMonths.add("March");
1 k N8 M4 x8 R+ W case 4: futureMonths.add("April");
: f% J+ H; c3 q+ H8 o, f* l9 { case 5: futureMonths.add("May");
2 A2 m' u: B. A, O9 c case 6: futureMonths.add("June");
8 Z3 s+ ^8 N( i& q9 N case 7: futureMonths.add("July");
" |) `8 j6 ~( Y# p$ |. l0 t case 8: futureMonths.add("August");
6 |0 B- w$ b w# P6 m% a, d/ | case 9: futureMonths.add("September");) ^1 w7 _; Z- i& ~$ F$ [
case 10: futureMonths.add("October");
) W5 l x4 s; y \& q* c! c case 11: futureMonths.add("November");
: y7 C! ]. V( \. n5 O9 \ case 12: futureMonths.add("December");' N3 ~( R4 t% @8 c) N
break;
/ d0 L6 S# ?* g4 G( \+ E! X" b default: break;3 O8 Y5 c; O% t8 U8 o+ Z: P8 e
}: p9 Z/ Q; W5 i/ A: |
2 i0 O' b1 ~3 d: |0 u
if (futureMonths.isEmpty()) {3 J5 Q# C# R) J& d0 S
System.out.println("Invalid month number");
2 ?2 j; s$ j. v } else {
1 y F& P( `) C# H9 B: @ for (String monthName : futureMonths) {" |; @0 L5 t. P' ]) {5 q
System.out.println(monthName);7 t- {/ q O1 |9 C1 K
}, @, s+ P- y o$ u1 {
}
/ o" M' z8 S7 V" E8 K7 a Q }/ b7 Z% E) [( W5 x( S4 q
}
& s3 q+ m! }3 B4 _4 V: |( G这是从代码的输出:9 I5 s- S7 B1 P* n- L
$ K1 W* E( p+ d' t# e5 R$ s
August+ n9 f' b$ Z8 \5 l: _
September
0 G- H0 h' w% ^7 g( \+ o+ b1 POctober
3 J% i2 P9 P2 bNovember/ S* X0 T$ C5 F) d2 ?7 y
December* D. N/ r0 |: q4 B
9 K6 R; q$ Q" ` ~$ P从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不
, [" e9 Y# o; k1 u+ p; B% O3 r, f5 x- Q
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
+ u% b9 F$ T* E( {1 {; _下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数6 ~4 A0 g. L6 `/ z
" s. b2 {1 x" ~
:
7 I* Z& x) U) Q6 I" Y% Rclass SwitchDemo2 {
1 x' G' n5 m% z8 R. P: V public static void main(String[] args) {4 a; ?5 e+ Y; |7 h' M# @
2 E. M w% S# D$ U3 b7 D( K4 o, `
int month = 2;6 }$ a2 W0 z4 ?" i
int year = 2000;% c: t2 M+ X; v8 n+ p
int numDays = 0;0 Z/ w; _; T5 d; g
# j! c5 U; Y& j4 |, z) t) r
switch (month) {4 @; D8 u @ n7 Z) @1 \
case 1: case 3: case 5:
* ^9 s) \$ X3 o4 k* P: \ case 7: case 8: case 10:" e9 v3 E. ^1 }& k/ `
case 12:3 q9 q+ O& P1 k$ q
numDays = 31;- m- O% y0 S0 z
break;9 B: O; X& h9 k$ y8 X9 }
case 4: case 6:% k& s1 G# f7 f+ X+ V* E; ~3 ~
case 9: case 11:% l, X) q" f2 `, r7 w9 k9 ^7 P
numDays = 30;
9 I# @- w* Y J7 d. W; f+ G break;( C# ^* V5 y+ j R1 A$ i8 v- ?9 \
case 2:
- Y1 ~2 M/ y( w) I- h if (((year % 4 == 0) &&
9 w; ~- I! T D- Q$ B* C9 a6 G. t* Y1 g !(year % 100 == 0))
- }8 z4 x$ V5 L- \5 Y || (year % 400 == 0))
7 n6 ?9 K e2 P. Z numDays = 29;
9 K1 T% P& e8 _ @6 P4 } else1 _1 c s5 U3 ^8 [+ d0 o& f
numDays = 28; \* b1 L5 G2 X& }0 a) G
break;$ x& ^. d8 u. J/ A
default:
; M$ ]# ]1 T6 n# B3 z System.out.println("Invalid month.");
9 \" Y3 c5 C0 Z, c break;1 ]7 e* A& C' I6 C& f
}) K& g8 m) z- f5 _
System.out.println("Number of Days = "& i5 u% i2 j2 g m
+ numDays);+ |6 R- i! i0 Y& F
}7 R! _! S' x L6 E, c% \
}
4 t* x3 b: t- J2 Y这是从代码的输出:
" u( b d+ H& K0 XNumber of Days = 29) I, F1 u3 `0 K
! D7 L3 r1 Z- \$ d6 }3 G i, [ `3 @
二、在switch语句中使用字符串
$ [7 T% Z( h6 P; K& N& B- {1 I5 H在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,: @! b9 ]8 q0 { [: c
- {- |* L% }! {5 B
stringswitchdemo,展示了基于字符串的值为月的月数:* w; O3 s3 [( }: O8 j
$ O+ c7 f# @0 d6 w/ c
public class StringSwitchDemo {) b2 S8 c' T" s, \! v8 a$ d
+ b1 ? Q' n" @! d* u! m
public static int getMonthNumber(String month) {
3 W8 s1 Y+ Y! b5 J7 V6 b; W
2 z4 K$ s+ U3 c( N" N7 M& a. V2 @ int monthNumber = 0;+ m1 T$ O$ f! ]# f
$ t1 d# l! S0 y+ T
if (month == null) {1 R1 M% s; c! L2 x5 x$ U- L( X
return monthNumber;4 J* N- K7 k& p+ M- b
}
! C9 O8 ^8 }0 w! m) W$ V: a) s
& ~# A; F9 D+ S0 K$ Z: q2 D* b switch (month.toLowerCase()) {
; {% n" {5 f: R case "january":- v5 Q& r" |$ t L2 j7 ?
monthNumber = 1;
4 T$ o* t! e. c. ^7 d, U, y$ ^% m break;# L) c- L8 S; z# C
case "february":
& t( g! T1 T$ I$ f/ G) M4 X4 l monthNumber = 2;2 H2 S' u8 @9 S5 p" } i1 \% B
break;0 s T, @4 \- o& v5 c% X
case "march":% C e/ P# n- U# B7 o
monthNumber = 3;
% U( H2 o4 J- r2 H break;
8 N8 G0 C! d, M5 W8 |/ U case "april":
4 U- R5 Z' S: j( Z& v; R monthNumber = 4;, U# D) }: C$ H5 ^
break;
0 ~0 k2 U* t5 B* z! g% O/ [ case "may":. S9 D i) `+ y' ~
monthNumber = 5;" `6 g6 O0 N( [* ?2 K& e# l; K* K
break;
: f2 q* b/ }1 U7 o! D" X case "june":$ k" O: o# t$ d# c( E
monthNumber = 6;
" N- b# u H8 B. { break; B X' R8 K% U. R
case "july":7 s0 s ]4 N& A5 q. H: R) B! T6 y4 _
monthNumber = 7;4 S; B' X' Q- ?0 \
break;/ E2 }2 P+ _2 Y( I6 b
case "august":
1 p) A% h! r0 i8 q6 h8 z/ m monthNumber = 8;
7 K |1 r3 R( ^1 Y# H. f break;. D7 P2 Y/ d2 ?5 j/ x/ |
case "september":
" K3 O$ v7 v1 U) t5 x monthNumber = 9;
8 n3 t' Q8 v, G break;; ]( u: k% ?( e% O
case "october":7 t1 f3 x1 c$ w7 z$ k& N$ i) K4 u; r
monthNumber = 10;+ m& I B! H X3 K
break;8 h+ v2 k i' O) f; y, ]" o
case "november":
8 [0 R( f1 o5 @4 X" a% r1 Z monthNumber = 11;
, C2 O$ b$ ?2 ~' @' Z6 h. V break;
) l+ r' o' {6 O/ ^$ M. T case "december":% R) Q8 C: @: \- p
monthNumber = 12;- O- [: Y) e( {0 F% d' o* B. a
break;
; D9 l9 [# q- R9 y G+ d default: / }6 Z, @9 Z0 g, `6 g
monthNumber = 0;
d/ ~/ Q* ]% x" Y+ S/ N2 L break;
+ i. E" @9 B* P$ S$ a }; {! `; c! r m$ Y. E
5 w) t& v+ v! U7 C9 \ return monthNumber;1 a0 T& p$ H6 q2 q0 l3 i, ]& Q
}! }2 s* B7 _% j
' y* ^0 |4 y# \$ f5 Y public static void main(String[] args) {4 n' v$ K! o1 t% Z9 h, U5 n
4 a" S3 S9 K' F9 J, _2 W
String month = "August";
7 c6 s. ]$ ^! J' L8 a/ H
8 y. S3 }, t) g int returnedMonthNumber =0 p5 G, x- h6 C9 c* J1 J
StringSwitchDemo.getMonthNumber(month);
, ?- ?4 h( U. X8 p2 v
% r6 ?$ @! v) \! R5 _, Y if (returnedMonthNumber == 0) {
, C# V# C- W- i, Y/ M0 @; | System.out.println("Invalid month");
- J: ~1 ^, L8 l( b, w: J' Q } else {
/ w- J8 X& F* A; B. C System.out.println(returnedMonthNumber);7 A t4 E/ e5 @) O' u
}. d: P+ Z' q* B1 r% J
}
1 @* }) n9 b. E- L! v2 u}
4 T7 w7 `2 V; {2 o5 _3 F+ r0 o! t5 l从这个代码的输出是 8.* x8 u3 t; |* j) X1 d1 R
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
; Y& Q+ W3 a/ h# q' i( Q" Y- r
4 h. |4 p8 c; m! c0 Jstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
$ C" E% C% ]0 d+ S6 ~$ M% _8 W4 }0 p; R" T- Z( Z2 d: E+ Y
串小写标签。0 D l+ l( A0 B" s5 [: K% m1 w
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个
9 R' t) d a; e& p* K$ a' @' Y$ Z
$ c2 { K1 {- `4 l& WNullPointerException异常被抛出。
" ^ I* _3 \" c3 b本文转载于toceansoft.com |
|