Java 語言程序設(shè)計(jì):第3章類的方法_第1頁
Java 語言程序設(shè)計(jì):第3章類的方法_第2頁
Java 語言程序設(shè)計(jì):第3章類的方法_第3頁
Java 語言程序設(shè)計(jì):第3章類的方法_第4頁
Java 語言程序設(shè)計(jì):第3章類的方法_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第三章 類的方法,JAVA語言程序設(shè)計(jì),2,目錄,3.1 方法的控制流程 3.2 異常處理簡(jiǎn)介 3.3 方法的重載(overloading) 3.4 本章小結(jié),3,3.1 方法的控制流程,方法的控制流程 Java程序通過控制語句來控制方法的執(zhí)行流程 Java中的流程控制結(jié)構(gòu)主要有三種 順序結(jié)構(gòu) 選擇結(jié)構(gòu) if語句(二路選擇結(jié)構(gòu)) switch語句(多路選擇結(jié)構(gòu)) 循環(huán)結(jié)構(gòu) for語句 while語句 do-while語句,4,3.1.1 if選擇結(jié)構(gòu),語法形式 只有if分支,沒有else分支 if (boolean-expression) / statement1; if-else語句 if

2、(boolean-expression) / statement1 ; else / statement2 ; ,方法的控制流程,5,3.1.1 if選擇結(jié)構(gòu)(續(xù)),if-else語句的特殊形式 if (boolean expression) /statement1; else if (boolean expression) /statement2; else if (boolean expression) /statement; else /statement; ,方法的控制流程,6,ex3_1 輸入一個(gè)年份,判斷它是不是閏年。 閏年: 能被4整除但不能被100整除,或者能被400整除。 p

