找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 675|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用
6 I4 i- w  O* x/ B- y* L/ c而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
* a. q8 V3 ~7 ^8 C- {+ Z- n  u- q; b1 B" R; S, ~
原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始4 d2 |- ~% I1 }% N7 _1 J/ p" \

& w$ h6 |; G! {" L# s: A3 Q" T; t类型:字符,字节,短,和整数(在数字和字符串的讨论)。( w' i% s( a# Z% C% l8 l2 ~& y
下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值
. A% k9 X. j: _3 l7 w0 t- g/ t
! G4 z  l7 H5 R+ `,使用switch语句。1 R3 N0 ^- t' {. r9 A
public class SwitchDemo {
4 c6 c9 \8 A& c1 s) \0 s6 e    public static void main(String[] args) {6 p* U* p0 Z# ^6 u& g  q1 o$ O

' O3 I5 Q3 H+ b- T( I" Q; L        int month = 8;" c5 R% ?/ U- t& I
        String monthString;
8 b$ j4 A, h, k6 A+ k. N4 Z        switch (month) {
+ T% O0 z* i9 Q: M            case 1:  monthString = "January";
0 a" A6 o* F+ m% B5 A8 G- p                     break;1 o  i$ c, h  c6 g8 Z2 L
            case 2:  monthString = "February";
5 l% @2 e5 C# o$ _* s                     break;5 c" q" q8 o1 q+ i8 f
            case 3:  monthString = "March";* w# p$ e8 m2 O: A
                     break;
" h- |7 g! k; Q# C1 G6 b4 @            case 4:  monthString = "April";; e, E  E& {' `3 M" B7 W
                     break;
; z2 O7 Q4 ~' Y$ A4 X            case 5:  monthString = "May";
2 B! v. G6 J- W9 z: ~9 n* f4 C& t                     break;
4 B) s* y) s% ?# g8 }* |) D            case 6:  monthString = "June";1 ]5 g6 G. u" b# {
                     break;5 e/ M' E/ s( W$ U$ z$ Y0 G
            case 7:  monthString = "July";" `2 t7 B$ q" [
                     break;$ t+ T1 B1 C  k0 h7 p; M( l% ]
            case 8:  monthString = "August";
! _! g3 n" i! W. w5 \9 O# S% o                     break;
8 j2 O0 i8 k: X            case 9:  monthString = "September";
6 q4 d# h9 _, g* C) c1 G- V3 T                     break;: P4 s/ M4 C/ h3 m' e
            case 10: monthString = "October";
% v7 N  t3 `3 p( h7 F                     break;
6 t; Y  f9 S7 F            case 11: monthString = "November";1 \- }7 |2 u- f* ~9 c
                     break;  K; F) j6 W7 N% r8 t
            case 12: monthString = "December";
$ J+ C5 I4 L0 j7 M; x& D" ]                     break;
" A! D1 u2 h3 i+ ]0 G% I7 U            default: monthString = "Invalid month";
! ?' T8 K  [: H+ S4 A                     break;7 D/ |: n  R& b, q6 C. E
        }6 Y' D' d! y. v: a, f
        System.out.println(monthString);
# n) ^; U6 P3 q3 X& o; i: i    }; e4 q; k5 j* r& @7 l
}% Y' J! |  r8 }0 E6 {
在这种情况下,八月打印到标准输出。6 x6 z) i. l8 y: X3 K, r  w- n: L
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
) w! M5 W5 o* C- c: V: l" m
+ l: A/ T. z  |8 W* W) _表达,然后执行的所有语句,遵循匹配的case标号。6 t% F: V4 p6 Q2 V: \. P5 E. V+ w
你也可以显示每个月的名称与if-then-else语句:
7 c/ c0 y! h3 m  [nt month = 8;3 @# e: ^) |! K' n: R9 T- h+ U0 H
if (month == 1) {
2 R' j5 W% h) f! t# W    System.out.println("January");
! h8 T$ O. L3 k8 k+ @3 ~: D9 ?} else if (month == 2) {5 i. M4 M1 }+ g$ F, d- b3 g5 W
    System.out.println("February");7 q9 U7 X* g+ e) U- W
}
1 P% K) j8 a! P...  // 等等
5 W: ~' A8 ~- E: m
; L3 x9 ~: S7 t5 w; b# ~. [, S% |决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可9 O5 K. g8 R  Q4 C# F! G5 {/ ^3 u
! l/ R' Q. X, l4 P
以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。# y( y5 U. N: T3 V- G* j  I
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语0 S3 u7 U6 M- V8 T4 l

( Z# C7 f8 z4 o句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论/ X# u, I& n% c7 Y6 ?
! P" P7 i/ ~: U2 b7 |
后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落+ s) Y$ T3 h0 C

" M7 Q/ V; }, U4 ?空。该程序显示对应的整数月和月,按照年月:
, r6 ]9 H+ g  o9 K+ Upublic class SwitchDemoFallThrough {
( p" H' z, I- y8 V+ C4 j- X0 S9 |% g% h7 `( R. D
    public static void main(String[] args) {
; H; K2 u: t' B; i        java.util.ArrayList<String> futureMonths =
8 P7 G# g3 y% l) D            new java.util.ArrayList<String>();2 |9 Z4 f8 p1 V1 C) A3 }" t+ ]4 T& t
1 @! M  ~0 s. I3 Q" Q( s/ Y
        int month = 8;6 d# D. U5 _; M( `- }' b

! E0 {5 r$ l. ?. c0 g% y        switch (month) {  k" ^2 C' u& Q. T# |9 L, v
            case 1:  futureMonths.add("January");
% E: V3 }+ [3 @- l1 ?1 J            case 2:  futureMonths.add("February");3 E- F% F# c. _
            case 3:  futureMonths.add("March");; b( h% i$ a+ _0 W3 `# d
            case 4:  futureMonths.add("April");# N: _1 i: A8 H0 p1 L3 d
            case 5:  futureMonths.add("May");
+ i/ }7 }9 ^- j            case 6:  futureMonths.add("June");) z2 x5 c( @- k8 W
            case 7:  futureMonths.add("July");
, z1 ]' j# M8 r& ^            case 8:  futureMonths.add("August");, n! Z! V2 h5 X5 ^$ c3 G% i: [
            case 9:  futureMonths.add("September");
* N( @/ Y; R  [7 t: a5 a) |) t+ N- ?            case 10: futureMonths.add("October");% l) \/ }: U- g
            case 11: futureMonths.add("November");
; J% D8 s! h  g: s! i            case 12: futureMonths.add("December");. c* Y- V) I1 Z0 y, e
                     break;
" v1 S; v$ t, S            default: break;$ F4 ]7 j3 L# g. T
        }5 o% i) q! D* Y: Q( v* z

9 W/ j" a" I+ b; a3 B        if (futureMonths.isEmpty()) {: _0 _+ x8 Y' [
            System.out.println("Invalid month number");' f( y7 Y9 K8 E1 r
        } else {
8 N! P0 p1 j, a7 S* K7 b  Z2 A            for (String monthName : futureMonths) {7 T: ^( y2 h6 ~3 `; L" x, x5 \
               System.out.println(monthName);# w4 R$ h! ?( u$ _1 `
            }
; z7 |+ }) i! F        }
& g9 ^5 I- |9 V+ ^& L) j4 Z8 ?    }/ Q1 K8 K( X& I. u, U3 M/ S0 ?
}
+ F8 M/ P. E( f6 T这是从代码的输出:
4 e4 F7 a. X- D* n9 W0 ]) p; u
" q; P* b) `8 C4 c1 r1 {: h4 }5 PAugust
$ Y# ~* g1 l. ?: L  N5 TSeptember2 G6 n! {7 r3 I5 j1 W
October
. z6 i$ R0 h' CNovember
7 \) D$ t" C- ]$ m5 r: NDecember% }7 K6 _, _& ^! ]& p  B
8 Z* O( J% m8 b/ f4 r7 X
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不& V2 s! w" R" C; b, C

* u# s! I& d9 t9 t' y7 g- u9 c9 ]" K容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
% t# U( s! C  r# \& ]/ x下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数; _3 U1 s, u, Z4 o. f: n
7 h+ ^; U& b$ Y/ g7 t

" T! X% x3 [5 @8 hclass SwitchDemo2 {
/ p+ u' \/ D2 h3 q    public static void main(String[] args) {
  V8 S8 f0 y4 c; g7 C& C& `! T' O) y9 k  g0 e$ W8 \1 d" ^$ Q' s: Y  K) g
        int month = 2;& O) G  N  p/ y8 G0 b, S
        int year = 2000;
0 n: H6 R* v+ V        int numDays = 0;7 e0 @9 ^( t: a* I  U) `5 E
) [7 G2 U/ N3 O$ \/ {1 u. ?
        switch (month) {
: r9 C+ B, L( s4 E9 U            case 1: case 3: case 5:
0 ]9 n* O4 J2 j  @% B) |9 H. u            case 7: case 8: case 10:
* b6 V) k. I. N9 v            case 12:2 p6 k- _4 b# `4 F# g7 I6 ?* F3 R
                numDays = 31;4 P! p& `( r" ^1 Y$ Z. ~) ?) ^) {
                break;; J  d1 D& k7 E' R
            case 4: case 6:: l( O# R% D9 ^1 C/ |% H( y: S
            case 9: case 11:) V& o2 t1 F) A7 r; }5 l+ ~
                numDays = 30;
+ f# K! L8 y% `' E  N/ ^                break;
. u8 ?* t$ B6 B% I+ U            case 2:# G4 _2 Z3 E/ ]- z  P
                if (((year % 4 == 0) &&
8 s; ^/ s2 c) `& \                     !(year % 100 == 0))8 h5 T7 o1 X& u- N7 ?( {: X, E/ f
                     || (year % 400 == 0))
/ ^  c& |. O4 s5 I5 {                    numDays = 29;, O% ]1 f1 T! ]' D2 d6 H0 r
                else
6 s* X: Y! ~" y+ }% Q                    numDays = 28;' b: {) \# |+ }
                break;7 Y* i4 Z& g+ L- M
            default:
& \9 k" x. ?  X! q3 J                System.out.println("Invalid month.");
% w4 Q9 n, y6 i) q: q# j# i2 G3 l                break;7 @% s, g" k. D% v3 l
        }
: h2 Q9 l) l: \6 l* f! V        System.out.println("Number of Days = "% D) I1 R2 t* D" ?- `/ d- l
                           + numDays);8 q' ^% L3 j) X
    }
