找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 618|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、switch语句的使用
& T5 M( G) `8 e# M0 r而如果再和if-then-else语句,switch语句可以有多个可能的执行路径。开关与字节,短,char,int和
: v, Y( k- Z0 k$ g& H( Y
, V( d) t4 T/ ~8 m+ c0 M原始数据类型。它还与枚举类型(在枚举类型的讨论),string的类,以及一些特殊的类包一定的原始
1 Q- w* q/ \4 i( ]
9 Y  R4 n- i3 @" ^( @& m( s; C类型:字符,字节,短,和整数(在数字和字符串的讨论)。
4 ^- e* g/ e7 W$ a, I& j- i. |下面的代码示例,switchdemo,声明一个int的值代表一个名叫月。该代码显示每个月的名称,根据月值( I0 b" ~7 [/ S  F3 N8 g9 P7 b# U

% f; v3 K& k  F  Y% v,使用switch语句。9 F! c$ d) _* w+ ~9 x
public class SwitchDemo {
( ?# u) m5 b- a* U    public static void main(String[] args) {
' O* Z) h/ A# X
# x+ U; S' r7 q6 ?( _  Z9 U        int month = 8;
1 j4 q6 T0 v$ f" y3 s0 W  x        String monthString;' x$ O. R5 a' A0 W9 i* ?
        switch (month) {
1 a5 C; P) O4 m            case 1:  monthString = "January";
5 X( l, [7 V; h% R% H) x$ m                     break;
) [0 @0 A- z" c. r( J, w7 F7 N            case 2:  monthString = "February";0 {3 a* b% y& h
                     break;
* ?/ {8 ^3 K( ^, K# s+ @# w" i            case 3:  monthString = "March";
3 T2 _5 l% \9 [9 k1 Q. D, _                     break;/ B  h/ b6 R" l% k* e( p* v. w
            case 4:  monthString = "April";
% C9 l' M! X# z+ T5 z                     break;
. ^0 q% Y' s- m8 D0 V; y# U            case 5:  monthString = "May";9 R5 r' \$ M. a- R; q- R; K
                     break;
; c# w  n; x. Q, q( l) P8 ]3 g4 P            case 6:  monthString = "June";! K1 S. w& h6 M' p# K' `
                     break;; h4 ^( P2 d. }- c6 x
            case 7:  monthString = "July";! j9 J3 M0 ^: }. r% _$ D/ `
                     break;3 h( q! P4 X8 v* `7 w. @2 N5 L
            case 8:  monthString = "August";" [7 M: ~8 V* H! m: l
                     break;