3、ublic class ex3_1 public static void main(String args) throws IOException int year; boolean IsLeapYear; System.out.println(Enter the year:); BufferedReader in =new BufferedReader( new InputStreamReader(System.in); year=(new Integer(in.readLine().intValue();,3.1.1 if選擇結(jié)構(gòu)(續(xù))ex3_1.java,方法的控制流程,7,IsLeap

4、Year=(year%4=0 ,3.1.1 if選擇結(jié)構(gòu)(續(xù))ex3_1.java,方法的控制流程,8,輸入兩個(gè)整數(shù)比較大小 import java.io.*; public class ex3_2 public static void main(String args)throws IOException int x,y; BufferedReader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter x and y:); x=(new Integer(in.readLine

5、().intValue(); y=(new Integer(in.readLine().intValue(); if (x!=y) if (xy) System.out.println(xy); else System.out.println(xy); else System.out.println(x=y); ,3.1.1 if選擇結(jié)構(gòu)(續(xù))ex3_2.java,方法的控制流程,9,例子: If (ab) System.out.println(The larger one is: +a); else System.out.println(The larger one is: +b); 用條件

6、運(yùn)算符重寫: System.out.println(The larger one is: + (ab)?a:b);,3.1.1 if選擇結(jié)構(gòu)(續(xù))以條件運(yùn)算符代替if_else,方法的控制流程,10,計(jì)算每個(gè)月的天數(shù) static int daysInMonth(int month) if (month = 2) return(28); else if (month=4)|(month=6)|(month=9)|(month=11) return(30); else return(31); ,方法的控制流程,3.1.1 if選擇結(jié)構(gòu)(續(xù))例3_1,11,已知一個(gè)學(xué)生的分?jǐn)?shù),給出其分?jǐn)?shù)等級(jí)。90

7、-100分為級(jí);80-89分為B級(jí);70-79分為級(jí);60-69分為D級(jí);0-59分為E級(jí) public class IfElseDemo public static void main(String args) int testscore = 76; char grade; if (testscore = 90) grade = A; else if (testscore = 80) grade = B; else if (testscore = 70) grade = C; else if (testscore = 60) grade = D; else grade = F; System

8、.out.println(Grade = + grade); ,程序輸出: Grade = C,3.1.1 if選擇結(jié)構(gòu)(續(xù))ifElseDemo.java,方法的控制流程,12,3.1.2 switch選擇結(jié)構(gòu),switch語句是多分支的選擇結(jié)構(gòu) switch (switch-expression) case value1: statements for case1; break; case value2: statements for case2; break; . case valueN: statements for caseN; break; default: statements

9、for default case; break; 注意問題 switch-expression、常量值value1到valueN必須是整形或字符型 如果表達(dá)式的值和某個(gè)case后面的值相同,則從該case之后開始執(zhí)行,直到break語句為止 default是可有可無的,若沒有一個(gè)常量與表達(dá)式的值相同,則從default之后開始執(zhí)行,方法的控制流程,13,if (i = 1) statementA(); else if (i = 2) statementB(); else if(i=3)|(i=4) statementC(); else if (i = 5) statementD(); else

10、 statementF(); ,switch (i) case 1: statementA();break; case 2: statementB();break; case 3: case 4: statementC();break; case 5: statementD();break; default: statementF(); ,3.1.2 switch選擇結(jié)構(gòu)(續(xù))用switch代替if,方法的控制流程,14,使用switch結(jié)構(gòu)計(jì)算每個(gè)月的天數(shù) static int daysInMonth(int month) int days; switch(month) case 2: da

11、ys = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days = 31; return(days); ,3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_2,方法的控制流程,15,用switch語句實(shí)現(xiàn)成績(jī)分類的功能 public class Grade public static char gradeLevel(double g) int n = (int)Math.floor(g/10); switch (n) case 10: case 9 : return(A); case 8 : retur

12、n(B); case 7 : return(C); case 6 : return(D); default: return(E); ,3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_3,方法的控制流程,16,public static void main(String args) System.out.println(gradeLevel(100)=+gradeLevel(100); System.out.println(gradeLevel(95.5)=+gradeLevel(95.5); System.out.println(gradeLevel(88)=+gradeLevel(88); Sy

13、stem.out.println(gradeLevel(72)=+gradeLevel(72); System.out.println(gradeLevel(68.5)=+gradeLevel(68.5); System.out.println(gradeLevel(60)=+gradeLevel(60); System.out.println(gradeLevel(59.5)=+gradeLevel(59.5); System.out.println(gradeLevel(35)=+gradeLevel(35); ,3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_3,方法的控制流程,17,ex3

14、_3 輸入06之間的某一個(gè)整數(shù),然后把它轉(zhuǎn)換成星期 輸出。(0對(duì)應(yīng)星期日) import java.io.*; public class ex3_3 public static void main(String args)throws IOException int day; BufferedReader in =new BufferedReader( new InputStreamReader(System.in); day=(new Integer(in.readLine().intValue();,3.1.2 switch選擇結(jié)構(gòu)(續(xù))補(bǔ)充ex3_3.java,方法的控制流程,18,sw

15、itch (day) case 0: System.out.println(Sunday); break; case 1: System.out.println(Monday); break; case 2: System.out.println(Tuesday); break; case 3: System.out.println(Wednesday); break; case 4: System.out.println(Thursday); break; case 5: System.out.println(Friday); break; case 6: System.out.printl

16、n(Saturday); break; default: System.out.println(Day out of range Sunday .Saturday ); break; ,3.1.2 switch選擇結(jié)構(gòu)(續(xù))補(bǔ)充ex3_3.java,方法的控制流程,19,for循環(huán)結(jié)構(gòu) 是Java三個(gè)循環(huán)語句中功能較強(qiáng)、使用較廣泛的一個(gè) for循環(huán)可以嵌套 一般語法格式如下 for (start-expression; check-expression; update-expression) /body of the loop; 解釋 start-expression完成循環(huán)變量和其他變量的初

17、始化工作 check-expression是返回布爾值的條件表達(dá)式,用于判斷循環(huán)是否繼續(xù) update-expression用來修整循環(huán)變量,改變循環(huán)條件 三個(gè)表達(dá)式之間用分號(hào)隔開,3.1.3 for循環(huán)結(jié)構(gòu),方法的控制流程,20,For語句的執(zhí)行過程 首先根據(jù)初始表達(dá)式start-expression,完成必要的初始化工作;再判斷表達(dá)式check-expression的值,若為真,則執(zhí)行循環(huán)體 執(zhí)行完循環(huán)體后再返回表達(dá)式update-expression,計(jì)算并修改循環(huán)條件,這樣一輪循環(huán)就結(jié)束了 第二輪循環(huán)從計(jì)算并判斷表達(dá)式check-expression開始,若表達(dá)式的值仍為真,則循環(huán)繼續(xù)

18、,否則跳出整個(gè)for語句執(zhí)行for循環(huán)下面的句子,3.1.3 for循環(huán)結(jié)構(gòu)(續(xù)),方法的控制流程,21,打印九九乘數(shù)表 public class MultiTable public static void main(String args) for (int i=1; i=9;i+) for (int j=1; j=i;j+) System.out.print( +i+*+j+=+i*j); System.out.println(); ,3.1.3 for循環(huán)結(jié)構(gòu)(續(xù)),方法的控制流程,22,運(yùn)行結(jié)果如下: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4

19、4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81,3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))運(yùn)行結(jié)果,23,輸入一個(gè)整數(shù),輸出它所有的因數(shù)

20、import java.io.*; public class ex3_7 public static void main(String args) throws IOException int n,k; BufferedReader in =new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter a positive integer: ); n=(new Integer(in.readLine().intValue(); System.out.print(Number +n+ Factors

21、); for (k=1; k = n; k+) if (n % k = 0) System.out.print(k + ); System.out.println(); ,3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_7.java,方法的控制流程,24,逗號(hào)運(yùn)算符 可用在 for 循環(huán)控制表達(dá)式的初始化和遞增兩部分。在這兩部分中可以存在多個(gè)由逗號(hào)分隔的語句,這些語句會(huì)被依次計(jì)算 public class ex3_8 public static void main(String args) for(int i = 1, j = i + 10; i 5; i+, j = i * 2) System.

22、out.println(i= + i + j= + j); ,3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))逗號(hào)運(yùn)算符,方法的控制流程,25,while語句 實(shí)現(xiàn)“當(dāng)型”循環(huán),其一般語法格式如下: while (check-expression) /body of the loop; 解釋 條件表達(dá)式(check-expression)的返回值為布爾型 循環(huán)體可以是單個(gè)語句,也可以是復(fù)合語句塊 執(zhí)行過程 先判斷check-expression的值,為真則執(zhí)行循環(huán)體 循環(huán)體執(zhí)行完后再無條件轉(zhuǎn)向條件表達(dá)式做計(jì)算與判斷;當(dāng)計(jì)算出條件表達(dá)式的值為假時(shí),跳過循環(huán)體執(zhí)行while語句后面的語句。若為真,則繼續(xù)執(zhí)行循環(huán),

23、3.1.4 while循環(huán)結(jié)構(gòu),方法的控制流程,26,循環(huán)接受并輸出從鍵盤輸入的字符,直到輸入的字符為回車為止 char ch=a; while (ch!=n) System.out.println(ch); ch= (char)System.in.read() ; / 接收鍵盤輸入 ,3.1.4 while循環(huán)結(jié)構(gòu)(續(xù)),方法的控制流程,27,計(jì)算數(shù)列1,2,10 的和。 public class ex3_4 public static void main(String args) int i=1, sum=0; while(i=10) sum+=i; i+; System.out.prin

24、tln(sum=+sum); ,3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_4.java,方法的控制流程,28,計(jì)算存款收益:假設(shè)銀行中存款10000元,按11.25%的利率,一年后連本帶利將變?yōu)?1125元。你若將此款繼續(xù)存入銀行,試問多長(zhǎng)時(shí)間就會(huì)連本帶利翻一番 import java.text.*; public class Examp3_4 public static void main(String args) double original,money,interest; int years = 0; original = money= 10000; interest = 11.

25、25 / 100; System.out.println(year money);,3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4,方法的控制流程,29,while (money 2 * original) years = years + 1; money = money + (interest * money); System.out.println( + years + + new DecimalFormat(0.00).format(money); System.out.println(); System.out.println( 第 + years + 年存款額達(dá)到 + new Deci

26、malFormat(0.00).format(money) + 元。); ,3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4,方法的控制流程,30,運(yùn)行結(jié)果 year money 1 11125.00 2 12376.56 3 13768.93 4 15317.93 5 17041.20 6 18958.33 7 21091.14 第 7 年存款額達(dá)到 21091.14元。,3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4運(yùn)行結(jié)果,方法的控制流程,31,do-while語句 實(shí)現(xiàn)“直到型”循環(huán) 一般語法結(jié)構(gòu)如下 do /body of the loop; while (check-expression

27、); 其使用與while語句很類似,不同的是它首先無條件的執(zhí)行一遍循環(huán)體,再來判斷條件表達(dá)式的值,若表達(dá)式的值為真,則再運(yùn)行循環(huán)體,否則跳出do-while循環(huán),執(zhí)行下面的語句 特點(diǎn):它的循環(huán)體至少要執(zhí)行一次,3.1.5 do-while循環(huán)結(jié)構(gòu),方法的控制流程,32,/ while(i=10) sum+=i; i+; System.out.println (sum=+sum);,/ do sum+=i; i+; while(i=10); System.out.println (sum=+sum);,比較這兩段程序,3.1.5 do-while循環(huán)結(jié)構(gòu)(續(xù)),方法的控制流程,33,輸入一個(gè)整數(shù)

28、,然后輸出它的翻轉(zhuǎn)形式 import java.io.*; public class ex3_5 public static void main(String args)throws IOException int n, right_digit, newnum = 0; BufferedReader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter the number: ); n=(new Integer(in.readLine().intValue(); System.ou

29、t.print(The number in reverse order is ); do right_digit = n % 10; System.out.print(right_digit); n /= 10; while (n != 0); System.out.println(); ,3.1.5 do-while循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_5.java,方法的控制流程,34,功能 跳出循環(huán),不再執(zhí)行剩余部分 適用場(chǎng)合 在switch 結(jié)構(gòu)中,用來終止switch語句的執(zhí)行 在for循環(huán)及while循環(huán)結(jié)構(gòu)中,用于終止break語句所在的最內(nèi)層循環(huán);與標(biāo)號(hào)一同使用時(shí),將跳出標(biāo)號(hào)所標(biāo)識(shí)的循環(huán)

30、也可用在代碼塊中,用于跳出它所指定的塊,3.1.6 break語句,方法的控制流程,35,簡(jiǎn)單break應(yīng)用舉例 public class BreakTest public static void main( String args ) String output = ; int i; for ( i = 1; i = 10; i+ ) if ( i = 5 ) break; / break loop only if count = 5 output += i + ; output += nBroke out of loop at i = + i; System.out.println(out

31、put); ,方法的控制流程,3.1.6 break語句(續(xù))例3_5,36,運(yùn)行結(jié)果 1 2 3 4 Broke out of loop at i = 5 解釋 執(zhí)行break語句時(shí),程序流程跳出for循環(huán),3.1.6 break語句(續(xù))例3_5運(yùn)行結(jié)果,方法的控制流程,37,在嵌套循環(huán)中使用break語句:使用下面的程序來實(shí)現(xiàn)例3-4的九九乘法表 public class Examp3_6 public static void main(String args) for (int i=1; i i) break; System.out.print( +i+*+j+=+i*j); Syst

32、em.out.println(); ,3.1.6 break語句(續(xù))例3_6,方法的控制流程,38,break與label一同使用舉例 public class Examp3_7 public static void main(String args) outer: for (int i=1; i i) break; if (i=6) break outer; System.out.print( +i+*+j+=+i*j); System.out.println(); ,3.1.6 break語句(續(xù))例3_7,方法的控制流程,39,運(yùn)行結(jié)果 1*1=1 2*1=2 2*2=4 3*1=3

33、3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 說明 第一個(gè)break語句跳出內(nèi)層循環(huán) 第二個(gè)break outer語句則跳出標(biāo)號(hào)outer所標(biāo)識(shí)的循環(huán),即外重循環(huán),3.1.6 break語句(續(xù))例3_7運(yùn)行結(jié)果,方法的控制流程,40,continue語句 必須用于循環(huán)結(jié)構(gòu)中 停止本次迭代,回到循環(huán)起始處,開始下一次迭代過程 有兩種使用格式 不帶標(biāo)號(hào)的continue語句 終止當(dāng)前這一輪的循環(huán),跳出本輪循環(huán)剩余的語句,直接進(jìn)入當(dāng)前循環(huán)的下一輪 帶標(biāo)號(hào)的continue語句 使程序的流程直接轉(zhuǎn)入標(biāo)號(hào)

34、標(biāo)明的循環(huán)層次,3.1.7 continue語句,方法的控制流程,41,不帶標(biāo)號(hào)的continue語句 在while或do-while循環(huán)中,會(huì)使流程直接跳轉(zhuǎn)至條件表達(dá)式 在for循環(huán)中,會(huì)使流程跳轉(zhuǎn)至表達(dá)式update-expression,計(jì)算并修改循環(huán)變量后再判斷循環(huán)條件,3.1.7 continue語句(續(xù))不帶標(biāo)號(hào)的continue語句,方法的控制流程,42,簡(jiǎn)單的continue語句舉例 public class ContinueTest public static void main( String args ) String output = ; int i; for ( i

35、= 1; i = 10; i+ ) if ( i = 5 ) continue; / skip remaining code in this loop output += i + ; output += nUsing continue to skip printing 5; output += ni = + i; System.out.println(output); ,3.1.7 continue語句(續(xù))例3_8,方法的控制流程,43,運(yùn)行結(jié)果 1 2 3 4 6 7 8 9 10 Using continue to skip printing 5 i = 11 說明 continue語句

36、并沒有跳出循環(huán)體,而是跳過本次循環(huán),進(jìn)入下一輪循環(huán),3.1.7 continue語句(續(xù))例3_8運(yùn)行結(jié)果,方法的控制流程,44,打印2到9之間的偶數(shù)的平方,但是不包括偶數(shù)6的平方 public class Examp3_9 public static void main (String args) for (int i=2; i=9; i+=2) if (i=6) continue; System.out.println(i*i); ,3.1.7 continue語句(續(xù))例3_9,方法的控制流程,45,帶標(biāo)號(hào)的continue語句 格式如下 continue label; 標(biāo)號(hào)label應(yīng)

37、該定義在程序中某一循環(huán)語句前面,用來標(biāo)志這個(gè)循環(huán)結(jié)構(gòu),3.1.7 continue語句(續(xù))帶標(biāo)號(hào)的continue語句,方法的控制流程,46,九九乘法表也可用下面的程序來實(shí)現(xiàn) public class Examp3_10 public static void main (String args) outer: for (int i=1; i10; i+) inner: for (int j=1; j10; j+) if (ij) System.out.println(); continue outer; System.out.print( +i+*+j+=+i*j); 當(dāng)執(zhí)行到滿足條件ij時(shí)

38、,跳出inner循環(huán),直接跳到outer循環(huán),計(jì)算并修改i的值,進(jìn)行下一輪的循環(huán),3.1.7 continue語句(續(xù))例3_10,方法的控制流程,47,異常處理 在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的。所謂錯(cuò)誤,是在程序運(yùn)行過程中發(fā)生的異常事件,這些事件的發(fā)生將阻止程序的正常運(yùn)行 如何處理錯(cuò)誤?把錯(cuò)誤交給誰去處理?程序又該如何從錯(cuò)誤中恢復(fù)? 為了加強(qiáng)程序的魯棒性,Java語言具有特定的運(yùn)行錯(cuò)誤處理機(jī)制,3.2 異常處理簡(jiǎn)介,48,3.2.1 異常處理的意義,異常的基本概念 又稱為例外,是特殊的運(yùn)行錯(cuò)誤對(duì)象 是面向?qū)ο笠?guī)范的一部分,是異常類的對(duì)象 Java中聲明了很多異常類,每個(gè)異常類都代表

39、了一種運(yùn)行錯(cuò)誤,類中包含了 該運(yùn)行錯(cuò)誤的信息 處理錯(cuò)誤的方法 每當(dāng)Java程序運(yùn)行過程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,即產(chǎn)生一個(gè)異常,異常處理簡(jiǎn)介,49,java處理錯(cuò)誤的方法 拋出(throw)異常 在方法的運(yùn)行過程中,如果發(fā)生了異常,則該方法生成一個(gè)代表該異常的對(duì)象并把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)便尋找相應(yīng)的代碼來處理這一異常 捕獲(catch)異常 運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成異常的方法開始進(jìn)行回溯,直到找到包含相應(yīng)異常處理的方法為止,3.2.1 異常處理的意義(續(xù)),異常處理簡(jiǎn)介,50,3.2.1 異常處理

40、的意義(續(xù))異常處理示意圖,異常處理簡(jiǎn)介,51,Java異常處理機(jī)制的優(yōu)點(diǎn) 將錯(cuò)誤處理代碼從常規(guī)代碼中分離出來 按錯(cuò)誤類型和差別分組 對(duì)無法預(yù)測(cè)的錯(cuò)誤的捕獲和處理 克服了傳統(tǒng)方法的錯(cuò)誤信息有限的問題 把錯(cuò)誤傳播給調(diào)用堆棧,3.2.1 異常處理的意義(續(xù)),異常處理簡(jiǎn)介,52,3.2.2 錯(cuò)誤的概念,錯(cuò)誤 程序運(yùn)行過程中發(fā)生的異常事件 根據(jù)錯(cuò)誤的嚴(yán)重程度不同,可分為兩類 錯(cuò)誤 致命性的,用戶程序無法處理 Error類是所有錯(cuò)誤類的父類 異常 非致命性的,可編制程序捕獲和處理 Exception類是所有異常類的父類,異常處理簡(jiǎn)介,53,再對(duì)異常進(jìn)行分類 非檢查型異常 不能期望程序捕獲的異常(例如數(shù)

41、組越界,除零等) 繼承自RuntimeException 在方法中不需要聲明,編譯器也不進(jìn)行檢查 檢查型異常 其他類型的異常 如果被調(diào)用的方法拋出一個(gè)類型為E的檢查型異常,那么調(diào)用者必須捕獲E或者也聲明拋出E(或者E的一個(gè)父類),對(duì)此編譯器要進(jìn)行檢查,3.2.2 錯(cuò)誤的概念(續(xù)),異常處理簡(jiǎn)介,54,3.2.2 錯(cuò)誤的概念(續(xù))異常和錯(cuò)誤類的層次結(jié)構(gòu),異常處理簡(jiǎn)介,55,Java預(yù)定義的一些常見異常 ArithmeticException 整數(shù)除法中除數(shù)為0 NullPointerException 訪問的對(duì)象還沒有實(shí)例化 NegativeArraySizeException 創(chuàng)建數(shù)組時(shí)元素個(gè)

42、數(shù)是負(fù)數(shù) ArrayIndexOutOfBoundsException 訪問數(shù)組元素時(shí),數(shù)組下標(biāo)越界 ArrayStoreException 程序試圖向數(shù)組中存取錯(cuò)誤類型的數(shù)據(jù) FileNotFoundException 試圖存取一個(gè)并不存在的文件 IOException 通常的I/O錯(cuò)誤,3.2.2 錯(cuò)誤的概念(續(xù))預(yù)定義的一些常見異常,異常處理簡(jiǎn)介,56,測(cè)試系統(tǒng)定義的運(yùn)行異常數(shù)組越界出現(xiàn)的異常 import java.io.*; public class HelloWorld public static void main (String args ) int i = 0; String

43、 greetings = Hello world!, No, I mean it!, HELLO WORLD!; while (i 4) System.out.println (greetingsi); i+; ,3.2.2 錯(cuò)誤的概念(續(xù))例3_11,異常處理簡(jiǎn)介,57,運(yùn)行結(jié)果 Hello world! No, I mean it! HELLO WORLD! Exception in thread main java.lang.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7) 說明 訪問數(shù)組下標(biāo)越界,導(dǎo)

44、致ArrayIndexOutOfBoundsException異常 該異常是系統(tǒng)定義好的類,對(duì)應(yīng)系統(tǒng)可識(shí)別的錯(cuò)誤,所以Java虛擬會(huì)自動(dòng)中止程序的執(zhí)行流程,并新建一個(gè)該異常類的對(duì)象,即拋出數(shù)組出界異常,3.2.2 錯(cuò)誤的概念(續(xù))例3_11運(yùn)行結(jié)果,異常處理簡(jiǎn)介,58,3.2.3 異常的處理,對(duì)于檢查型異常,Java強(qiáng)迫程序必須進(jìn)行處理。處理方法有兩種: 聲明拋出異常 不在當(dāng)前方法內(nèi)處理異常,而是把異常拋出到調(diào)用方法中 捕獲異常 使用trycatch()塊,捕獲到所發(fā)生的異常,并進(jìn)行相應(yīng)的處理,異常處理簡(jiǎn)介,59,聲明拋出異常 如果程序員不想在當(dāng)前方法內(nèi)處理異常,可以使用throws子句聲明將

45、異常拋出到調(diào)用方法中 如果所有的方法都選擇了拋出此異常,最后 JVM將捕獲它,輸出相關(guān)的錯(cuò)誤信息,并終止程序的運(yùn)行。在異常被拋出的過程中, 任何方法都可以捕獲它并進(jìn)行相應(yīng)的處理,3.2.3 異常的處理(續(xù))聲明拋出異常,異常處理簡(jiǎn)介,60,3.2.3 異常的處理(續(xù))一個(gè)例子,public void openThisFile(String fileName) throws java.io.FileNotFoundException /code for method public void getCustomerInfo() throws java.io.FileNotFoundExceptio

46、n / do something this.openThisFile(customer.txt); / do something 如果在openThisFile中拋出了FileNotfoundException異常,getCustomerInfo將停止執(zhí)行,并將此異常傳送給它的調(diào)用者,異常處理簡(jiǎn)介,61,語法格式 try statement(s) catch (exceptiontype name) statement(s) finally statement(s) ,3.2.3 異常的處理(續(xù))捕獲異常,異常處理簡(jiǎn)介,62,說明 try 語句 其后跟隨可能產(chǎn)生異常的代碼塊 catch語句 其

47、后跟隨異常處理語句,通常用到兩個(gè)方法 getMessage() 返回一個(gè)字符串對(duì)發(fā)生的異常進(jìn)行描述。 printStackTrace() 給出方法的調(diào)用序列,一直到異常的產(chǎn)生位置 finally語句 不論在try代碼段是否產(chǎn)生異常,finally 后的程序代碼段都會(huì)被執(zhí)行。通常在這里釋放內(nèi)存以外的其他資源 注意事項(xiàng) 在類層次樹中,一般的異常類型放在后面,特殊的放在前面,3.2.3 異常的處理(續(xù))捕獲異常,異常處理簡(jiǎn)介,63,讀入兩個(gè)整數(shù),第一個(gè)數(shù)除以第二個(gè)數(shù),之后輸出 import java.io.*; public class ExceptionTester public static v

48、oid main(String args) System.out.println(Enter the first number:); int number1 = Keyboard.getInteger(); System.out.println(Enter the second number:); int number2 = Keyboard.getInteger(); System.out.print(number1 + / + number2 + =); int result = number1 / number2; System.out.println(result); ,3.2.3 異

49、常的處理(續(xù))例3_12,異常處理簡(jiǎn)介,64,其中,Keyboard類的聲明如下 import java.io.*; public class Keyboard static BufferedReader inputStream = new BufferedReader (new InputStreamReader(System.in); public static int getInteger() try return (Integer.valueOf(inputStream.readLine().trim().intValue(); catch (Exception e) e.printS

50、tackTrace(); return 0; public static String getString() try return (inputStream.readLine(); catch (IOException e) return 0; ,3.2.3 異常的處理(續(xù))例3_12,異常處理簡(jiǎn)介,65,運(yùn)行結(jié)果 Enter the first number: 140 Enter the second number: abc java.lang.NumberFormatException: abc at java.lang.Integer.parseInt(Integer.java:426

51、) at java.lang.Integer.valueOf(Integer.java:532) at Keyboard.getInteger(Keyboard.java:10) at ExceptionTester.main(ExceptionTester.java:7) 140 / 0=Exception in thread main java.lang.ArithmeticException: / by zero at ExceptionTester.main(ExceptionTester.java:10),3.2.3 異常的處理(續(xù))例3_12運(yùn)行結(jié)果,異常處理簡(jiǎn)介,66,捕獲 Nu

52、mberFormatException類型的異常 import java.io.*; public class ExceptionTester2 public static void main(String args) int number1=0, number2=0; try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.println(Enter the second number:); number2 =

53、Integer.valueOf(Keyboard.getString().intValue(); catch (NumberFormatException e) System.out.println(Those were not proper integers! I quit!); System.exit(-1); System.out.print(number1 + / + number2 + =); int result = number1 / number2; System.out.println(result); ,異常處理簡(jiǎn)介,3.2.3 異常的處理(續(xù))例3_13,67,運(yùn)行結(jié)果

54、Enter the first number: abc Those were not proper integers! I quit!,異常處理簡(jiǎn)介,3.2.3 異常的處理(續(xù))例3_13運(yùn)行結(jié)果,68,捕獲被零除的異常 ( ArithmeticException類型的異常) try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.println(Enter the second number:); number2

55、 = Integer.valueOf(Keyboard.getString().intValue(); result = number1 / number2; catch (NumberFormatException e) System.out.println(Invalid integer entered!); System.exit(-1); catch (ArithmeticException e) System.out.println(Second number is 0, cannot do division!); System.exit(-1); ,異常處理簡(jiǎn)介,3.2.3 異常的

56、處理(續(xù))例3_14,69,運(yùn)行結(jié)果 Enter the first number: 143 Enter the second number: 0 Second number is 0, cannot do division!,異常處理簡(jiǎn)介,3.2.3 異常的處理(續(xù))例3_14運(yùn)行結(jié)果,70,對(duì)程序進(jìn)行改進(jìn):重復(fù)提示輸入,直到輸入合法的數(shù)據(jù)。為了避免代碼重復(fù),可將數(shù)據(jù)存入數(shù)組 import java.io.*; public class ExceptionTester4 public static void main(String args) int result; int number =

57、 new int2; boolean valid; for (int i=0; i2; i+) valid = false; while (!valid) try System.out.println(Enter number +(i+1); numberi=Integer.valueOf(Keyboard.getString().intValue(); valid = true; catch (NumberFormatException e) System.out.println(Invalid integer entered. Please tryagain.); ,異常處理簡(jiǎn)介,3.2.

58、3 異常的處理(續(xù))例3_14改進(jìn),71,try result = number0 / number1; System.out.print(number0 + / + number1 + = + result); catch (ArithmeticException e) System.out.println(Second number is 0, cannot do division!); ,3.2.3 異常的處理(續(xù))例3_14改進(jìn),72,運(yùn)行結(jié)果 Enter number 1 abc Invalid integer entered. Please try again. Enter num

59、ber 1 efg Invalid integer entered. Please try again. Enter number 1 143 Enter number 2 abc Invalid integer entered. Please try again. Enter number 2 40 143 / 40=3,3.2.3 異常的處理(續(xù))例3_14運(yùn)行結(jié)果,73,3.2.4 生成異常對(duì)象,生成異常對(duì)象 三種方式 由Java虛擬機(jī)生成 由Java類庫中的某些類生成 在程序中生成自己的異常對(duì)象,也即是異??梢圆皇浅鲥e(cuò)產(chǎn)生,而是人為地拋出 生成異常對(duì)象都是通過throw語句實(shí)現(xiàn),生成的

60、異常對(duì)象必須是Throwable或其子類的實(shí)例 throw new ThrowableObject(); ArithmeticException e = new ArithmeticException(); throw e;,74,生成異常對(duì)象舉例 class ThrowTest public static void main(String args) try throw new ArithmeticException(); catch(ArithmeticException ae) System.out.println(ae); try throw new ArrayIndexOutOfBo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論