8 w/ t- F% R9 n0 C0 g2 _' O! e# p) p}
/ I. @4 u! z5 L4 K1 l这是从代码的输出:! D5 ~& F9 T3 z% \8 k
Number of Days = 29
3 V: V0 t, D) @# k7 A0 p; K9 O7 Y# B; U: c1 r
二、在switch语句中使用字符串6 ^* P" L; q/ N
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,  \* M" k$ s1 r1 d: `
, V. W$ a0 |3 C* p
stringswitchdemo,展示了基于字符串的值为月的月数:
! h( v) I! X+ }6 Z. [8 ^- y! o
1 F6 T; `8 ^( dpublic class StringSwitchDemo {
( a1 m6 v3 X4 ?) c: N% L( r/ e9 A
4 e, D4 B7 N5 D& ^    public static int getMonthNumber(String month) {
2 ]1 g0 @7 @3 u+ e( L
) F. t$ P8 P: N& a  `4 `        int monthNumber = 0;6 F* H6 V9 F- y

1 \% G& t+ B3 P+ B* S; @( X  ^+ I        if (month == null) {
( M( l' k: u/ j3 r8 I            return monthNumber;
, O0 H- w+ u& m0 W" Y: ~4 E        }
  o% T' z' A; Z
& W6 h7 ?1 `3 k3 Q" K; N        switch (month.toLowerCase()) {
% G# Q4 D3 [% n9 I8 I            case "january":7 d# a8 P4 y( z# t
                monthNumber = 1;. a4 @0 b% z( b! P9 N8 p: I
                break;
  d! A7 Z: R+ c, ]            case "february":8 I( S" ]( w# M3 U! N
                monthNumber = 2;
& Q3 E8 C9 I- D  h& T                break;
' g. |" ?0 k! @. }* V/ w4 W6 S0 D            case "march":! N; V7 Z4 e, K, C+ I
                monthNumber = 3;
2 c5 l# h9 k+ ]: i                break;
7 u8 C4 r% t" C3 e# m6 T( F            case "april":
' e# Y; H/ y4 h( |+ ~; I                monthNumber = 4;1 ~4 l! g& c6 h: U1 W$ ]" c
                break;
1 i) T1 N. t$ }7 [            case "may":
. [1 ]" H$ ]2 a% Y9 y                monthNumber = 5;3 C  L- \& x8 N7 n; p; m' L  L- h
                break;
; ^! b% H3 v3 r# I- x: o1 q4 O# d            case "june":& C7 l& m  U+ ~
                monthNumber = 6;
# Y* ]' N% M" T+ p                break;2 W6 i% H! U8 y' ]: \6 h- _* H
            case "july":) q/ V9 L  v2 e0 ]0 [
                monthNumber = 7;$ u0 Q* w5 {; B& E, C# O, |
                break;
! l) ]( c7 [- }; Z! \            case "august":- i" o/ p5 O# A) y
                monthNumber = 8;% o+ J; Q, }2 t1 v
                break;* l: J7 L6 u8 k' |8 |) T
            case "september":
