找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 619|回复: 0

一、switch语句的使用

[复制链接]
发表于 2015-5-5 11:23 | 显示全部楼层 |阅读模式
一、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% f0 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
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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