+ A/ }+ `6 l$ S- @            case 9:  monthString = "September";- J1 T- s" {/ a$ U4 O8 x
                     break;( e/ e  @& u, f; g
            case 10: monthString = "October";$ f( C* [. D+ }) U: e0 ~: R( x
                     break;; }0 }3 H6 M% D+ Z- R' _
            case 11: monthString = "November";4 W8 b/ [  ?1 ^8 X0 c) k! E1 N. _
                     break;
) z- W7 r' v" B" e. d            case 12: monthString = "December";
# i* Q" d) |7 ^' g                     break;
6 m" ^+ F& L/ k# v            default: monthString = "Invalid month";, Z6 ]5 U! A- n; y6 ?9 G, ?
                     break;
# X3 g, D" P. @6 z" Z        }6 z$ M1 f# t- ]0 J. }& ]
        System.out.println(monthString);
0 q. X# t2 E4 `  `    }
9 ?# m! g0 O* q1 E3 d6 ~}
+ C9 L0 p- P. h4 A' q在这种情况下,八月打印到标准输出。2 d9 I+ k' d# Q2 S3 Z; T
switch语句体就是一个开关块。在开关语句块可以标记与一个或多个案例或默认标签。switch语句对其
$ o, H+ q1 t/ I
; B5 V( J; m4 c  i4 R& i# n表达,然后执行的所有语句,遵循匹配的case标号。+ g. ^2 ^. x6 M+ `6 U+ X
你也可以显示每个月的名称与if-then-else语句:
4 i; C6 T) ?. K/ m7 U( Wnt month = 8;' Q  T) h, F) q
if (month == 1) {! ?5 X' \' P( e" L% w) Q# B
    System.out.println("January");
) C8 M% w, y2 K0 A5 J% T$ n% }} else if (month == 2) {1 x3 I7 o4 V4 T8 P6 I; A0 J$ A
    System.out.println("February");
0 d1 E+ M  J& W/ ~& C, ]3 O}( y8 w. u) [0 F, c4 ^: ]$ e1 [8 O
...  // 等等, }  l. b2 w2 J! }. n4 h
6 X/ F- m( w. @6 D& B' u
决定是否使用if-then-else语句或语句是基于可读性,语句的表达式的测试。一个if-then-else语句可7 v( X) c4 J/ h, @- _3 V

( d& P! P0 S4 r! y' s以测试基于值的范围或条件表达式,而开关语句测试表达式仅基于一个整数,枚举值,或字符串对象。3 x8 p# X+ q/ k0 y  p
另一个兴趣点是break语句。每一个break语句终止封闭开关语句。控制流继续下面的开关块的第一个语
7 l8 `: h  K2 N% {/ q) [3 O1 Q& Q1 J4 @+ p2 x( h3 v
句。break语句是必要的因为没有他们,在开关块语句失败:所有报表匹配的case标号后依次执行,无论; }: y( d: A+ E8 g1 \0 u8 U

+ @% A- ^! a/ u5 \5 [后续case标签的表达,直到遇到break语句是。程序switchdemofallthrough显示报表中的一个开关块落0 |+ O; F0 S: {& J# p# ^1 D
1 C7 g4 v! V8 t0 o. k7 B; z; C
空。该程序显示对应的整数月和月,按照年月:
3 N* ~6 D  ~1 y4 X/ [% G+ k1 [public class SwitchDemoFallThrough {
- f/ ~- `, {% @* U* s# Z5 i
) z: C+ ^8 V" k: _1 w    public static void main(String[] args) {' P7 q" `5 C# Y3 v# U: n, W
        java.util.ArrayList<String> futureMonths =* W" b+ v& F# L0 Y9 {6 F3 ?- _* Y
            new java.util.ArrayList<String>();7 Y$ F7 B/ t- _  N7 `7 |5 R7 L; j
% l$ ]& t' Q+ ~" Z5 B% Y! A
        int month = 8;, D- n! _9 W( U# f) Z

0 f& p+ y, @* T& k" N8 R        switch (month) {
! q3 W- w" F# B9 i            case 1:  futureMonths.add("January");! [: a% s  M5 X! K* Z9 r7 b
            case 2:  futureMonths.add("February");% q- Z. o" M% V
            case 3:  futureMonths.add("March");7 c6 C1 T5 U* h! |# V# |. C
            case 4:  futureMonths.add("April");
! ~  ?4 B6 y3 @  V5 O            case 5:  futureMonths.add("May");7 q; [* O6 K% S9 V9 O7 x
            case 6:  futureMonths.add("June");% }  Y2 o. E0 o, j# @  ^7 z  V( d
            case 7:  futureMonths.add("July");( I* I* V8 t7 B, B  w, ^! Y: C
            case 8:  futureMonths.add("August");
' W# X& [$ E. Y( s- C+ O# U            case 9:  futureMonths.add("September");
' `7 y& C* |$ a0 D& M" B            case 10: futureMonths.add("October");
! U& z. J! T" ?1 K* a& p+ m* n            case 11: futureMonths.add("November");4 i: v2 ]& X- ?3 D0 Z1 N6 W; r, N
            case 12: futureMonths.add("December");
( K& d) Y, H5 O- Q  l  B                     break;/ X  z$ z, s  I2 Y  Y, c* g7 c  E
            default: break;, J: G0 i7 J8 \& R1 [* w
        }
* d- b% `9 I; u7 A- k( m/ s% C: e5 E0 a6 E% B! u+ I
        if (futureMonths.isEmpty()) {1 d- ?( [" z; v/ b9 F
            System.out.println("Invalid month number");
  o& Q, s+ t' v8 D; ]5 q$ X9 |        } else {! y8 Y5 W* [+ E; e% h
            for (String monthName : futureMonths) {& ~9 j0 @9 F- ]4 M; b
               System.out.println(monthName);
6 M8 A" b, L1 K0 j            }
: l2 ]! v1 N1 J; r, |7 V        }& l" A  ?+ X6 d+ `/ V, b
    }
; i9 T8 ~7 [  \9 O; w$ `}- v) E) O; D5 \' e8 f# j: K
这是从代码的输出:; ]8 ?* F% C: ^! T: ?% Q) @
) o' o% I" g4 L0 r
August
5 U) u" r1 S2 n3 b7 w" ^$ a) dSeptember) f2 c; I, I  Z  Z
October
7 }. p6 G' z9 N1 L5 y8 Z# s9 yNovember
( s$ h% f' E2 H6 }) c2 ?- X4 nDecember; X! n/ A. [/ v  V0 m& a
; q% S1 a! Y- T  y& B) J6 c
从技术上讲,最后的突破是不需要因为流瀑布从switch语句。利用休息的建议,修改代码更容易,更不  d; t* Y* ~0 s7 X
7 `& E% }2 V3 d
容易出错。默认的部分处理所有的值都没有一个明确的情况下部分处理。
4 n, E, `, f3 u8 ]' n( \下面的代码示例,switchdemo2,显示如何声明可以有多个case标签。该代码示例计算在一个特定的天数
6 K/ Z+ h# g- e% j& F; F3 c! _2 f: C, o& n* G; d
" {6 e7 E; r; ]& z2 Z; B- Y
class SwitchDemo2 {7 c2 b$ U1 W% C  c3 f
    public static void main(String[] args) {
# w+ v" b4 e/ G& p3 p1 w7 S  A  c  g2 p* l  K
        int month = 2;
; B+ p$ B0 H; |6 ^& i        int year = 2000;: a  D4 O: ~9 ^: E2 C5 ^  ?
        int numDays = 0;
$ q# j+ L% ?# p) q, d2 h3 ?( ?0 `1 |4 h5 a
        switch (month) {
  }# L& {* m  g* J  e6 R            case 1: case 3: case 5:6 R9 t. ^* T4 S9 Y+ A/ O
            case 7: case 8: case 10:
$ N9 k6 L) g2 j, Q- E2 F' S9 z            case 12:9 F& _6 r, p! J
                numDays = 31;( c- m, C- K; S( o, f/ x5 K
                break;
3 Q+ B' ]3 |& C) U, G8 Z+ E- ]! X            case 4: case 6:
+ [% W7 e: _5 |1 i            case 9: case 11:; L) o/ S) _# C/ ?8 H' j- |
                numDays = 30;
& N8 b& N, N1 f5 J                break;/ o2 u# n$ o- M" `
            case 2:' h& [" r: S3 x  ]) I3 k1 j
                if (((year % 4 == 0) &&
8 g1 E" b& d1 A% }# x3 R                     !(year % 100 == 0))- M" j' X8 T$ T* r, d" l
                     || (year % 400 == 0))
- g' p6 o, o* p3 n) h                    numDays = 29;$ x5 L) d# O, X9 g
                else. S" e/ Y3 P! j" f" B
                    numDays = 28;1 U0 I3 \. m6 R9 S9 F! Y. o" s1 e  G6 q
                break;
0 G8 {/ b2 J  y2 X9 P% G. Z            default:$ ~3 Z2 v1 i* ]" z: ]4 P
                System.out.println("Invalid month.");
8 Z1 r5 w  G" W* P+ B1 W                break;" H$ j) q- [! p+ ?( Y' x5 g
        }' E0 |  l4 p: ~7 G
        System.out.println("Number of Days = "3 V5 J0 P  X& Q
                           + numDays);; v! ?- }  r+ ]. `2 x
    }
' J- a) n4 E" `4 v$ T# t}( |  r$ v" G2 N, ~* H- y
这是从代码的输出:
. e: V* f9 b$ {, YNumber of Days = 29
4 P' j  S5 F4 Y; o8 B, q2 x8 V, p* ~6 |" Y# a9 x) X8 |: R
二、在switch语句中使用字符串; W) c$ a$ G: b% T( W5 k
在Java SE 7和之后,你可以在switch语句中的表达式中使用一个字符串对象。下面的代码示例,
0 F- s6 J. N5 ^  m. a7 |
; K0 \0 A9 Z$ Q& Zstringswitchdemo,展示了基于字符串的值为月的月数:' f; z7 g. Z2 y9 u1 z

! L! Y2 U6 C3 ~  y8 wpublic class StringSwitchDemo {7 }& T1 l+ K' ]- f3 O/ P

8 k: a; y$ p6 E6 Q    public static int getMonthNumber(String month) {% ?" D; c  `8 i  _- h. G
7 Q3 W8 {$ v$ ?
        int monthNumber = 0;7 Z7 R! R! o1 f3 N

0 v7 v1 k1 X4 F2 q) B- c        if (month == null) {( d' \4 n9 {. |" O" y$ g
            return monthNumber;/ Q# i/ q. C/ H
        }
6 w) x& K! v7 s% T: P5 y2 ~6 D# L4 q' a8 W% f
        switch (month.toLowerCase()) {
9 A8 i/ n: Q: u0 Z- o2 w5 n            case "january":
4 Q" ~* j- Z" w7 \; n4 Y                monthNumber = 1;7 j* @1 O/ _8 t& M" V1 a
                break;
# k" m  q% O- }            case "february":/ \" E2 s  [- u6 M/ E' o
                monthNumber = 2;* L& V* n4 B& t0 z* ?- W5 A; H
                break;* Q3 A2 \9 p$ ~
            case "march":0 h: W3 ]. }2 u
                monthNumber = 3;5 q2 M/ n" P! j4 [3 ^5 K
                break;# h, T2 S( d/ N1 Q+ P
            case "april":- ~& Y( N9 S' u; [- Z( H
                monthNumber = 4;
: m* x, \/ v1 _$ |; L4 W6 C                break;
) n; f; e! h- b, C. V* ~' ~            case "may":
; Y! p! k. J9 i: }. v                monthNumber = 5;+ q- d; m& |4 L, r  N. ^, X5 d
                break;
" U* F" g2 m# f            case "june":
0 [, L; x/ |7 p* P1 [- E- V: w                monthNumber = 6;" U/ F$ ~* T, Q9 ~
                break;
4 R; B. j1 {& `% [. ?5 N            case "july":7 j, s; ^  J" H0 u
                monthNumber = 7;
: U. g, L3 L& P, W                break;8 O$ K( \. l+ |, I+ N# w) V( A
            case "august":
( @/ Z& ^- x% x  Q+ L1 u/ a                monthNumber = 8;
6 g+ H6 T1 }& e: F% Y* b/ q                break;
# i6 O" D5 O* f% G            case "september":0 o( k$ N+ I! `4 c/ [
                monthNumber = 9;
5 ~1 C( d  w: z                break;
* p$ |3 b. ]" K- z* W5 k6 u- z            case "october":6 E) N+ X# h9 @* \! S5 I- |* J
                monthNumber = 10;  Y. L9 D: T; F( K' p
                break;0 T& E/ F7 A6 j/ b' I  h
            case "november":3 f' S. d; N& ^7 G0 }) L
                monthNumber = 11;
* g- F* [; y  F& y% L                break;3 V, I; a2 W8 o- X" E, U
            case "december":
9 K  t$ L+ x; E- `- v                monthNumber = 12;$ S$ D- t# {  B
                break;: [. v6 J) W$ c4 o/ J0 Q
            default: - T/ c- E# P( x7 w/ \
                monthNumber = 0;4 M( P! B9 F' Y: D, _
                break;5 ~' F: _7 a% \5 U+ n
        }3 m4 `0 Y$ D( ], ]! N, z0 a
# F/ @5 Q5 J$ o9 [
        return monthNumber;
# {: x- N  g, W" P    }
' S. d2 }0 r8 y
' ~/ C7 T5 S9 e# J2 p& v9 I    public static void main(String[] args) {4 A$ _7 _! F- V

2 r5 u9 @; h7 r* {% ~" _' d) \        String month = "August";
5 i! u# P5 t7 U' V3 F& s1 _' X2 H$ c+ U% \4 {) F
        int returnedMonthNumber =  o; Z: y8 H0 S, D+ V' d1 Y$ ~4 K
            StringSwitchDemo.getMonthNumber(month);: r. W4 s: u9 J' U( S

2 l2 S/ c# b* h9 W7 V/ J        if (returnedMonthNumber == 0) {
( j. `8 l, ^6 Q0 l            System.out.println("Invalid month");$ c8 v, J9 y0 L1 ?2 ?
        } else {
: N( w9 v2 Y* o: c            System.out.println(returnedMonthNumber);
% A/ V  S! z$ s/ M        }
. y  r$ h6 m- X7 ~. ~% V    }
; d9 m' P" v5 Y+ j0 s  Q}
6 o0 O& q( k; h0 y+ B从这个代码的输出是 8.
4 X2 U1 }9 a4 v( e  n( W) k" ^switch表达式中的字符串与每个case标签相关的如string.equals方法被用来表达的比较。为了
0 z' [+ i; }; W) ~3 q( p. P
; N3 N3 b; d) l1 p0 G& Dstringswitchdemo例接受任何月姑,月转换为小写(与toLowerCase方法),以及所有与案件相关的字符
: s* @" h- a( l) V" ~
5 e/ Z9 c; {) ]( x0 x* n, ~串小写标签。+ u* O; J" |6 n1 X- x5 \
注:此示例检查在switch语句的表达是无效的。确保在任何开关语句的表达式是无效的防止一个/ r5 T! R8 n9 s4 N6 P" s7 e: X
2 q- `, L3 h: N" a* v
NullPointerException异常被抛出。8 \/ n/ U5 t" u8 c
本文转载于toceansoft.com
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-3-23 14:46

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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