9 w. u: e5 f5 \7 @+ x0 O" q                monthNumber = 9;
/ p# f, |2 I1 h, Q                break;
* f2 k0 b) T1 z  o( W& q2 ~9 M            case "october":
+ y6 }* _2 U7 h7 E/ `9 ?6 G5 i                monthNumber = 10;4 }) M" ?; g) }$ ^% ^2 H& G
                break;4 l( q3 Y2 C7 ]9 ~+ {
            case "november":  g( I+ F, `3 M7 ?
                monthNumber = 11;' b3 d1 f7 W. S% C  x. Y
                break;
7 V; I6 s7 L* i2 X% K0 i% J2 Q            case "december":
* x0 }% O! M# t; I) i/ K) U& K. ~                monthNumber = 12;6 O& ^6 m! u2 U0 B" u$ `
                break;0 K! Z- V/ s/ C( y+ p
            default:
0 f' C; h0 r6 q                monthNumber = 0;8 g' R+ ~: \& r2 ~
                break;' F! p$ B( c! D1 A0 m' h5 q3 `
        }
  i- b; g: r. A) {0 V- V4 C+ X2 M; u3 e' R% E
        return monthNumber;
2 M- g2 E& [( C/ ]% p# G6 L$ n+ n    }
& f  k+ w; x: c3 I4 a; F9 t; m1 ~) D; h4 b2 |0 `! W3 z( T  e4 }
    public static void main(String[] args) {
) ^" H8 G& o. r# R5 t+ S: _, g
& ?4 v# ~: t# B5 N8 P        String month = "August";
+ a4 {) d0 b. J2 \: i% W9 Z% M' d
        int returnedMonthNumber =
* @4 w, `1 |" K( Z  B  e+ q5 o- [( y            StringSwitchDemo.getMonthNumber(month);
& a5 J% J9 Q5 o
+ m' d! n. Q' a! A: B        if (returnedMonthNumber == 0) {2 V- M6 g% q* {, P
            System.out.println("Invalid month");0 t0 @, ?* M. m$ \7 m: e
        } else {
; g/ ?7 I" L; i' X6 V            System.out.println(returnedMonthNumber);% h% T: d' n  o8 R
        }) k- F' M% Z) q7 T5 p
    }
2 X+ W: ^+ ~0 `7 C}8 m8 ?1 [1 `9 |6 N" W7 ~
从这个代码的输出是 8.+ N, G1 a: T8 s, S! u; f- V
switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
4 T* m8 y3 P9 q* C8 s* A, v' Y9 A9 t# r1 G4 g
stringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符5 H5 k0 ?1 ^/ n  x
1 k! l9 H7 C  _- h& i
串小写标签。! s- `" \! c8 R6 [
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个5 Q" }3 E, Q4 |( I

- D  d2 {% _/ S: H& z1 U+ Y3 R5 U, `NullPointerException异常被抛出。
6 ]; L' O( m( e0 S# Z本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2026-7-23 06:31

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表